如何在VBA中编码=MATCH(1,(A:A=J1)*(B:B=K1)*(C:C=L1),0)?

How to code =MATCH(1,(A:A=J1)*(B:B=K1)*(C:C=L1),0) in VBA?

提问人:user22290834 提问时间:7/27/2023 最后编辑:Paul T.user22290834 更新时间:11/12/2023 访问量:73

问:

发件人:在 excel 中查找具有多个匹配条件
的 ROW 编号“如果您需要匹配多个列值来检索行号,也就是说,如果两列或多列一起创建一个唯一 ID,则可以使用带有 MATCH 的数组公式,如下所示:

MATCH(1,(A:A=J1)*(B:B=K1)*(C:C=L1),0)  

其中 A、B、C 包含要匹配的列数组,用于检索分别对应于 J1、K1、L1 中值的唯一行号。

有关分步指南,请阅读 Christian Pedersen 的 Explainer”

它在工作表中作为 Excel 公式工作。如何在 Excel VBA 中为我的目的对其进行编码?

我试过了:

Dim var As Variant
 
Sheets("MySheet").Select

'Use "1234567" is double quotes
'var = WorksheetFunction.Match(1, (Range("D:D") = "1234567") * (Range("F:F") = "Text Here"), 0)

'Use 1234567 without the quotes
var = WorksheetFunction.Match(1, (Range("D:D") = 1234567) * (Range("F:F") = "Text Here"), 0)

我删除了注释标记并独立尝试了每种方式。

两者的结果相同:

运行时错误“13”:
类型不匹配

Excel VBA 匹配

评论

2赞 Tom Sharpe 7/27/2023
也许与这个问题类似 stackoverflow.com/questions/76748554/......它不能像你所希望的那样直接翻译成VBA,但有一个使用评估的解决方法。

答:

1赞 Tim Williams 7/27/2023 #1

例如:

Sub Tester()

    Dim ws As Worksheet, f As String, res
    
    Set ws = ThisWorkbook.Worksheets("MySheet")
    
    f = "MATCH(1,(D:D=<num>)*(F:F=""<txt>""),0)"
    
    f = Replace(f, "<num>", 1234)
    f = Replace(f, "<txt>", "Text here")
    
    res = ws.Evaluate(f)  'evaluate in context of sheet `ws`
    
    If Not IsError(res) Then
        Debug.Print "matched row " & res
    Else
        Debug.Print "No match"
    End If
    
End Sub

请注意,如果列类型不是数字,则公式需要在值两边加上引号。