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字符串。如果include是True,Filter返回的是包含match子字符串的數組子集。如果include是False,Filter返回的是不包含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于北京
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!