VBA基礎七:字典


 

借花獻佛:
一、定義字典
  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”了,字典中的關鍵字是唯一的,不能添加重復的關鍵字。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM