在我們的學(xué)習(xí)生涯中缩功,每個(gè)人或多或少地都用過字典,像新華字典都办,英語字典等等嫡锌,所以想必對字典都有印象。我們可以回顧一下琳钉,自己是怎么使用字典的势木?是不是先去檢字表查找我們需要解釋的字,然后再去字典正文去查找那個(gè)字的意思歌懒。
在VBA中啦桌,也有這么一個(gè)字典,它也像我們用過的紙質(zhì)字典一樣及皂,用鍵值對(key:item)來表示甫男。鍵可以理解為新華字典檢字表中的關(guān)鍵字,而值呢可以理解為對關(guān)鍵字的解釋验烧。它也是VBA種的一種對象板驳。
在VBA字典中,有4個(gè)屬性和6種方法噪窘,相對其它的對象要簡潔得多笋庄,而且容易理解,使用方便倔监,功能強(qiáng)大直砂,運(yùn)行速度非常快浩习,效率極高静暂,深受大家的喜愛。
接下來谱秽,我們來分別熟悉一下這些屬性和方法洽蛀。
1. 方法
1.1 Add
向Dictionary對象中添加一個(gè)關(guān)鍵字項(xiàng)目對。
object.Add (key,item)
參數(shù)
object必選項(xiàng)疟赊〗脊總是一個(gè)Dictionary對象的名稱。
key必選項(xiàng)近哟。與被添加的item相關(guān)聯(lián)的key驮审。
item必選項(xiàng)。與被添加的key相關(guān)聯(lián)的item。
說明
如果key已經(jīng)存在疯淫,那么將導(dǎo)致一個(gè)錯(cuò)誤地来。
常用語句:
Dim dic
Set dic = CreateObject("Scripting.Dictionary")
dic.Add "a", "蘋果"
dic.Add "b", "香蕉"
dic.Add "c", "雪梨"
代碼詳解
1、Dim dic:創(chuàng)建變量熙掺,也稱為聲明變量未斑。變量dic聲明為可變型數(shù)據(jù)類型(Variant),dic后面沒有寫數(shù)據(jù)類型币绩,默認(rèn)就是可變型數(shù)據(jù)類型(Variant)蜡秽。也有寫成Dim dic As Object的,聲明為對象缆镣。
2载城、Set dic = CreateObject("Scripting.Dictionary"):創(chuàng)建字典對象,并把字典對象賦給變量dic费就。
3诉瓦、dic.Add "a", "蘋果":添加一關(guān)鍵字”a”和對應(yīng)于它的項(xiàng)”蘋果”。
4力细、dic.Add "b", "香蕉":添加一關(guān)鍵字”b”和對應(yīng)于它的項(xiàng)”香蕉”睬澡。
5、dic.Add "c", "雪梨":添加一關(guān)鍵字”c”和對應(yīng)于它的項(xiàng)”雪梨”眠蚂。
1.2 Exists
如果Dictionary對象中存在所指定的關(guān)鍵字則返回true煞聪,否則返回false。
object.Exists(key)
參數(shù)
object必選項(xiàng)逝慧∥舾總是一個(gè)Dictionary對象的名稱。
key必選項(xiàng)笛臣。需要在Dictionary對象中搜索的key值云稚。
常用語句:
Dim dic, msg$
Set dic = CreateObject("Scripting.Dictionary")
dic.Add "a", "蘋果"
dic.Add "b", "香蕉"
dic.Add "c", "雪梨"
If dic.Exists("c") Then
msg = "指定的關(guān)鍵字已經(jīng)存在。"
Else
msg = "指定的關(guān)鍵字不存在沈堡。"
End If
代碼詳解
1静陈、Dim dic, msg$:聲明變量,dic見前例诞丽;msg$聲明為字符串?dāng)?shù)據(jù)類型(String)鲸拥,一般寫法為Dim msg As String。String的類型聲明字符為美元號(hào)($)僧免。
2刑赶、If dic.Exists("c") Then:如果字典中存在關(guān)鍵字”c”,那么執(zhí)行下面的語句懂衩。
3撞叨、msg = "指定的關(guān)鍵字已經(jīng)存在呛伴。":把"指定的關(guān)鍵字已經(jīng)存在。"字符串賦給變量msg谒所。
4、Else:否則執(zhí)行下面的語句沛申。
5劣领、msg = "指定的關(guān)鍵字不存在。":把"指定的關(guān)鍵字不存在铁材。"字符串賦給變量msg尖淘。
6、End If:結(jié)束If …Else…End if判斷著觉。
1.3 Keys
返回一個(gè)數(shù)組村生,其中包含了一個(gè) Dictionary 對象中的全部現(xiàn)有的關(guān)鍵字。
object.Keys
其中 object 總是一個(gè) Dictionary 對象的名稱饼丘。
常用語句:
Dim dic, k
Set dic = CreateObject("Scripting.Dictionary")
dic.Add "a", "蘋果"
dic.Add "b", "香蕉"
dic.Add "c", "雪梨"
k=dic.Keys
[A1].Resize(dic.Count,1)=Application.Transpose(k)
代碼詳解
1趁桃、Dim dic, k :聲明變量,dic見前例肄鸽;k默認(rèn)是可變型數(shù)據(jù)類型(Variant)卫病。
2、k=dic.Keys:把字典中存在的所有的關(guān)鍵字賦給變量k典徘。得到的是一個(gè)一維數(shù)組蟀苛,下限為0,上限為d.Count-1逮诲。這是數(shù)組的默認(rèn)形式帜平。
3、[A1].Resize(dic.Count,1)=Application.Transpose(k) :Resize是Range對象的一個(gè)屬性梅鹦,用于調(diào)整指定區(qū)域的大小裆甩,它有兩個(gè)參數(shù),第一個(gè)是行數(shù)齐唆,本例是dic.Count淑掌,指的是字典中關(guān)鍵字的數(shù)量,整本字典中有多少個(gè)關(guān)鍵字蝶念,本例dic.Count=3抛腕,因?yàn)橛?個(gè)關(guān)鍵字。
第二個(gè)是列數(shù)媒殉,本例是1担敌。這樣=左邊的意思就是:把一個(gè)單元格A1調(diào)整為以A1開始的一列單元格區(qū)域,行數(shù)等于字典中關(guān)鍵字的數(shù)量d.Count廷蓉,就是把單元格A1調(diào)整為單元格區(qū)域A1:A3了全封。
=右邊的k是個(gè)一維數(shù)組马昙,是水平排列的,我們知道Excel工作表函數(shù)里面有個(gè)轉(zhuǎn)置函數(shù)Transpose刹悴,用它可以把水平排列的置換成豎向排列行楞。但是在VBA中不能直接使用該工作表函數(shù),需要通過Application對象的WorksheetFunction屬性來使用它土匀。所以完整的寫法是Application. WorksheetFunction.Transpose(k)子房,中間的WorksheetFunction可省略。現(xiàn)在可以解釋這句代碼了:把字典中所有的關(guān)鍵字賦給以B1單元格開始的單元格區(qū)域中就轧。
1.4 Items
返回一個(gè)數(shù)組证杭,其中包含了一個(gè) Dictionary 對象中的所有項(xiàng)目。
object.Items
其中 object 總是一個(gè) Dictionary 對象的名稱妒御。
常用語句:
Dim dic, t
Set dic = CreateObject("Scripting.Dictionary")
dic.Add "a", "蘋果"
dic.Add "b", "香蕉"
dic.Add "c", "雪梨"
t=dic.Items
[B1].Resize(d.Count,1)=Application.Transpose(t)
代碼詳解
1解愤、Dim dic, t :聲明變量,dic見前例乎莉;t默認(rèn)是可變型數(shù)據(jù)類型(Variant)送讲。
2、t=dic.Items :把字典中所有的關(guān)鍵字對應(yīng)的項(xiàng)賦給變量t惋啃。得到的也是一個(gè)一維數(shù)組李茫,下限為0,上限為d.Count-1肥橙。這是數(shù)組的默認(rèn)形式魄宏。
3、[B1].Resize(d.Count,1)=Application.Transpose(t) :有了上面Keys方法的解釋這句代碼就不用多說了存筏,就是把字典中所有的關(guān)鍵字對應(yīng)的項(xiàng)賦給以B1單元格開始的單元格區(qū)域中宠互。
1.5 Remove
Remove 方法從一個(gè) Dictionary 對象中清除一個(gè)關(guān)鍵字,項(xiàng)目對椭坚。
object.Remove(key )
其中 object 總是一個(gè) Dictionary 對象的名稱予跌。
key必選項(xiàng)。key 與要從 Dictionary 對象中刪除的關(guān)鍵字善茎,項(xiàng)目對相關(guān)聯(lián)券册。
說明
如果所指定的關(guān)鍵字,項(xiàng)目對不存在垂涯,那么將導(dǎo)致一個(gè)錯(cuò)誤烁焙。
常用語句:
Dim dic
Set dic = CreateObject("Scripting.Dictionary")
dic.Add "a", "蘋果"
dic.Add "b", "香蕉"
dic.Add "c", "雪梨"
……
d.Remove(“b”)
代碼詳解
1、d.Remove(“b”):清除字典中”b”關(guān)鍵字和與它對應(yīng)的項(xiàng)耕赘。清除之后,現(xiàn)在字典里只有2個(gè)關(guān)鍵字了骄蝇。
1.6 RemoveAll
RemoveAll 方法從一個(gè) Dictionary 對象中清除所有的關(guān)鍵字,項(xiàng)目對操骡。
object.RemoveAll
其中 object 總是一個(gè) Dictionary 對象的名稱九火。
常用語句:
Dim d
Set dic = CreateObject("Scripting.Dictionary")
dic.Add "a", "蘋果"
dic.Add "b", "香蕉"
dic.Add "c", "雪梨"
……
d.RemoveAll
代碼詳解
1赚窃、d.RemoveAll:清除字典中所有的數(shù)據(jù)。也就是清空這字典岔激,然后可以添加新的關(guān)鍵字和項(xiàng)勒极,形成一本新字典。
2.屬性
2.1 count
返回一個(gè)Dictionary 對象中的條目數(shù)虑鼎。只讀屬性辱匿。
object.Count
其中 object是一個(gè)字典對象的名稱。
常用語句:
Dim dic,i%
Set dic = CreateObject("Scripting.Dictionary")
dic.Add "1", "蘋果"
dic.Add "2", "香蕉"
dic.Add "3", "雪梨"
i = dic.Count
代碼詳解
1震叙、Dim dic, i% :聲明變量;n被聲明為整型數(shù)據(jù)類型(Integer)散休。一般寫法為Dim i As Integer 媒楼。 Integer 的類型聲明字符為百分比號(hào) (%)。
2戚丸、i = dic.Count :把字典中所有的關(guān)鍵字的數(shù)量賦給變量n划址。本例得到的是3。
2.2 key
在Dictionary對象中設(shè)置一個(gè)key限府。
object.Key(key) =newkey
參數(shù):object必選項(xiàng)夺颤。總是一個(gè)字典(Dictionary)對象的名稱胁勺。
key,必選項(xiàng)世澜。被改變的key值。
newkey,必選項(xiàng)署穗。替換所指定的key的新值寥裂。
說明:如果在改變一個(gè)key時(shí)沒有發(fā)現(xiàn)該key,那么將創(chuàng)建一個(gè)新的key并且其相關(guān)聯(lián)的item被設(shè)置為空案疲。
常用語句:
Dim dic
Set dic = CreateObject("Scripting.Dictionary")
dic.Add "1", "蘋果"
dic.Add "2", "香蕉"
dic.Add "3", "雪梨"
d.Key("1") = "4"
代碼詳解:
1封恰、d.Key("1") = "4":用新的關(guān)鍵字”4”來替換指定的關(guān)鍵字”1”,這時(shí)褐啡,字典中就沒有關(guān)鍵字1了诺舔,只有關(guān)鍵字4了,與4對應(yīng)的項(xiàng)是”蘋果”备畦。
2.3 item
在一個(gè)Dictionary對象中設(shè)置或者返回所指定key的item低飒。對于集合則根據(jù)所指定的key返回一個(gè)item。讀/寫懂盐。
object.Item(key)[ =newitem]
參數(shù)
object 必選項(xiàng)逸嘀。總是一個(gè)Dictionary 對象的名稱允粤。
key必選項(xiàng)崭倘。與要被查找或添加的
item相關(guān)聯(lián)的key翼岁。
newitem可選項(xiàng)。僅適用于Dictionary對象司光;newitem就是與所指定的key相關(guān)聯(lián)的新值琅坡。
說明
如果在改變一個(gè)key的時(shí)候沒有找到該item,那么將利用所指定的newitem創(chuàng)建一個(gè)新的key残家。如果在試圖返回一個(gè)已有項(xiàng)目的時(shí)候沒有找到key榆俺,那么將創(chuàng)建一個(gè)新的key且其相關(guān)的項(xiàng)目被設(shè)置為空。
常用語句:
Dim dic
Set dic = CreateObject("Scripting.Dictionary")
dic.Add "1", "蘋果"
dic.Add "2", "香蕉"
dic.Add "3", "雪梨"
MsgBox dic.Item("3")
代碼詳解
1坞淮、dic.Item("3"):獲取指定的關(guān)鍵字”3”對應(yīng)的項(xiàng)茴晋。
2、MsgBox :是一個(gè)VBA函數(shù)回窘,用消息框顯示诺擅。
2.4 CompareMode屬性
設(shè)置或者返回在Dictionary對象中進(jìn)行字符串關(guān)鍵字比較時(shí)所使用的比較模式。
object.CompareMode[ =compare]
參數(shù)
object必選項(xiàng)啡直∷赣浚總是一個(gè)Dictionary對象的名稱。
compare可選項(xiàng)酒觅。如果提供了此項(xiàng)撮执,compare就是一個(gè)代表比較模式的值∠系ぃ可以使用的值是0 (二進(jìn)制)抒钱、1 (文本), 2 (數(shù)據(jù)庫)。
說明
如果試圖改變一個(gè)已經(jīng)包含有數(shù)據(jù)的Dictionary對象的比較模式颜凯,那么將導(dǎo)致一個(gè)錯(cuò)誤继效。
常用語句:
Dim dic
Set dic = CreateObject("Scripting.Dictionary")
dic.CompareMode = vbTextCompare
dic.Add "a", "蘋果"
dic.Add "b", "香蕉"
dic.Add "c", "雪梨"
dic.Add " B ", " 火龍果"
代碼詳解
1、dic.CompareMode = vbTextCompare :設(shè)置字典的比較模式是文本装获,在這種比較模式下不區(qū)分關(guān)鍵字的大小寫瑞信,即關(guān)鍵字”b”和”B”是一樣的。vbTextCompare的值為1穴豫,所以上式也可寫為dic.CompareMode =1凡简。如果設(shè)置為vbBinaryCompare(值為0),則執(zhí)行二進(jìn)制比較精肃,即區(qū)分關(guān)鍵字的大小寫秤涩,此種情況下關(guān)鍵字”b”和”B”被認(rèn)為是不一樣的。
2司抱、dic.Add " B ", " 火龍果":添加一關(guān)鍵字”B”和對應(yīng)于它的項(xiàng)”火龍果”筐眷。由于前面已經(jīng)設(shè)置了比較模式為文本模式,不區(qū)分關(guān)鍵字的大小寫习柠,即關(guān)鍵字”b”和”B”是一樣的匀谣,此時(shí)發(fā)生錯(cuò)誤添加失敗照棋,因?yàn)樽值渲幸呀?jīng)存在”b”了,字典中的關(guān)鍵字是唯一的武翎,不能添加重復(fù)的關(guān)鍵字烈炭。
下次就講一點(diǎn)字典的實(shí)際運(yùn)用。