VBA的對(duì)象是有很多共性的,拋開它們所在層次的不同,它們的很多操作特征是一樣的,比如它們都包括子對(duì)象集合,都包括某些激活操作,刪除操作等等。像簡(jiǎn)單的Activate,Delete,Cut類似的操作我就不詳細(xì)說了。下面我先總結(jié)一下這些共性中出鏡率最多的類型:Collection,然后分析一下與之類似的兩種常用類型,總結(jié)它們的不同。選擇集合的時(shí)候,要充分考慮它們的特性和實(shí)際的問題,采用合適的集合解決問題。 1. 集合 定義集合的方法:Dim col as New Collection
小例子如下: Sub TestCollection() Dim col As New Collection With col .Add (0) .Add (1) .Add (2) End With col.Remove (1) MsgBox col.Count Dim i As Variant For Each i In col MsgBox i Next Dim j As Integer For j = 1 To col.Count MsgBox col.Item(j) Next End Sub VBA的很多對(duì)象中都包括集合,但是這些集合中的對(duì)應(yīng)方法已經(jīng)做出了修改,使用時(shí)要注意參數(shù)和返回值。例如Workbooks集合Add方法就返回新添加的Workbook;Worksheets集合Add方法返回新添加的Worksheet?;旧蟽?nèi)置對(duì)象的集合屬性(Application.Workbooks, Workbook.Worksheets等等),Add方法都是用于添加一個(gè)新的成員并返回這個(gè)成員,你可以使用這個(gè)引用繼續(xù)完成相關(guān)的操作。 集合的索引值都是從1開始的。 集合中的元素并不要求類型一樣,但是為了方便處理,通常要求是一樣的。 可以用With減少代碼輸入。 可以用For Each遍歷集合,但是VBA要求元素必須定義成Variant、Object或者自定義的Class類型;而使用For和Item枚舉也很方便。 2. 數(shù)組 看完了集合,我們?cè)倏纯磾?shù)組與集合的對(duì)比。數(shù)組其實(shí)也應(yīng)該算是一個(gè)'集合',那么它與集合有什么不同呢? 先來看看數(shù)組的特性:
從上面其實(shí)已經(jīng)看到了它與集合最主要的不同了:元素類型,長度,下界,維度,效率。 既然說到數(shù)組,那我也總結(jié)一下數(shù)組常用的方式和函數(shù): 賦值的方式 對(duì)于直接定義成數(shù)組的變量,循環(huán)賦值就可以了,但是除了這種方式,還有其它的方式動(dòng)態(tài)生成數(shù)組,那就是可以把變量定義成Variant類型的,然后用這幾種方式動(dòng)態(tài)生成數(shù)組:arr = Array(1,2,3),arr = [A1:A10],或者arr = Split('a,b,c',',')。 Split函數(shù)生成的數(shù)組下標(biāo)始終從0開始,即使是使用了Option Base強(qiáng)制從1開始了也如此。 Array函數(shù)生成的數(shù)組的下標(biāo)是從Option Base定義的下標(biāo)開始。 直接使用單元格賦值這種方式生成的數(shù)組的下標(biāo)是從1開始的,即使是使用了Option Base強(qiáng)制從0開始了也如此。 數(shù)組生成字符串 使用Join函數(shù)就可以了:s = Join(Array('a','b','c'),',');如果數(shù)組類型不是String,則需要先轉(zhuǎn)換一下。 獲取上下界 使用UBound(arr), LBound(arr)獲得上下界。 篩選數(shù)據(jù) 使用Filter(arr,match,include,compare)方法獲得符合條件的數(shù)據(jù),后面兩個(gè)參數(shù)并不是必須的。下面的小例子返回“不”包含“A“字符串的結(jié)果“D E”: Sub testArr() Dim a1 As Variant Dim i As Integer a1 = Array('A', 'BA', 'CA', 'D', 'E') a1 = Filter(a1, 'A', False) MsgBox Join(a1) End Sub Filter過濾是模糊過濾,注意這個(gè)特點(diǎn)。如果需要精確過濾,需要自己寫方法解決。 排序 可以利用內(nèi)置的Large,Small方法實(shí)現(xiàn)數(shù)值類型的排序。非數(shù)值類型,可以使用Worksheet中的Rank輔助排序,也可以自己寫冒泡,快速,選擇,希爾,桶排序等算法。 Sub testArr() Dim a(1 To 5) As Integer Dim b(1 To 5) As String Dim i As Integer a(1) = 111 a(2) = 121 a(3) = 234 a(4) = 11 a(5) = 9 For i = 1 To 5 b(i) = Application.WorksheetFunction.Large(a, i) Next MsgBox Join(b, ',') End Sub 經(jīng)典排序的實(shí)現(xiàn)可參看:http://www./cdb/viewthread.php?tid=13706&fpage=1 取得最大值最小值 使用WorksheetFunction內(nèi)置的最大,最小值函數(shù)即可。 數(shù)組置換 使用內(nèi)置的WorksheetFunction.Transpose函數(shù)。 Public Sub TestTranspose() Dim d(1 To 3) As String d(1) = 'a' d(2) = 'b' d(3) = 'c' [a1].Resize(1, UBound(d)) = d [d1].Resize(UBound(d), 1) = WorksheetFunction.Transpose(d) End Sub Transpose方法用于將一組單元格的行列置換,輸入的參數(shù)要求是數(shù)組格式的。 Transpose方法可以用于將數(shù)組的數(shù)組(數(shù)組的元素是數(shù)組,要求元素?cái)?shù)組長度一致)轉(zhuǎn)換成二維數(shù)組。 Transpose方法返回的類型為Variant,返回的數(shù)組的下界始終為1,即使是使用了Option Base強(qiáng)制定義為其它值也如此。 3. 字典 在很多Collection的不方便處理的情況下,字典常常作為擴(kuò)展手段來使用。字典的含義就不啰嗦了,下面總結(jié)一下字典。 字典的創(chuàng)建方式: 方式一:“后期綁定”,定義一個(gè)Object變量,直接賦值 - Set d = CreateObject('Scripting.Dictionary')。 方式二:“前期綁定”,加入c:\windows\system32\scrrun.dll 引用,然后明確創(chuàng)建類型 - Dim d as New Dictionary 字典的四個(gè)屬性:
字典的六個(gè)方法:
簡(jiǎn)單的看一個(gè)小例子: Public Sub TestDic() Dim d As Object Set d = CreateObject('Scripting.Dictionary') d('A') = 1 d('B') = 2 d('C') = 3 'Change Key d.Key('A') = 'D' 'Change Value d('D') = 5 MsgBox d('D') MsgBox d.Count End Sub VBA中字典具有以下的優(yōu)點(diǎn):添加、刪除元素的速度比Collection要快,避免了大量的循環(huán)與邏輯判斷,可使用的方法也比較多、比較方便。字典的使用也基本上是圍繞這些優(yōu)點(diǎn)展開的,比如:利用Key的唯一性,快速去除重復(fù)的數(shù)據(jù),通常配合Transpose方法可以完成許多這種任務(wù)。 關(guān)于字典的知識(shí),可以參看牛人的詳細(xì)解釋和常用示例:http://www./forum.php?mod=viewthread&tid=145901&highlight=%D7%D6%B5%E4。 快速引用單元格的值使用'[]',例如:arr = [A1]。 |
|