网站首页 > 精选文章 正文
大家好,今日我们继续讲解VBA数组与字典解决方案,今日讲解第83讲内容:利用字典实现三条件下,结果唯一查询。
在前几讲中,我分别讲了利用字典实现单条件,多值查询;双条件单值、多值查询几种情况的查询方法,今日我继续讲解三个条件下的唯一查询,也就是说要同时实现三个条件,这种情况下如果利用FIND,思路是:在实现第一个查询的基础上,要同时验证其他两个条件,才能返回数据,而利用字典可以实现一次直达返回,更突出显示了字典在查询方面的优势。利用字典实现三条件查询的方式仍是利用字典嵌套,这里将利用三级嵌套的模式来解决,大家要注意理解字典嵌套的写法,这和数据录入时下拉菜单的实现有着相似的地方,大家可以自己比较一下代码。下面我仍结合实例来讲解三条件下的唯一值查询。
实例,如下面的数据截图,在源数据中我要依照型号,类别,规格三个条件来查到现在库存的数量,如何实现呢?

思路分析:利用字典嵌套的方法,第一层字典时以型号为键,第二层是以类别为键,第三册是以规格为键,然后将库存数量作为键值来给字典赋值,在查询的时候,可以依次按照上面的字典嵌套结构来查询。
下面看我给出的代码:
Sub mynzsz_83() '第83讲 利用字典实现三条件,结果唯一查询
Sheets("83").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
If Not mydic(myarr(i, 1)).exists(myarr(i, 2)) Then
Set mydic(myarr(i, 1))(myarr(i, 2)) = CreateObject("Scripting.Dictionary")
End If
'mydic的键值是字典,这时字典的键值是一个一维数组
mydic(myarr(i, 1))(myarr(i, 2))(myarr(i, 3)) = myarr(i, 4)
Next
Set myRng = Range(Cells(2, "I"), Cells(Range("I2").End(xlDown).Row, "I"))
For Each uu In myRng
Cells(uu.Row, "L") = "" '清空回填数据区域
'填入查到的数据,在字典的嵌套中查找到键值,此时键值是数组,回填到区域
'注意下面语句的写法,不然会报错,字典最大的好处是在查找的时候,如果没有查到是不会报错的。
If mydic.exists(uu.Value) Then
If mydic(uu.Value).exists(Cells(uu.Row, "J").Value) Then
Cells(uu.Row, "L") = mydic(uu.Value)(Cells(uu.Row, "J").Value)
End If
End If
Next
Set mydic = Nothing
MsgBox ("ok")
End Sub
代码的截图:

代码分析:
1 上面的代码实现了字典的三级嵌套来完成赋值和查询的过程:
Set mydic = CreateObject("Scripting.Dictionary");这是字典的最外层结构
Set mydic(myarr(i, 1)) = CreateObject("Scripting.Dictionary");将第一层字典的键值作为字典;
Set mydic(myarr(i, 1))(myarr(i, 2)) = CreateObject("Scripting.Dictionary"):将第二层字典的键值作为字典,实现字典的嵌套。
赋值:mydic(myarr(i, 1))(myarr(i, 2))(myarr(i, 3)) = myarr(i, 4)
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
If Not mydic(myarr(i, 1)).exists(myarr(i, 2)) Then
Set mydic(myarr(i, 1))(myarr(i, 2)) = CreateObject("Scripting.Dictionary")
End If
'mydic的键值是字典,这时字典的键值是一个一维数组
mydic(myarr(i, 1))(myarr(i, 2))(myarr(i, 3)) = myarr(i, 4)
Next
上述语句完成了字典的嵌套和赋值,注意在实现嵌套的时候要分层逐步实现,最后才是把数组数据赋给字典。
5 If mydic.exists(uu.Value) Then
If mydic(uu.Value).exists(Cells(uu.Row, "J").Value) Then
Cells(uu.Row, "L") = mydic(uu.Value)(Cells(uu.Row, "J").Value)(Cells(uu.Row, "K").Value)
End If
End If
Next
上述代码实现三层嵌套下的数据查询。
下面看代码的运行:

今日内容回向:
1 如何理解字典的三层嵌套?
2 三条件查询在字典中是如何实现的?
猜你喜欢
- 2024-12-25 如何在Excel中使用高级筛选实现两个条件查询
- 2024-12-25 C#动态查询:巧用Expression组合多条件表达式
- 2024-12-25 Excel多条件查询获取不连续列数据,这个公式组合好用到爆!
- 2024-12-25 利用VBA字典实现单条件,结果多值查询
- 2024-12-25 ElasticSearch笔记系列——简单查询、条件查询、聚合查询
- 2024-12-25 12. WPS报表JS宏查询加入筛选条件
- 2024-12-25 wps通用!利用Excel函数实现多条件动态查询
- 2024-12-25 【人社日课·6月21日】如何查询职业资格考试的报考条件?
- 2024-12-25 利用VBA构建Excel中的多条件查询用户界面
- 2024-12-25 2024年护考成绩查询条件、流程及注意要点!
- 最近发表
- 标签列表
-
- 向日葵无法连接服务器 (32)
- git.exe (33)
- vscode更新 (34)
- dev c (33)
- git ignore命令 (32)
- gitlab提交代码步骤 (37)
- java update (36)
- vue debug (34)
- vue blur (32)
- vscode导入vue项目 (33)
- vue chart (32)
- vue cms (32)
- 大雅数据库 (34)
- 技术迭代 (37)
- 同一局域网 (33)
- github拒绝连接 (33)
- vscode php插件 (32)
- vue注释快捷键 (32)
- linux ssr (33)
- 微端服务器 (35)
- 导航猫 (32)
- 获取当前时间年月日 (33)
- stp软件 (33)
- http下载文件 (33)
- linux bt下载 (33)