利用字典實現雙條件,結果多值查詢

大家好,今日我們繼續講解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 實現數據的多返回值查找關鍵是什麼?


分享到:


相關文章: