【分享成果,随喜正能量】患生于所忽,禍起于細微。無論何時何地都要有居安思危的意識,越是微小的疏忽,越是能造成巨大的禍患。。
《VBA數組與字典方案》教程(10144533)是我推出的第三套教程,目前已經是第一版修訂了。這套教程定位于中級,字典是VBA的精華,我要求學員必學。7.1.3.9教程掌握後,可以解決大多數工作中遇到的實際問題。
這套字典教程共兩冊,一共八十四講,今後一段時間會給大家陸續推出修訂後的教程内容。今日的内容是:VBA字典之雙條件資料查詢
第四十五講 利用數組和字典,完成雙條件資料查詢
大家好,今日我們繼續講解數組與字典解決方案,今日講解的是第45講:利用數組和字典,完成兩個條件下資料查詢。其實對于這講内容在前面也講解過,本講内容隻是代碼不同,但我們要多看看這些代碼,對自己的思路,對于代碼組織非常有用,很多時候,過程比結果更重要,我們要多多的掌握過程來實作我們的結果。
1 應用場景的具體分析
執行個體:如下面資料,A B 列是資料源,E2:F2是要查詢的資料,将結果填在G列。
我們要先想想,上述的問題實作的手段:
- 可以利用代碼循環比較
- 資料庫
這些都是可以的,代碼我在之前文章中也講解過,今日我們要利用字典,大家會發現代碼更加簡潔,簡短,隻要對字典了解了,那麼代碼也是不難的。
2 利用字典實作雙條件查詢的代碼及代碼講解
下面看我給出的代碼:
Sub mynzsz_45() '第45講 利用數組和字典完成兩個條件查詢
Sheets("45").Select
Set mydic = CreateObject("scripting.dictionary")
'd.CompareMode = vbTextCompare '不區分字母大小寫,此語句備用
'将資料明細,裝入數組myarr
myarr = Sheets("45").[a1].CurrentRegion
'周遊數組myarr,将資料裝入字典,注意此處的S是合并條件作為字典的key
For i = 2 To UBound(myarr)
For j = 2 To UBound(myarr, 2)
s = myarr(i, 1) & "@" & myarr(i, j)
mydic(s) = myarr(i, 3)
Next
Next
'将查詢區域的資料裝入數組brr
mybrr = Sheets("45").[e1].CurrentRegion
'合并查詢的兩個條件成為一個條件字元串
For i = 2 To UBound(mybrr)
s = mybrr(i, 1) & "@" & mybrr(i, 2)
For j = 3 To UBound(mybrr, 2)
If mydic.exists(s) Then
mybrr(i, j) = mydic(s) '從字典中取s對應的條目
Else
mybrr(i, j) = "NO FIND" '否則傳回NO FIND
End If
Next
Next
'将數組mybrr回填
Sheets("45").[e1].CurrentRegion = mybrr
MsgBox "OK"
'釋放字典記憶體
Set mydic = Nothing
End Sub
代碼的截圖:
代碼講解:
1) 上述過程實作了兩個條件聯合查詢。首先把源資料放到數組中,然後把待查詢資料也放到數組中,同時實作在源資料中查找。
2) Set mydic = CreateObject("scripting.dictionary")
'd.CompareMode = vbTextCompare '不區分字母大小寫,此語句備用
在上述代碼中實作了建立字典,同時給出了比較的備用方案,如果需要啟用不區分大小寫,那麼可以用此代碼
3) myarr = Sheets("45").[a1].CurrentRegion
'周遊數組myarr,将資料裝入字典,注意此處的S是合并條件作為字典的key
For i = 2 To UBound(myarr)
For j = 2 To UBound(myarr, 2)
s = myarr(i, 1) & "@" & myarr(i, j)
mydic(s) = myarr(i, 3)
Next
Next
上述代碼将源資料放入數組後,将第一和第二的資料放到字典中作為鍵,将第三個資料作為對應的鍵值。
4) '将查詢區域的資料裝入數組brr
mybrr = Sheets("45").[e1].CurrentRegion
'合并查詢的兩個條件成為一個條件字元串
For i = 2 To UBound(mybrr)
s = mybrr(i, 1) & "@" & mybrr(i, 2)
For j = 3 To UBound(mybrr, 2)
If mydic.exists(s) Then
mybrr(i, j) = mydic(s) '從字典中取s對應的條目
Else
mybrr(i, j) = "NO FIND" '否則傳回假空
End If
Next
Next
上述代碼将待查詢資料放入數組,同時将第一和第二資料合并,在字典中找對應的鍵和鍵值,字典可以直達目的地,這一點大家要充分了解。
5) '将數組mybrr回填
Sheets("45").[e1].CurrentRegion = mybrr
MsgBox "OK"
'釋放字典記憶體
Set mydic = Nothing
将用于存儲查詢結果的數組回填并釋放記憶體。
下面看代碼的運作:
今日内容回向:
1 本講内容實作兩個條件查找關鍵是什麼?
2 在資料回填時,我為什麼沒有用CLEAR清空一下待填區域呢?
我多年的VBA實踐經驗,全部濃縮在以下十套教程中,可以聯絡我V信VBA6337取得教程,成為我的學員:
【分享成果,随喜正能量】生活太多的糾纏,不過是陷入情緒的漩渦,記得觀心自省,穩定自心,抽離情緒方可止損。。