字典作為一種復合數(shù)據(jù)類型和封裝有屬性和方法的對象,自然比自己定義來得更加方便、安全和有效率。 字典其實就是一些“鍵-值”對。在很多場合,它都能起到很大的作用,使用起來非常方便,有類似于微型數(shù)據(jù)庫的作用,可用于臨時保存一些數(shù)據(jù)信息。 字典相當于一個多行二列的二維數(shù)組或單元格數(shù)據(jù)區(qū)域。 字典這種數(shù)據(jù)結構有兩個很重要的特性: I key(鍵)不允許重復。當給字典元素賦值時,不存key時可以新建,存在key時可以更新值。利用這個特性可以很方便地做一些數(shù)據(jù)匯總的工作。這個機制就會形成鍵值覆蓋。這是字典區(qū)別于VBA的另一種數(shù)據(jù)類型,集合(Collection)的一個重要方面。如果你曾經試圖改變某個與Collection對象成員對應的鍵值,那么你知道這不可能。當對象成員加入到Collection對象時,該成員的數(shù)據(jù)和鍵值就已經被固定下來了。你能做的唯一選擇就是使用Remove方法清除該成員并增加一個新成員到該對象。但是,你能夠利用字典(Dictionary)對象的Key特性來覆蓋該鍵的鍵值。 II 數(shù)據(jù)元素通過key進行索引,我們知道,數(shù)據(jù)是通過下標進行索引的,所以順序很重要。而字典是通過key進行索引的,所以不考慮元素順序。通過key進行索引,在特定的場合,有它的優(yōu)勢所在。 1 聲明字典VBA中創(chuàng)建字典有兩種方法: 1.1 引用聲明 在VBE菜單中,選擇“工具-引用”,在彈出的對話框中選擇中邊的“瀏覽”,此時會打開Windows系統(tǒng)的驅動目錄(C:\Windows\System32),然后找到scrrun.dll,確定確定返回就行了。 添加引用后,就可以像定義其它變量一樣聲明使用字典了。
1.2 直接聲明
2 字典的方法既然是一種對象類型,它肯定封裝了若干成員方法和屬性。 字典有6個成員方法,分別是Add、Exists、Keys、Items、Remove、RemoveAll。使用方法如下: 2.1 Add 用于添加內容到字典中。 d.Add key, item 第一個參數(shù)為鍵,第二個參數(shù)為鍵對應的值。 如d.Add '優(yōu)秀', 80 一般使用直接賦值的方式來把內容添加到字典中: d.(key) = item,如:
2.2 Exists() 用于判斷指定的關鍵詞是否存在于字典(的鍵)中。 d.Exists(key) 如果存在,返回True,否則返回False。通常會在向字典中添加條目的時候使用,即先判斷字典中是否已存在這個記錄,如果不存在則新增,否則進行其它的操作。 2.3 Keys() 獲取字典所有的鍵,返回類型是數(shù)組。 d.Keys() 值得注意的是,字典使用for each next結構進行遍歷時,返回的是key。
2.4 Items() 獲取字典所有的值,返回類型是數(shù)組。 d.Items() 2.5 Remove() 從字典中移除一個條目,是通過鍵來指定的。 d.Remove(key) 如果指定的鍵不存在,會發(fā)生錯誤。 2.6 RemoveAll 清空字典。 d.RemoveAll 3 字典的屬性字典有4個屬性:Count、Key、Item、ConpareMode 3.1 Count 用于統(tǒng)計字典中鍵-值對的數(shù)量。也可以簡單理解為統(tǒng)計字典中鍵的個數(shù)。 常用在字典遍歷時配合循環(huán)使用,如: For i = 0 To d.Count - 1 3.2 Key 用于更改字典中已有的鍵。如: d.Key('apple') = 'Orange' 如果指定的鍵不存在,則會產生錯誤。 3.3 Item 用于寫入或讀取字典中指定鍵的值,如果指定的鍵不存在,則會新增。如: '讀取 Debug.Print d.Item('apple') '寫入 d.Item('apple') = 10 3.4 CompareMode 當用字符串做為key時是否區(qū)分大小寫,如 Dic.CompareMode=1不區(qū)分大小寫,Dic.CompareMode=0區(qū)分大小寫 默認不寫是區(qū)分的。
4 總結一下:字典元素的添加、訪問任何語言的復合數(shù)據(jù)類型,做為一種數(shù)據(jù)元素容器,都要考慮數(shù)據(jù)元素的增、查、刪、改,并用適當?shù)某蓡T方法封裝起來。 4.1 字典元素的添加
4.2 字典元素值通過key的訪問 Cells(1, 1) = d('a') 'Cells(1, 1) = d.Item('a') '與上者相同 5 字典映射到單元格區(qū)域'把字典中keys/items結果分別輸出到工作表的某一列 [a1].Resize(Dic.Count) = WorksheetFunction.Transpose(Dic.keys) 'Output keys result [b1].Resize(Dic.Count) = WorksheetFunction.Transpose(Dic.items) 'Output items result 6 實例應用:將單元格區(qū)域映射到數(shù)組,字典通過數(shù)組定義來匯總數(shù)據(jù)。如下圖所示,按姓名匯總數(shù)據(jù): 下面左邊數(shù)據(jù)是源數(shù)據(jù),中間是使用VBA統(tǒng)計產生的數(shù)據(jù),右邊是使用數(shù)據(jù)透視表產生的數(shù)據(jù)。
代碼運行后,實現(xiàn)與數(shù)據(jù)透視表匯總數(shù)據(jù)相同的效果。 當然上面也可以不使用數(shù)組,直接引用單元格,但使用數(shù)據(jù)操作起來更方便,不需要考慮單元格偏移。 7 實例應用:數(shù)組與字典配合使用統(tǒng)計數(shù)據(jù)如下,統(tǒng)計得票數(shù):
由于字典的“鍵、值”存儲模式只能對應多行兩列的數(shù)據(jù)結構,一列是鍵,一列是值。如果值匯總時需要考慮兩列的關鍵字,如某個表格的編排有三列數(shù)據(jù),產品名稱、規(guī)格、數(shù)量,如果需要按產品名稱+規(guī)格去匯總數(shù)量。則需要考慮將產品名稱與規(guī)格通過字符串連接的方式連接起來做為字典的鍵。 -End- |
|