绑定dictionary 给定关键字不再字典中_利用字典实现双条件,结果唯一查询

大家好,今日我们继续讲解VBA数组与字典解决方案,今日讲解第81讲内容:利用字典实现双条件,结果唯一查询。

今日的字典查询中,我讲解如何实现按照两个给定条件进行查询,这里限定是结果唯一,多值返回在之后讲解。对于两个条件的查找,之前FIND方法是利用的先按单条件查询,同时记录下查询开始时的位置,然后开始逐一验证符合第一个条件的数据,当找到同时符合第二个查询条件时,那么返回结果。在利用字典的查询时,和上面的思路是完全不同的,将利用字典的二级嵌套,什么是字典的二级嵌套呢?就是一级字典的键值同样是字典,这种嵌套用来解决双条件查询同样也可以一次直达,非常的方便。下面我们还是根据实例来讲解这个方法。

实例,如下面的数据截图,I-K列为查询区域,其中I,J为条件,K列为结果,也就是说要根据型号和类别查找出唯一的规格,如何实现呢?

ef2c3b3b2fabb30d5148bec6f7b4e7f5.png

思路分析: 我们可以把型号作为键,键值仍为字典,在下一级的字典中把类别作为键,键值是规格,这是一个字典的二级嵌套过程。

下面看我给出的代码:

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

代码的截图:

b60ad9edf42df6f1b8ed5bc7aed092c7.png

代码分析:

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)的值就是我要查询的值,把这个值填入结果即可。

下面看代码的运行:

01c081944c7ab683ab824790bc18e8fe.png

今日内容回向:

1 如何实现双条件查询?

2 如何理解字典的嵌套?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值