新四季網

VBA數組入門(VBA數組入門)

2023-11-04 22:04:05 1

VBA數組入門

一、初識數組

1、數組就是一個列表或一組數據表。我們學習數組的目的,就是為了加速我們代碼的效率。

2、我們如何運用數組呢?

首先,必須聲明數組。

其次,給數組賦值,可以是經過一系列的運算後再賦值給數組。

最後,將數組返回到工作表區域中。最終的目的是在工作表中顯示我們想要的結果。

3、調試數組的手段:本地窗口

我們可以通過設置Stop語句,或F8逐步執行代碼,在本地窗口中觀測數組的變化。

Sub test

Dim arrSheetName(5) As String

Stop

End Sub

4、數組的優勢與不足

數組的速度優勢是明顯的,但不足也很明顯,因為,數組處理的都是數據,因此,它不能給EXCEL數據添加顏色,刪除行列,插入行列等等動作。

5、VBA數組沒有內存數組和一般數組之分。我們在聲明數組時,就已經將數組寫入內存裡。

二、聲明數組

1、聲明一個數組變量,也是用Dim語句來聲明。當聲明了一個數組,便決定了這個數組用於存儲數據所用的內存空間。

Dim arrCnt(10) As Integer

Dim arrSheetName(5) As String

Dim arr(7) As Variant

1)、這裡我們看到,與一般定義不同的是多了個帶括號的數字。這個數字,就是這個數組所能存儲的最大元素數。

2)、數組可以根據我們的需要存儲不同類型的數據,這與我們平常變量定義的類型一樣,可以是Integer,Long,String,Variant 等等。

2、注意,上面定義數組的例子是靜態數組,所以,我們在聲明數組時,就決定了數組用於存儲數據所用的內存空間大小。後面我們會講到動態數組。

三、數組的上界和下界

1、VBA中,數組默認的下界是0,也就是Option Base 0

如果,我們習慣了用1作為我們的下界,可以強制聲明:Option Base 1

註:Option Base 0(1)必須放在所有模塊之前。

2、當然,我們也可以忽略這個強制聲明,那我們就需要在聲明數組時,指明數組的上界和下界,如:

Dim arrSheetName(1 to 3) as String

表明這個數組的上下界分別是1和3。

四、靜態數組和動態數組

我們之前所定義的數組,都是靜態數組。靜態數組的特點是具有大小的數組。當我們事先知道數組的大小,那麼,我們可以直接聲明為靜態數組。

如果我們不知道數組大小,那麼我們應定義成動態數組。

1、動態數組是可以改變大小的數組,通過在數組名稱後附帶空括號來聲明,如:

Dim arrSheetName as String

2、在定義動態數組之後,必須使用ReDim來設置動態數組的上界和下界,為數組重新分配存儲空間。

3、我們可以使用ReDim語句反覆地改變數組的元素已經維數。

Sub arr1

Dim arr As Long

Dim i As Long

ReDim arr(1 To 3)

For i = 1 To 3

arr(i) = i

Next

Sheet1.[a1].Resize(1, 3) = arr

Stop

ReDim arr(1 To 10)

For i = 1 To 10

arr(i) = i

Next

Sheet1.[a1].Resize(1, 10) = arr

End Sub

4、ReDim Preserve語句

Preserve 英文的意思是保留,保存。顧名思義,就是重新定義數組時,將數組元素保留在數組中。

與ReDim不同的是,使用了ReDim Preserve,只能通過改變上界,即最末維的大小,來改變數組的大小,且不能改變數組維數。如果改變了下界,就會出現錯誤信息。

例子,見後面的過程Join2。

五、一維數組和多維數組

我們前面所舉的例子都是一維數組,數組可以定義多達60維。

但我們很少看到多過2維的代碼。這也是因為對於Excel的工作表來說,行和列,就是表示2維,我們處理的數據區域很多都是圍繞行和列進行處理。因此,我們只要掌握的二維數組,就掌握了對Excel的數據處理。

下面通過2幅圖來理解二維數組:

1、定義一個二維數組

Dim arrSource(1 to 100, 1 to 10) As Long

2、定義一個三維數組

Dim arrSource(1 To 10, 1 To 6, -1 To 5) As Long

註:我們可以通過節點的多少來判斷數組維數。

六、數組函數

1、Array 函數

返回一個包含數組的 Variant。

