【Excel VBA】用字典处理多条件查询问题

论坛 期权论坛 期权     
数据分析就用Excel   2019-6-16 04:21   2788   0
我们今天分享的内容是使用VBA代码实现多条件查询的功能,照例举个栗子。



如下图所示,表名为“明细表”的数据是明细数据。



再如下图所示,表名为“查询表”的数据是需要查询的数据。




现在我们需要根据查询表的姓名和课目两个条件,在明细表中查询相关的成绩。
对于VBA来说,处理这样的问题总是有一个固定的套路,确定条件关系后,将明细数据循环装入字典,其中明细表的条件作为关键字(Key),需要查询的结果作为条目(Item),最后遍历查询表,根据提取相应的结果。
代码如下:
Sub DicFind()    Dim d As Object, arr, brr, i&, j&, k&, s$    Set d = CreateObject("scripting.dictionary")    '后期引用字典    'd.CompareMode = vbTextCompare    '不区分字母大小写    arr = Sheets("明细表").[a1].CurrentRegion    '明细数据装入数组arr    For i = 2 To UBound(arr)    '遍历数组arr,将数据装入字典,以备查询    '标题行不要,从第二行开始遍历        For j = 2 To UBound(arr, 2)        '标题列不要,从第二列开始遍历            s = arr(i, 1) & "@" & arr(1, j)            '姓名@课目是查询条件,作为字典的key值            d(s) = arr(i, j)            '成绩是查询的结果,作为字典的item        Next    Next    brr = Sheets("查询表").[a1].CurrentRegion    '查询区域的数据装入数组brr    For i = 2 To UBound(brr)        s = brr(i, 1) & "@" & brr(i, 2)        '合并查询的两个条件成为一个条件字符串,姓名@课目        For j = 3 To UBound(brr, 2)            If d.exists(s) Then            '如果字典中存在变量s                brr(i, j) = d(s)                '从字典中取s对应的条目            Else                brr(i, j) = ""                '否则返回假空            End If        Next    Next    Sheets("查询表").[a1].CurrentRegion = brr    '将数组brr放回查询区域    MsgBox "查询OK"    Set d = Nothing    '释放字典内存End Sub
小贴士:
1,对于字典查询法来说,其实大部分情况下,并不存在多条件查询的问题,把多个条件合并成一个条件表达式,那就是单条件查询。
2,需要注意的是,该段代码区分字母大小写,也就是说“VBA”并不等同于“vba”,如果需要不区分字母大小写,取消代码中以下语句的注释。
'd.CompareMode =vbTextCompare '不区分字母大小写
3,留个练手题,使用VBA代码实现条件求和和计数。
如下图所示,根据A:B列的数据,计算D列人员的考试次数和考试成绩



就酱,握爪,晚安(点击下方的阅读原文可以获取测试及练习文件)

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:113
帖子:22
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP