天天看點

VBA字典之雙條件資料查詢

作者:VBA語言專業教育

【分享成果,随喜正能量】患生于所忽,禍起于細微。無論何時何地都要有居安思危的意識,越是微小的疏忽,越是能造成巨大的禍患。。

《VBA數組與字典方案》教程(10144533)是我推出的第三套教程,目前已經是第一版修訂了。這套教程定位于中級,字典是VBA的精華,我要求學員必學。7.1.3.9教程掌握後,可以解決大多數工作中遇到的實際問題。

這套字典教程共兩冊,一共八十四講,今後一段時間會給大家陸續推出修訂後的教程内容。今日的内容是:VBA字典之雙條件資料查詢

VBA字典之雙條件資料查詢

第四十五講 利用數組和字典,完成雙條件資料查詢

大家好,今日我們繼續講解數組與字典解決方案,今日講解的是第45講:利用數組和字典,完成兩個條件下資料查詢。其實對于這講内容在前面也講解過,本講内容隻是代碼不同,但我們要多看看這些代碼,對自己的思路,對于代碼組織非常有用,很多時候,過程比結果更重要,我們要多多的掌握過程來實作我們的結果。

1 應用場景的具體分析

執行個體:如下面資料,A B 列是資料源,E2:F2是要查詢的資料,将結果填在G列。

VBA字典之雙條件資料查詢

我們要先想想,上述的問題實作的手段:

  • 可以利用代碼循環比較
  • 資料庫

這些都是可以的,代碼我在之前文章中也講解過,今日我們要利用字典,大家會發現代碼更加簡潔,簡短,隻要對字典了解了,那麼代碼也是不難的。

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

代碼的截圖:

VBA字典之雙條件資料查詢

代碼講解:

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

将用于存儲查詢結果的數組回填并釋放記憶體。

下面看代碼的運作:

VBA字典之雙條件資料查詢

今日内容回向:

1 本講内容實作兩個條件查找關鍵是什麼?

2 在資料回填時,我為什麼沒有用CLEAR清空一下待填區域呢?

VBA字典之雙條件資料查詢

我多年的VBA實踐經驗,全部濃縮在以下十套教程中,可以聯絡我V信VBA6337取得教程,成為我的學員:

VBA字典之雙條件資料查詢

【分享成果,随喜正能量】生活太多的糾纏,不過是陷入情緒的漩渦,記得觀心自省,穩定自心,抽離情緒方可止損。。

繼續閱讀