关于双条件查询常见的公式组合,可以查看这篇文章:
https://www.toutiao.com/i6793891504134816270/#comment_area
在文章后面,有位朋友在咨询用vba如何实现这两种类型的查找?
读者咨询
为了让其他朋友也能看到VBA的方法,在此单独一一篇文章的形式,分享出来。
我们先看下我们经常会遇到的两种双条件查询(见下图):
经常会遇到的两种双条件查询
第一种情况的VBA代码:
第一种情况代码执行演示
用数组 字典的方式,实现双条件或多条件查询
Sub 双条件查找情况1()
Dim Arr, a, Dic
Set Dic = CreateObject("scripting.dictionary")
Arr = Range("A2:C" & Cells(Rows.Count, 1).End(xlUp).Row)
FOR a = 1 To UBound(Arr, 1)
Dic(Arr(a, 1) & "-" & Arr(a, 2)) = Arr(a, 3)
Next
If Dic.exists(Range("E2") & "-" & Range("F2")) Then
Range("G2") = Dic(Range("E2") & "-" & Range("F2"))
Else
MsgBox "没有查询到数据", vbOKOnly vbCritical, "错误"
Exit Sub
End If
End Sub
第二种情况的VBA代码:
第二种情况代码执行演示
所用代码如下:
方法一的代码
Sub 双条件查找情况2—1()
Dim Arr, a, b, Dic
Set Dic = CreateObject("scripting.dictionary")
Arr = Range("A1:G" & Cells(Rows.Count, 1).End(xlUp).Row)
For a = 2 To UBound(Arr, 1)
For b = 2 To UBound(Arr, 2)
Dic(Arr(a, 1) & "-" & Arr(1, b)) = Arr(a, b)
Next b
Next a
If Dic.exists(Range("I2") & "-" & Range("J2")) Then
Range("K2") = Dic(Range("I2") & "-" & Range("J2"))
Else
MsgBox "没有查询到数据", vbOKOnly vbCritical, "错误"
Exit Sub
End If
End Sub
方法二的代码:
Sub 双条件查找情况2—2() '此方法类似于INDEX函数
Dim Arr, a, b
On Error Resume Next
Arr = Range("A1:G" & Cells(Rows.Count, 1).End(xlUp).Row)
For a = 2 To UBound(Arr, 1)
If Arr(a, 1) = Range("I2") Then
Exit For
End If
Next a
Do
b = b 1
Loop Until Arr(1, b) = Range("J2") Or b > UBound(Arr, 2)
If a > UBound(Arr, 1) Or b > UBound(Arr, 2) Then
MsgBox "没有查询到数据", vbOKOnly vbCritical, "错误"
Exit Sub
Else
Range("K2") = Arr(a, b)
End If
End Sub
方法三的代码:
Sub 双条件查找情况2—3()
Dim Arr, Brr, a, b
Arr = Range("A1:A" & Cells(Rows.Count, 1).End(xlUp).Row)
Brr = Range("A1:G1")
a = Application.WorksheetFunction.Match(Range("I2"), Arr, False)
b = Application.WorksheetFunction.Match(Range("J2"), Brr, False)
Range("K2") = Cells(a, b)
End Sub
代码展示完毕。
代码中用到了数组、字典、工作表函数调用、FOR……NEXT循环、D0……LOOP循环、IF判断、On Error Resume Next容错代码,相关内容后续在分享VBA内容的时候,会有单独说明,希望朋友持续关注。