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

Excel 带有匹配和2个匹配条件的VBA代码问题,excel,vba,Excel,Vba,尝试在VBA中使用具有两个匹配条件的application.match函数返回两个条件都存在的行号。我可以直接在工作表中键入并获得正确答案,但当转换为VBA代码时,我会收到一个类型不匹配错误(13) 这就是我直接在工作表中键入的内容,并返回正确的行号:{=Match(1,(“条件1”=A:A)*(“条件2”=B:B),0)}。条件1和条件2是文本字符串。A列和B列中的数据是文本和数字的混合体 这是我在VBA中尝试的等效代码,导致类型不匹配错误: Result = application.matc

尝试在VBA中使用具有两个匹配条件的application.match函数返回两个条件都存在的行号。我可以直接在工作表中键入并获得正确答案,但当转换为VBA代码时,我会收到一个
类型不匹配错误(13)

这就是我直接在工作表中键入的内容,并返回正确的行号:
{=Match(1,(“条件1”=A:A)*(“条件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)
尝试了较短的测试行,但也出现类型不匹配错误:

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都存在的行号(结果)。“局部变量”窗口显示条件1是一个变量/字符串。我尝试了一个精简版本的代码,并得到了类似的错误。本例中的结果是Test,而Locals窗口显示Test类型是Variant/Double,Criteria1是Variant/String,Range(“A:A”)是Variant/Variant(我将Range(A:A)分配给一个变量以确定这一点)

您可以通过
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
注意:使用
工作表。评估
方法-如果您使用
应用程序。评估
,那么您的公式将在恰好处于活动状态的任何工作表的上下文中进行评估,该工作表可能不是您想要的工作表

编辑:将变量添加到公式中

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
Sub Tester2()
常量FRMLA As String=“=匹配(1,(“”=)*(“”=),0)”
Dim m作为变量,sht作为工作表,f作为字符串
尺寸c1作为字符串,c2作为字符串,rng1作为范围,rng2作为范围
例如,设置sht=ActiveSheet
'指定公式输入
设置rng1=短程范围(“A:A”)
设置rng2=sht.范围(“B:B”)
c1=“标准1”
c2=“标准2”
'替换公式中的标记
f=更换(FRMLA,“,c1)
f=替换(f,“,c2)
f=替换(f,“,rng1.地址(假,假))
f=替换(f,“,rng2.地址(假,假))
m=短评估(f)
调试。打印IIf(iError(m),“不匹配!”,m)
端接头

谢谢!你建议的代码有效。了解我的原始代码为什么不起作用了吗?你混合了VBA和工作表公式语法-它就是不起作用。我相信我需要VBA语法,因为我最终要做的是从数组中传入匹配条件,并在循环中传入搜索列/范围。我弄乱了evaluate方法,但无法让它接受变量。evaluate将接受变量,但它们需要连接到evaluate操作的最终公式字符串中。如果你用你尝试过的方法更新你的问题,我可以建议一些修复方法。效果很好。我不熟悉<>语法。我试着寻找,但只找到了不一样的。你能告诉我这个语法叫什么吗?这样我就能读懂了。请把代码部分格式化为代码块。