Array函數在運行代碼執行期間創建數組,而不必事先知道數組的大小。

Sub Array1

Dim arr As Variant

arr = Array(1, 2, 3)

MsgBox arr(0)

End Sub

2、Lbound、UBound函數

LBound 函數:

返回一個 Long 型數據,其值為指定的數組維可用的最小下標。

UBound 函數:

返回一個 Long 型數據,其值為指定的數組維可用的最大下標。

Sub ULbound1

Dim arr As Variant

arr = Array(1, 2, 3)

MsgBox UBound(arr)

MsgBox LBound(arr)

End Sub

Sub ULbound2

Dim arr(1 To 100, 1 To 10, -1 To 3) As Integer

MsgBox UBound(arr, 1)

MsgBox UBound(arr, 2)

MsgBox LBound(arr, 3)

End Sub

3、Split函數

返回一個下標從零開始的一維數組,它包含指定數目的子字符串。

語法:Split(expression[, delimiter[, limit[, compare]]])

expression

必需的。包含子字符串和分隔符的字符串表達式 。如果expression是一個長度為零的字符串(""),Split則返回一個空數組,即沒有元素和數據的數組。

delimiter

可選的。用於標識子字符串邊界的字符串字符。如果忽略,則使用空格字符(" ")作為分隔符。如果delimiter是一個長度為零的字符串,則返回的數組僅包含一個元素,即完整的 expression字符串。

limit

可選的。要返回的子字符串數,–1表示返回所有的子字符串。

compare

可選的。數字值,表示判別子字符串時使用的比較方式。關於其值,請參閱「設置值」部分。

Sub Split1

Dim strJoin As String

Dim arrSplit As variant

strJoin = "a,b,c"

arrSplit = Split(strJoin, ",")

Sheet1.[a1].Resize(1, 3) = arrSplit

End Sub

4、Join函數

返回一個字符串,該字符串是通過連接某個數組中的多個子字符串而創建的。

語法:Join(sourcearray[, delimiter])

sourcearray

必需的。包含被連接子字符串的一維數組。

delimiter

可選的。在返回字符串中用於分隔子字符串的字符。如果忽略該項,則使用空格(" ")來分隔子字符串。如果delimiter是零長度字符串(""),則列表中的所有項目都連接在一起,中間沒有分隔符。

Sub Join1

Dim strJoin As String

strJoin = Join(Array("a", "b", "c"), ",")

MsgBox strJoin

End Sub

5、Filter函數

返回一個下標從零開始的數組,該數組包含基於指定篩選條件的一個字符串數組的子集。

語法:Filter(sourcesrray, match[, include[, compare]])

sourcearray

必需的。要執行搜索的一維字符串數組。

match

必需的。要搜索的字符串。

include

可選的。Boolean值,表示返回子串包含還是不包含match字符串。如果includeTrueFilter返回的是包含match子字符串的數組子集。如果includeFalseFilter返回的是不包含match子字符串的數組子集。

compare

可選的。數字值,表示所使用的字符串比較類型。有關其設置,請參閱下面的「設置值」部分。

『查找2數組的差集

Sub Filter1

Dim varArr1 As Variant

Dim varArr2 As Variant

Dim i As Integer

varArr2 = Array(1021, 1023, 1025)

varArr1 = Array(1021, 1022, 1023, 1024, 1025, 1026, 1027, 1028)

For i = 0 To UBound(varArr2)

varArr1 = VBA.Filter(varArr1, varArr2(i), False)

Next i

MsgBox Join(varArr1)

End Sub

注意,filter函數在此是模糊查找,下面代碼將無法返回我們想要的值

Sub Filter1

Dim varArr1 As Variant

Dim varArr2 As Variant

Dim i As Integer

varArr2 = Array(10, 1023, 1025)

varArr1 = Array(1021, 1022, 1023, 1024, 1025, 1026, 1027, 1028)

For i = 0 To UBound(varArr2)

varArr1 = VBA.Filter(varArr1, varArr2(i), False)

Next i

MsgBox Join(varArr1)

End Sub

七、釋放數組

在某些情況下,我們根據需要來釋放數組來重新定義數組,或避免數據堆棧。

Erase語句

重新初始化大小固定的數組元素,以及釋放動態數組的存儲空間。即,Erase可以刪除靜態數組和動態數組裡的數據元素。

