大家好,今日我们继续讲解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專家 的文章