匹配和2个匹配条件的VBA代码问题

时间:2019-09-09 22:11:42

标签: excel vba

尝试在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)分配给了变量来确定)

1 个答案:

答案 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