利用字典实现双条件,结果多值查询

大家好,今日我们继续讲解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 实现数据的多返回值查找关键是什么?


分享到:


相關文章: