大家好,今日我們繼續講解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 如何理解字典的嵌套?