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

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

今日的字典查詢中,我講解如何實現按照兩個給定條件進行查詢,這裡限定是結果唯一,多值返回在之後講解。對於兩個條件的查找,之前FIND方法是利用的先按單條件查詢,同時記錄下查詢開始時的位置,然後開始逐一驗證符合第一個條件的數據,當找到同時符合第二個查詢條件時,那麼返回結果。在利用字典的查詢時,和上面的思路是完全不同的,將利用字典的二級嵌套,什麼是字典的二級嵌套呢?就是一級字典的鍵值同樣是字典,這種嵌套用來解決雙條件查詢同樣也可以一次直達,非常的方便。下面我們還是根據實例來講解這個方法。

實例,如下面的數據截圖,I-K列為查詢區域,其中I,J為條件,K列為結果,也就是說要根據型號和類別查找出唯一的規格,如何實現呢?

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

思路分析: 我們可以把型號作為鍵,鍵值仍為字典,在下一級的字典中把類別作為鍵,鍵值是規格,這是一個字典的二級嵌套過程。

下面看我給出的代碼:

Sub mynzsz_81() '第81講 利用字典實現雙條件,結果唯一查詢

Sheets("81").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

'mydicd的鍵值是字典,賦值是myarr(i, 3)

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

Next

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

For Each uu In myRng

'清空數據

Cells(uu.Row, "K") = ""

'填入查到的數據,在字典的嵌套中查找

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

Next

Set mydic = Nothing

MsgBox ("ok")

End Sub

代碼的截圖:

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

代碼分析:

1 上述代碼賦值部分就是一個給二級嵌套字典賦值的過程,完成後直接就可以利用嵌套字典來完成查詢了。

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

'mydicd的鍵值是字典,賦值是myarr(i, 3)

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

Next

上面代碼在字典中裝入數據,首先在一級字典中判斷是否存在,如果沒有就新建,注意鍵值是字典:

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

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

End If

然後給這個字典賦值:mydic(myarr(i, 1))(myarr(i, 2)) = myarr(i, 3)

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

上述語句將定義一個單元格的區域,也就是要查詢的區域,以便使用for each 循環。

5 '填入查到的數據,在字典的嵌套中查找

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

在嵌套的字典中mydic(uu.Value)(Cells(uu.Row, "J").Value)的值就是我要查詢的值,把這個值填入結果即可。

下面看代碼的運行:

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

今日內容迴向:

1 如何實現雙條件查詢?

2 如何理解字典的嵌套?


分享到:


相關文章: