网站首页 > 技术文章 正文
大家好,今日我们继续讲解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-11-15 ES6中数组新增的方法-超级好用(es6新增数组方法 set map)
- 2024-11-15 2023-05-16:给你一个 严格升序排列 的正整数数组 arr 和一个整数 k 。
- 2024-11-15 ES6中对数组的扩展(es6数组语法)
- 2024-11-15 uni-app基于vue开发小程序与标准vue开发新增点
- 2024-11-15 JavaScript数组方法-高阶函数hope
- 2024-11-15 vue uni-app 数组的操作方法:filter()、map()、forEach()、unsh...
- 2024-11-15 js判断字符串是否在数组中(js判断字符串包含数字)
- 2024-11-15 15个你应该知道的JavaScript的重要数组方法
- 2024-11-15 碎片时间学编程「316]:提供的函数比较器返回两个数组对称差异
- 2024-11-15 202012-前端开发vue项目代码中的亮点和疑点
- 标签列表
-
- content-disposition (47)
- nth-child (56)
- math.pow (44)
- 原型和原型链 (63)
- canvas mdn (36)
- css @media (49)
- promise mdn (39)
- readasdataurl (52)
- if-modified-since (49)
- css ::after (50)
- border-image-slice (40)
- flex mdn (37)
- .join (41)
- function.apply (60)
- input type number (64)
- weakmap (62)
- js arguments (45)
- js delete方法 (61)
- blob type (44)
- math.max.apply (51)
- js (44)
- firefox 3 (47)
- cssbox-sizing (52)
- js删除 (49)
- js for continue (56)
- 最新留言
-