借花獻佛: 一、定義字典 Set d = CreateObject("Scripting.Dictionary") 二、呼之即來,揮之即去 d("張三“)=1 '相當於給字典賦值,張三過來(沒有就生成)拿個1站一邊去 d("李四”)=2 '相當於給字典賦值,李四過來(沒有就生成)拿個2站一邊去 d("李四”)=3 '相當於改變值,字典中已經有李四了,李四跑過來,丟下2換個3站一邊去 注:這時字典中有兩個人的存在,張三=1 和 李四=3,相當於實現了去重復的功能 s=d("張三") 's=1 即叫了聲張三,張三就告訴你他拿的是1 s=d("李四") 's=3 即叫了聲李四,李四就告訴你他拿的是3 s=d("麻子") 's="" 沒有找到麻子怎么辦呢,字典里就自動生成一個麻子d("麻子") =“”,告訴你他手上是空的 注:這時字典中有三個人的存在,張三=1 ; 李四=3;麻子=“” 三、將字典里的東西變成數組 arr= d.Keys '把名字的集合按先來后到的原則放到一維數組里 arr(0)=“張三” ; arr(1)=“李四” ; arr(2)=“麻子” arr1=d.Items '把名字對應的值的集合按先來后到的原則放到一維數組里 arr1(0)=“1” ; arr1(1)=“3” ; arr1(2)=“” 四、查找字典中有沒有這個人 s=d.Exists(“張三”) 's=True 有的 s=d.Exists(“彭希遴”) 's=False 沒有 五、清空數組 d.RemoveAll |
字典對象只有4個屬性和6個方法,相對其它的對象要簡潔得多,而且容易理解使用方便,功能強大,運行速度非常快,效率極高。深受大家的喜愛。
字典對象相當於一種聯合數組,它是由具有唯一性的關鍵字(Key)和它的項(Item)聯合組成。
常用關鍵字英漢對照:
Dictionary 字典
Key 關鍵字
Item 項,或者譯為 條目
字典對象的方法有6個:Add方法、Keys方法、Items方法、Exists方法、Remove方法、RemoveAll方法。
Add方法
向 Dictionary 對象中添加一個關鍵字項目對。
object.Add (key, item)
參數
object
必選項。總是一個 Dictionary 對象的名稱。
key
必選項。與被添加的 item 相關聯的 key。
item
必選項。與被添加的 key 相關聯的 item。
說明
如果 key 已經存在,那么將導致一個錯誤。
常用語句:
Dim d
Set d = CreateObject("Scripting.Dictionary")
d.Add "a", "Athens"
d.Add "b", "Belgrade"
d.Add "c", "Cairo"
代碼詳解
1、Dim d :創建變量,也稱為聲明變量。變量d聲明為可變型數據類型(Variant),d后面沒有寫數據類型,默認就是可變型數據類型(Variant)。也有寫成Dim d As Object的,聲明為對象。
2、Set d = CreateObject("Scripting.Dictionary"):創建字典對象,並把字典對象賦給變量d。這是最常用的一句代碼。所謂的“后期綁定”。用了這句代碼就不用先引用c:\windows\system32\scrrun.dll了。
3、d.Add "a", "Athens":添加一關鍵字”a”和對應於它的項”Athens”。
4、d.Add "b", “Belgrade”:添加一關鍵字”b”和對應於它的項”Belgrade”。
5、d.Add "c", “Cairo”:添加一關鍵字”c”和對應於它的項”Cairo”。
Exists方法
如果 Dictionary 對象中存在所指定的關鍵字則返回 true,否則返回 false。
object.Exists(key)
參數
object
必選項。總是一個 Dictionary 對象的名稱。
key
必選項。需要在 Dictionary 對象中搜索的 key 值。
常用語句:
Dim d, msg$
Set d = CreateObject("Scripting.Dictionary")
d.Add "a", "Athens"
d.Add "b", "Belgrade"
d.Add "c", "Cairo"
If d.Exists("c") Then
msg = "指定的關鍵字已經存在。"
Else
msg = "指定的關鍵字不存在。"
End If
代碼詳解
1、Dim d, msg$ :聲明變量,d見前例;msg$ 聲明為字符串數據類型(String),一般寫法為Dim msg As String。String 的類型聲明字符為美元號 ($)。
2、If d.Exists("c") Then:如果字典中存在關鍵字”c”,那么執行下面的語句。
3、msg = "指定的關鍵字已經存在。" :把"指定的關鍵字已經存在。"字符串賦給變量msg。
4、Else :否則執行下面的語句。
5、msg = "指定的關鍵字不存在。" :把"指定的關鍵字不存在。"字符串賦給變量msg。
6、End If :結束If …Else…Endif判斷。
Keys方法
返回一個數組,其中包含了一個 Dictionary 對象中的全部現有的關鍵字。
object.Keys( )
其中 object 總是一個 Dictionary 對象的名稱。
常用語句:
Dim d, k
Set d = CreateObject("Scripting.Dictionary")
d.Add "a", "Athens"
d.Add "b", "Belgrade"
d.Add "c", "Cairo"
k=d.Keys
[B1].Resize(d.Count,1)=Application.Transpose(k)
代碼詳解
1、Dim d, k :聲明變量,d見前例;k默認是可變型數據類型(Variant)。
2、k=d.Keys:把字典中存在的所有的關鍵字賦給變量k。得到的是一個一維數組,下限為0,上限為d.Count-1。這是數組的默認形式。
3、[B1].Resize(d.Count,1)=Application.Transpose(k) :這句代碼是很常用很經典的代碼,所以這里要多說一些。
Resize是Range對象的一個屬性,用於調整指定區域的大小,它有兩個參數,第一個是行數,本例是d.Count,指的是字典中關鍵字的數量,整本字典中有多少個關鍵字,本例d.Count=3,因為有3個關鍵字。呵呵,是不是說多了。
第二個是列數,本例是1。這樣=左邊的意思就是:把一個單元格B1調整為以B1開始的一列單元格區域,行數等於字典中關鍵字的數量d.Count,就是把單元格B1調整為單元格區域B1:B3了。
=右邊的k是個一維數組,是水平排列的,我們知道Excel工作表函數里面有個轉置函數Transpose,用它可以把水平排列的置換成豎向排列。但是在VBA中不能直接使用該工作表函數,需要通過Application對象的WorksheetFunction屬性來使用它。所以完整的寫法是Application. WorksheetFunction.Transpose(k),中間的WorksheetFunction可省略。現在可以解釋這句代碼了:把字典中所有的關鍵字賦給以B1單元格開始的單元格區域中。
Items方法
返回一個數組,其中包含了一個 Dictionary 對象中的所有項目。
object.Items( )
其中 object 總是一個 Dictionary 對象的名稱。
常用語句:
Dim d, t
Set d = CreateObject("Scripting.Dictionary")
d.Add "a", "Athens"
d.Add "b", "Belgrade"
d.Add "c", "Cairo"
t=d.Items
[C1].Resize(d.Count,1)=Application.Transpose(t)
代碼詳解
1、Dim d, t :聲明變量,d見前例;t默認是可變型數據類型(Variant)。
2、t=d.Items :把字典中所有的關鍵字對應的項賦給變量t。得到的也是一個一維數組,下限為0,上限為d.Count-1。這是數組的默認形式。
3、[C1].Resize(d.Count,1)=Application.Transpose(t) :有了上面Keys方法的解釋這句代碼就不用多說了,就是把字典中所有的關鍵字對應的項賦給以C1單元格開始的單元格區域中。
Remove方法
Remove 方法從一個 Dictionary 對象中清除一個關鍵字,項目對。
object.Remove(key )
其中 object 總是一個 Dictionary 對象的名稱。
key
必選項。key 與要從 Dictionary 對象中刪除的關鍵字,項目對相關聯。
說明
如果所指定的關鍵字,項目對不存在,那么將導致一個錯誤。
常用語句:
Dim d
Set d = CreateObject("Scripting.Dictionary")
d.Add "a", "Athens"
d.Add "b", "Belgrade"
d.Add "c", "Cairo"
……
d.Remove(“b”)
代碼詳解
1、d.Remove(“b”):清除字典中”b”關鍵字和與它對應的項。清除之后,現在字典里只有2個關鍵字了。
RemoveAll方法
RemoveAll 方法從一個 Dictionary 對象中清除所有的關鍵字,項目對。
object.RemoveAll( )
其中 object 總是一個 Dictionary 對象的名稱。
常用語句:
Dim d
Set d = CreateObject("Scripting.Dictionary")
d.Add "a", "Athens"
d.Add "b", "Belgrade"
d.Add "c", "Cairo"
……
d.RemoveAll
代碼詳解
1、d.RemoveAll:清除字典中所有的數據。也就是清空這字典,然后可以添加新的關鍵字和項,形成一本新字典。
字典對象的屬性有4個:Count屬性、Key屬性、Item屬性、CompareMode屬性。
Count屬性
返回一個Dictionary 對象中的項目數。只讀屬性。
object.Count
其中 object一個字典對象的名稱。
常用語句:
Dim d,n%
Set d = CreateObject("Scripting.Dictionary")
d.Add "a", "Athens"
d.Add "b", "Belgrade"
d.Add "c", "Cairo"
n = d.Count
代碼詳解
1、Dim d, n% :聲明變量,d見前例;n被聲明為整型數據類型(Integer)。一般寫法為Dim n As Integer 。 Integer 的類型聲明字符為百分比號 (%)。
2、n = d.Count :把字典中所有的關鍵字的數量賦給變量n。本例得到的是3。
Key屬性
在 Dictionary 對象中設置一個 key。
object.Key(key) = newkey
參數:
object
必選項。總是一個字典 (Dictionary) 對象的名稱。
key
必選項。被改變的 key 值。
newkey
必選項。替換所指定的 key 的新值。
說明
如果在改變一個 key 時沒有發現該 key,那么將創建一個新的 key 並且其相關聯的 item 被設置為空。
常用語句:
Dim d
Set d = CreateObject("Scripting.Dictionary")
d.Add "a", "Athens"
d.Add "b", "Belgrade"
d.Add "c", "Cairo"
d.Key("c") = "d"
代碼詳解
1、d.Key("c") = "d" :用新的關鍵字”d”來替換指定的關鍵字”c”,這時,字典中就沒有關鍵字c了,只有關鍵字d了,與d對應的項是”Cairo”。
Item屬性
在一個 Dictionary 對象中設置或者返回所指定 key 的 item。對於集合則根據所指定的 key 返回一個 item。讀/寫。
object.Item(key)[ = newitem]
參數
object
必選項。總是一個Dictionary 對象的名稱。
key
必選項。與要被查找或添加的 item 相關聯的 key。
newitem
可選項。僅適用於 Dictionary 對象;newitem 就是與所指定的 key 相關聯的新值。
說明
如果在改變一個 key 的時候沒有找到該 item,那么將利用所指定的 newitem 創建一個新的 key。如果在試圖返回一個已有項目的時候沒有找到 key,那么將創建一個新的 key 且其相關的項目被設置為空。
常用語句:
Dim d
Set d = CreateObject("Scripting.Dictionary")
d.Add "a", "Athens"
d.Add "b", "Belgrade"
d.Add "c", "Cairo"
MsgBox d.Item("c")
代碼詳解
1、d.Item("c") :獲取指定的關鍵字”c”對應的項。
2、MsgBox :是一個VBA函數,用消息框顯示。如果要詳細了解MsgBox函數的,可參見我的另一篇文章“常用VBA函數精選合集”。http://club.excelhome.net/thread-387253-1-1.html
CompareMode屬性
設置或者返回在 Dictionary 對象中進行字符串關鍵字比較時所使用的比較模式。
object.CompareMode[ = compare]
參數
object
必選項。總是一個 Dictionary 對象的名稱。
compare
可選項。如果提供了此項,compare 就是一個代表比較模式的值。可以使用的值是 0 (二進制)、1 (文本), 2 (數據庫)。
說明
如果試圖改變一個已經包含有數據的 Dictionary 對象的比較模式,那么將導致一個錯誤。
常用語句:
Dim d
Set d = CreateObject("Scripting.Dictionary")
d.CompareMode = vbTextCompare
d.Add "a", "Athens"
d.Add "b", "Belgrade"
d.Add "c", "Cairo"
d.Add " B ", " Baltimore"
代碼詳解
1、d.CompareMode = vbTextCompare :設置字典的比較模式是文本,在這種比較模式下不區分關鍵字的大小寫,即關鍵字”b”和”B”是一樣的。vbTextCompare的值為1,所以上式也可寫為 d.CompareMode =1 。如果設置為vbBinaryCompare(值為0),則執行二進制比較,即區分關鍵字的大小寫,此種情況下關鍵字”b”和”B”被認為是不一樣的。
2、d.Add " B ", " Baltimore" :添加一關鍵字”B”和對應於它的項”Baltimore”。由於前面已經設置了比較模式為文本模式,不區分關鍵字的大小寫,即關鍵字”b”和”B”是一樣的,此時發生錯誤添加失敗,因為字典中已經存在”b”了,字典中的關鍵字是唯一的,不能添加重復的關鍵字。