大家好,今日我们继续讲解数组与字典解决方案,今日讲解的是第45讲:利用数组和字典,完成两个条件下数据查询。其实对于这讲内容在前面也讲解过,本讲内容只是代码不同,但我们要多看看这些代码,对自己的思路,对于代码组织非常有用,很多时候,过程比结果更重要,我们要多多的掌握过程来实现我们的结果。
实例:如下面数据,A B 列是数据源,E2:F2是要查询的数据,将结果填在G列。
我们要先想想,上述的问题实现的手段:1 可以利用代码循环比较; 2 数据库,这些都是可以的,代码我在之前文章中也讲解过,今日我们要利用字典,大家会发现代码更加简洁,简短,只要对字典理解了,那么代码也是不难的。下面看我给出的代码:
Sub mynzsz_45() '第45讲 利用数组和字典完成两个条件查询
Sheets("45").Select
Set mydic = CreateObject("scripting.dictionary")
'd.CompareMode = vbTextCompare '不区分字母大小写,此语句备用
'将数据明细,装入数组myarr
myarr = Sheets("45").[a1].CurrentRegion
'遍历数组myarr,将数据装入字典,注意此处的S是合并条件作为字典的key值,字典的键值
For i = 2 To UBound(myarr)
For j = 2 To UBound(myarr, 2)
s = myarr(i, 1) & "@" & myarr(i, j)
mydic(s) = myarr(i, 3)
Next
Next
'将查询区域的数据装入数组brr
mybrr = Sheets("45").[e1].CurrentRegion
'合并查询的两个条件成为一个条件字符串
For i = 2 To UBound(mybrr)
s = mybrr(i, 1) & "@" & mybrr(i, 2)
For j = 3 To UBound(mybrr, 2)
If mydic.exists(s) Then
mybrr(i, j) = mydic(s) '从字典中取s对应的条目
Else
mybrr(i, j) = "NO FIND" '否则返回假空
End If
Next
Next
'将数组mybrr回填
Sheets("45").[e1].CurrentRegion = mybrr
MsgBox "OK"
'释放字典内存
Set mydic = Nothing
End Sub
代码的截图:
代码讲解:
1 上述过程实现了两个条件联合的查询。首先把源数据放到数组中,然后把待查询数据也放到数组中,同时实现在源数据中查找。
2 Set mydic = CreateObject("scripting.dictionary")
'd.CompareMode = vbTextCompare '不区分字母大小写,此语句备用
在上述代码中实现了创建字典,同时给出了比较的备用方案,如果需要启用不区分大小写,那么可以用此代码
3 myarr = Sheets("45").[a1].CurrentRegion
'遍历数组myarr,将数据装入字典,注意此处的S是合并条件作为字典的key值,字典的键值
For i = 2 To UBound(myarr)
For j = 2 To UBound(myarr, 2)
s = myarr(i, 1) & "@" & myarr(i, j)
mydic(s) = myarr(i, 3)
Next
Next
上述代码将源数据放入数组后,将第一和第二的数据放到字典中作为键,将第三个数据作为对应的键值。
4 '将查询区域的数据装入数组brr
mybrr = Sheets("45").[e1].CurrentRegion
'合并查询的两个条件成为一个条件字符串
For i = 2 To UBound(mybrr)
s = mybrr(i, 1) & "@" & mybrr(i, 2)
For j = 3 To UBound(mybrr, 2)
If mydic.exists(s) Then
mybrr(i, j) = mydic(s) '从字典中取s对应的条目
Else
mybrr(i, j) = "NO FIND" '否则返回假空
End If
Next
Next
上述代码将待查询数据放入数组,同时将第一和第二数据合并,在字典中找对应的键和键值,字典可以直达目的地,这一点大家要充分理解。
5 '将数组mybrr回填
Sheets("45").[e1].CurrentRegion = mybrr
MsgBox "OK"
'释放字典内存
Set mydic = Nothing
将用于存储查询结果的数组回填并释放内存。
下面看代码的运行:
今日内容回向:
1 本讲内容实现两个条件查找关键是什么?
2 在数据回填时,我为什么没有用CLEAR清空一下待填区域呢?