- 創(chuàng )建字典對象
'后期綁定:方便代碼在其他電腦上運行,推薦。dim dic as objectSet dic = CreateObject("scripting.dictionary")'前期綁定:可以直接聲明字典對象,有對象屬性和方法的提示,但在其他沒(méi)有勾選引用的電腦上無(wú)法正常運行。'引用勾選:VBE窗體-工具-引用-勾選‘Microsoft Scripting Runtime’dim dic as New dictionary- 獲取字典的鍵、值,字典計數,刪除,判斷鍵是否存在于字典
with activesheet 'dic.count:字典計數,字典中一共有多少條記錄; 'dic.keys:字典的鍵,寫(xiě)入單元格以行寫(xiě)入,如需以列寫(xiě)入單元格,調用工作表函數transpose轉置; .cells(1,1).resize(dic.count,1) = application.worksheetfunction.transpose(dic.keys) '清除工作表單元格內容 .cells.clearcontents 'dic.items:字典的值; .cells(1,1).resize(1,dic.count) = dic.items '判斷某內容是否存在與字典的鍵中 if dic.exists("內容") then debug.print "字符串‘內容’存在于字典的鍵中" '清空字典,有時(shí)候其他過(guò)程也需要使用字典,當前過(guò)程已經(jīng)使用完了,但我們又不想重新創(chuàng )建字典對象,這時(shí)候我們可以public字典全局變量,再清空字典,供新的過(guò)程使用該字典對象。 dic.removeall '清除單個(gè)字典鍵-值對,key是字典的某個(gè)需要刪除的鍵 dic.remove keyend with- 字典常用方法
- 去重
dim dic as objectdim arrdim stSet dic = CreateObject("scripting.dictionary")arr = array("可樂(lè )","雪碧","雞翅",,"可樂(lè )","漢堡包","雞翅")for each st in arr '字典的鍵是不能重復的,重復導入字典只會(huì )存在一個(gè),可以利用字典這點(diǎn)特性去重。 '這里不需要字典的值,設置為空字符串或其他數值都可以。 dic(st) = ""nextactivesheet.range("a1").resize(dic.count,1) = application.worksheetfunction.transpose(d.keys)- 實(shí)現sumifs條件求和
Sub dic_sumif()Application.ScreenUpdating = FalseDim dic As ObjectDim arrDim i As ByteSet dic = CreateObject("scripting.dictionary")With ActiveSheet arr = .UsedRange For i = 2 To UBound(arr) 'dic(arr(i,1))沒(méi)有值是默認是0,通過(guò)下面方法對每一個(gè)水果的銷(xiāo)量進(jìn)行累加。 dic(arr(i, 1)) = dic(arr(i, 1)) + arr(i, 2) Next '使用copy方法,將表頭復制到e1,f1單元格 .Range("a1:b1").Copy .Range("e1") '字典鍵去重縱向寫(xiě)入到單元格 .Cells(2, "e").Resize(dic.Count, 1) = Application.WorksheetFunction.Transpose(dic.keys) For i = 2 To dic.Count + 1 '循環(huán)輸入字典鍵對應的值到f列 .Cells(i, "f").Value2 = dic(.Cells(i, "e").Value2) NextEnd Withset dic = NothingApplication.ScreenUpdating = TrueEnd Sub效果如下圖:
3. 計數
如果對上面水果種類(lèi)進(jìn)行計數:countifs,只需要將分類(lèi)匯總的值改為數值1即可,每出現一次‘+1’
dic(arr(i, 1)) = dic(arr(i, 1)) + 1'在上面代碼中添加下這條,修改下表頭range("f1").value2 = "計數"效果如下圖:
4. 匹配
- 這個(gè)應該是使用字典應用最多的了,需要注意的是,如果使用單元格寫(xiě)入到字典,單元格同時(shí)也包含格式等信息,如果只需要單元格的值,要使用單元格.value2方法,同時(shí),字典的值也可以是數組。
- 數據源:

- 目標:匹配‘李白’和‘后羿’的身高和體重
- 代碼如下:
Sub data_match()Application.ScreenUpdating = FalseDim dic As ObjectDim arrDim i As ByteSet dic = CreateObject("scripting.dictionary")With ActiveSheet arr = .Cells(1, 1).CurrentRegion For i = 2 To UBound(arr) '這里字典的值,用的是array數組,方便我們一下匹配多個(gè)數據,省去再創(chuàng )建字典對象麻煩。 dic(arr(i, 1)) = Array(arr(i, 2), arr(i, 3)) Next For i = 2 To .Cells(1, "e").End(xlDown).row .Cells(i, "f").Resize(1, 2) = dic(.Cells(i, "e").Value2) NextEnd Withset dic = NothingApplication.ScreenUpdating = TrueEnd Sub效果如下:
我在這里加入了‘妲己’,遍歷用字典去匹配了,但是字典并沒(méi)有‘妲己’這個(gè)key,匹配出來(lái)是空,并沒(méi)有報錯,大家不用擔心字典沒(méi)有對應key匹配而出錯這種情況,這樣只會(huì )將結果輸出為空。~
如果需要匹配的姓名后面有之前填寫(xiě)的身高和體重信息,但是載入字典的數據源并沒(méi)有這個(gè)人的信息,我們在遍歷匹配時(shí),又不想使身高和體重被替換為空,這時(shí)候可以結合dic.exisst語(yǔ)句,判斷姓名是否存在于字典的keys中,再輸出匹配結果。
5. key的組合和分割
dim arrdim i,row as longdim d as objectdim keyset d = createobject("scripting.dictionary")with thisworkbook arr = .sheets(1).usedrange for i = 2 to ubound(arr) d(join(array(arr(i,1),arr(i,2),arr(i,3)),"|")) = arr(i,4) next with .sheets("輸出") row = 2 for each key in d.keys .cells(row,4).value = d(key) .cells(row,1).resize(1,3) = split(key,"|") row = row + 1 next end withend with 
