大家好,今日我們繼續講解VBA數組與字典解決方案,今日講解第82講內容:利用字典實現雙條件,結果多值查詢。
這講我們繼續講字典查詢,上講內容實現了雙條件下單返回值的查詢,今日我們將實現多返回值查詢,多返回值就是返回值不僅一個是多個。在FIND查詢的時候,我們往往根據查到後的單元格行數,來定位,固定提取數值。在字典中這種思路顯然是不可以的,那麼字典中如何實現呢?就是利用數組,利用ARRAY函數建立一維數組,作為返回值,然後在指定的區域進行填充即可,此時要注意待填區域和指定區域大小要一致。下面我結合一個實例來講解。
實例,如下面的數據截圖,數據源和之前的一樣,我們要在數據源中查找到指定型號、類別的數據,返回值是三個:現庫存數量、未到的數量、未來三個月的需求數量,如何實現呢?
思路分析:這講的內容和上一講類似,只不過是返回的是三個數據,那麼我就是建立一個數組來裝載這三個數據即可。
下面看我給出的代碼:
Sub mynzsz_82() '第82講 利用字典實現雙條件,結果多值查詢
Sheets("82").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的鍵值是字典,這時字典的鍵值是一個數組
mydic(myarr(i, 1))(myarr(i, 2)) = Array(myarr(i, 4), (myarr(i, 5)), myarr(i, 6))
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, "L") = "": Cells(uu.Row, "M") = ""
'填入查到的數據,在字典的嵌套中查找到鍵值,此時鍵值是數組,回填到區域
Cells(uu.Row, "K").Resize(1, 3) = mydic(uu.Value)(Cells(uu.Row, "J").Value)
Next
Set mydic = Nothing
MsgBox ("ok")
End Sub
代碼的截圖:
代碼分析:
1 上述代碼實現了按照兩個條件,返回多個結果的查詢。和上一講不同的是在給兩級嵌套字典賦值的時候,用了一個ARRAY數組函數來裝載需要返回的三個數據。在返回的時候則根據需要用了resize來擴展指定區域來回填數據。
2 'mydic的鍵值是字典,這時字典的鍵值是一個數組
mydic(myarr(i, 1))(myarr(i, 2)) = Array(myarr(i, 4), (myarr(i, 5)), myarr(i, 6))
上述代碼中myarr(i, 1) 是作為字典的鍵,鍵值是一個字典,myarr(i, 2)則是作為後面字典的鍵,鍵值是一個數組Array(myarr(i, 4), (myarr(i, 5)), myarr(i, 6)),大家思考一下,這個數組是一個什麼類型的數組呢?
3 Cells(uu.Row, "K").Resize(1, 3) = mydic(uu.Value)(Cells(uu.Row, "J").Value)
上述代碼實現查找到數據的回填,這裡要注意回填區域的大小要和待填的數據大小要一致。
下面看代碼的運行:
今日內容迴向:
1 如何實現雙條件下的數據多返回值查詢?
2 實現數據的多返回值查找關鍵是什麼?
閱讀更多 VBA專家 的文章