大家好,今日我们继续讲解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 如何理解字典的嵌套?