尝试在VBA中使用带有2个匹配条件的application.match函数,以返回两个条件都存在的行号。我可以直接在工作表中键入并得到正确的答案,但是在转换为VBA代码时,我会收到type mismatch error (13)
。
这是我直接输入工作表并获取正确的行号返回的内容:{=Match(1,("Criteria 1" = A:A)*("Criteria 2" = B:B),0)}
。条件1和条件2是文本字符串。 A列和B列中的数据是文本和数字的混合。
这是我在VBA中尝试的等效代码,导致类型不匹配错误:
Result = application.match(1,(Criteria 1 = Range("A:A"))*(Criteria 2 = Range("B:B")), 0)
尝试了较短的测试行,并出现了类型不匹配错误:
Test = Application.match(1,(Criteria 1 = Range("A:A"),0)
我希望该代码返回条件1和条件2都存在的行号(结果)。 Locals窗口显示条件1是变量/字符串。我尝试了缩减版本的代码,并得到了类似的错误。在这种情况下,结果为Test,并且Locals窗口显示Test类型为Variant / Double,Criteria1为Variant / String,Range(“ A:A”)为Variant / Variant(我将Range(A:A)分配给了变量来确定)
答案 0 :(得分:1)
您可以通过Evaluate
Sub Tester()
Dim m As Variant, sht As Worksheet
Set sht = ActiveSheet 'for example
m = ActiveSheet.Evaluate("=MATCH(1,(""Criteria 1"" = A:A)*(""Criteria 2"" = B:B),0)")
Debug.Print IIf(IsError(m), "No match!", m)
End Sub
注意:使用Worksheet.Evaluate
方法-如果使用Application.Evaluate
,则将在碰巧处于活动状态的工作表中评估您的公式,但可能不会您想要的工作表。
编辑:将变量添加到公式中
Sub Tester2()
Const FRMLA As String = "=MATCH(1,(""<c1>"" = <r1>)*(""<c2>"" = <r2>),0)"
Dim m As Variant, sht As Worksheet, f As String
Dim c1 As String, c2 As String, rng1 As Range, rng2 As Range
Set sht = ActiveSheet 'for example
'specify the formula inputs
Set rng1 = sht.Range("A:A")
Set rng2 = sht.Range("B:B")
c1 = "Criteria 1"
c2 = "Criteria 2"
'replace the tokens in the formula
f = Replace(FRMLA, "<c1>", c1)
f = Replace(f, "<c2>", c2)
f = Replace(f, "<r1>", rng1.Address(False, False))
f = Replace(f, "<r2>", rng2.Address(False, False))
m = sht.Evaluate(f)
Debug.Print IIf(IsError(m), "No match!", m)
End Sub