Sub Erase1

Dim arr(1 To 100) As Integer

arr(1) = 1

MsgBox arr(1)

MsgBox UBound(arr)

Erase arr

MsgBox arr(1)

MsgBox UBound(arr)

End Sub

從上面的代碼中,我們可以看到,Erase語句用於清除數組元素,對靜態數組維數和上標是沒有改變的。

而對於動態數組,Erase 語句在釋放動態數組所使用的內存後。在下次引用該動態數組之前,程序必須使用 ReDim 語句來重新定義該數組變量的維數。

Sub Erase2

Dim arr As Integer

ReDim arr(1 To 100)

arr(1) = 1

MsgBox arr(1)

MsgBox UBound(arr)

Erase arr

'ReDim arr(1 To 10)

MsgBox arr(1)

MsgBox UBound(arr)

End Sub

八、數組與單元格區域

通過上面的幾個概念,我們明白了數組的定義、賦值。我們最終的目的是通過數組來操作工作表區域中的數據,下面我們通過幾個例子來進一步理解數組。

1、將單元格區域賦值給數組

見過程RangeArray1,RangeArray2,RangeArray3

2、拆分合併特定單元格數據

見過程 Split2,Join2,Split3

3、維數轉置

見過程RangeArray4

九、數組實例

1、提取不重複數據。見UniqueData過程

2、轉置數據區域。 見TransposeData過程

上面就是我們入門數組需要學習和理解的內容,謝謝大家!

HOmT398 2007.8.31於北京

,
同类文章
葬禮的夢想

葬禮的夢想

夢見葬禮,我得到了這個夢想,五個要素的五個要素,水火只好,主要名字在外面,職業生涯良好,一切都應該對待他人治療誠意,由於小,吉利的冬天夢想,秋天的夢是不吉利的
找到手機是什麼意思?

找到手機是什麼意思?

找到手機是什麼意思?五次選舉的五個要素是兩名士兵的跡象。與他溝通很好。這是非常財富,它擅長運作,職業是仙人的標誌。單身男人有這個夢想,主要生活可以有人幫忙
我不怎麼想?

我不怎麼想?

我做了什麼意味著看到米飯烹飪?我得到了這個夢想,五線的主要土壤,但是Tu Ke水是錢的跡象,職業生涯更加真誠。他真誠地誠實。這是豐富的,這是夏瑞的巨星
夢想你的意思是什麼?

夢想你的意思是什麼?

你是什​​麼意思夢想的夢想?夢想,主要木材的五個要素,水的跡象,主營業務,主營業務,案子應該抓住魅力,不能疏忽,春天夢想的吉利夢想夏天的夢想不幸。詢問學者夢想
拯救夢想

拯救夢想

拯救夢想什麼意思?你夢想著拯救人嗎?拯救人們的夢想有一個現實,也有夢想的主觀想像力,請參閱週宮官方網站拯救人民夢想的詳細解釋。夢想著敵人被拯救出來
2022愛方向和生日是在[質量個性]中

2022愛方向和生日是在[質量個性]中

[救生員]有人說,在出生88天之前,胎兒已經知道哪天的出生,如何有優質的個性,將走在什麼樣的愛情之旅,將與生活生活有什么生活。今天
夢想切割剪裁

夢想切割剪裁

夢想切割剪裁什麼意思?你夢想切你的手是好的嗎?夢想切割手工切割手有一個真正的影響和反應,也有夢想的主觀想像力。請參閱官方網站夢想的細節,以削減手
夢想著親人死了

夢想著親人死了

夢想著親人死了什麼意思?你夢想夢想你的親人死嗎?夢想有一個現實的影響和反應,還有夢想的主觀想像力,請參閱夢想世界夢想死亡的親屬的詳細解釋
夢想搶劫

夢想搶劫

夢想搶劫什麼意思?你夢想搶劫嗎?夢想著搶劫有一個現實的影響和反應,也有夢想的主觀想像力,請參閱週恭吉夢官方網站的詳細解釋。夢想搶劫
夢想缺乏缺乏紊亂

夢想缺乏缺乏紊亂

夢想缺乏缺乏紊亂什麼意思?你夢想缺乏異常藥物嗎?夢想缺乏現實世界的影響和現實,還有夢想的主觀想像,請看官方網站的夢想組織缺乏異常藥物。我覺得有些東西缺失了