利用VBA字典實現三條件,結果唯一查詢

大家好,今日我們繼續講解VBA數組與字典解決方案,今日講解第83講內容:利用字典實現三條件下,結果唯一查詢。

在前幾講中,我分別講了利用字典實現單條件,多值查詢;雙條件單值、多值查詢幾種情況的查詢方法,今日我繼續講解三個條件下的唯一查詢,也就是說要同時實現三個條件,這種情況下如果利用FIND,思路是:在實現第一個查詢的基礎上,要同時驗證其他兩個條件,才能返回數據,而利用字典可以實現一次直達返回,更突出顯示了字典在查詢方面的優勢。利用字典實現三條件查詢的方式仍是利用字典嵌套,這裡將利用三級嵌套的模式來解決,大家要注意理解字典嵌套的寫法,這和數據錄入時下拉菜單的實現有著相似的地方,大家可以自己比較一下代碼。下面我仍結合實例來講解三條件下的唯一值查詢。

實例,如下面的數據截圖,在源數據中我要依照型號,類別,規格三個條件來查到現在庫存的數量,如何實現呢?

利用VBA字典實現三條件,結果唯一查詢

思路分析:利用字典嵌套的方法,第一層字典時以型號為鍵,第二層是以類別為鍵,第三冊是以規格為鍵,然後將庫存數量作為鍵值來給字典賦值,在查詢的時候,可以依次按照上面的字典嵌套結構來查詢。

下面看我給出的代碼:

Sub mynzsz_83() '第83講 利用字典實現三條件,結果唯一查詢

Sheets("83").Select

'將數據存入數組

myarr = Range("a2:f" & Range("a2").End(xlDown).Row)

'創建字典對象

Set mydic = CreateObject("Scripting.Dictionary")

'在字典中裝入數據

For i = 1 To UBound(myarr)

'這裡利用了字典的嵌套

If Not mydic.exists(myarr(i, 1)) Then

Set mydic(myarr(i, 1)) = CreateObject("Scripting.Dictionary")

End If

If Not mydic(myarr(i, 1)).exists(myarr(i, 2)) Then

Set mydic(myarr(i, 1))(myarr(i, 2)) = CreateObject("Scripting.Dictionary")

End If

'mydic的鍵值是字典,這時字典的鍵值是一個一維數組

mydic(myarr(i, 1))(myarr(i, 2))(myarr(i, 3)) = myarr(i, 4)

Next

Set myRng = Range(Cells(2, "I"), Cells(Range("I2").End(xlDown).Row, "I"))

For Each uu In myRng

Cells(uu.Row, "L") = "" '清空回填數據區域

'填入查到的數據,在字典的嵌套中查找到鍵值,此時鍵值是數組,回填到區域

'注意下面語句的寫法,不然會報錯,字典最大的好處是在查找的時候,如果沒有查到是不會報錯的。

If mydic.exists(uu.Value) Then

If mydic(uu.Value).exists(Cells(uu.Row, "J").Value) Then

Cells(uu.Row, "L") = mydic(uu.Value)(Cells(uu.Row, "J").Value)

End If

End If

Next

Set mydic = Nothing

MsgBox ("ok")

End Sub

代碼的截圖:

利用VBA字典實現三條件,結果唯一查詢

代碼分析:

1 上面的代碼實現了字典的三級嵌套來完成賦值和查詢的過程:

Set mydic = CreateObject("Scripting.Dictionary");這是字典的最外層結構

Set mydic(myarr(i, 1)) = CreateObject("Scripting.Dictionary");將第一層字典的鍵值作為字典;

Set mydic(myarr(i, 1))(myarr(i, 2)) = CreateObject("Scripting.Dictionary"):將第二層字典的鍵值作為字典,實現字典的嵌套。

賦值:mydic(myarr(i, 1))(myarr(i, 2))(myarr(i, 3)) = myarr(i, 4)

2 '將數據存入數組

myarr = Range("a2:f" & Range("a2").End(xlDown).Row)

上述代碼實現了數據數組裝載,。

3 For i = 1 To UBound(myarr)

'這裡利用了字典的嵌套

If Not mydic.exists(myarr(i, 1)) Then

Set mydic(myarr(i, 1)) = CreateObject("Scripting.Dictionary")

End If

If Not mydic(myarr(i, 1)).exists(myarr(i, 2)) Then

Set mydic(myarr(i, 1))(myarr(i, 2)) = CreateObject("Scripting.Dictionary")

End If

'mydic的鍵值是字典,這時字典的鍵值是一個一維數組

mydic(myarr(i, 1))(myarr(i, 2))(myarr(i, 3)) = myarr(i, 4)

Next

上述語句完成了字典的嵌套和賦值,注意在實現嵌套的時候要分層逐步實現,最後才是把數組數據賦給字典。

5 If mydic.exists(uu.Value) Then

If mydic(uu.Value).exists(Cells(uu.Row, "J").Value) Then

Cells(uu.Row, "L") = mydic(uu.Value)(Cells(uu.Row, "J").Value)(Cells(uu.Row, "K").Value)

End If

End If

Next

上述代碼實現三層嵌套下的數據查詢。

下面看代碼的運行:

利用VBA字典實現三條件,結果唯一查詢

今日內容迴向:

1 如何理解字典的三層嵌套?

2 三條件查詢在字典中是如何實現的?


分享到:


相關文章: