Excel VBA中的Concat多个MATCH条件

时间:2014-07-16 17:25:15

标签: excel vba excel-vba

因此,在Excel中,我们知道可以通过连接来测试多个条件,如下所示:

MATCH(criteria1&criteria2, Range(), 0)

其中criteria1criteria2是两个不同的标准。

我试图在Excel VBA中自动执行此操作,如下所示:

WorksheetFunction.Match(criteria1 + "&" + criteria2, Range(), 0)

我的问题是,如何以VBA形式复制与&符号相同的标准串联?在上面的版本中,Excel一直告诉我它不能使用WorkSheetFunction类的Match函数,我将其归因于上面的失败级联尝试。任何建议或意见将不胜感激。

哦,这里有关于在MATCH()中使用多个条件的Microsoft知识库文章的链接:http://support.microsoft.com/kb/59482

编辑:我意识到我并没有将2个范围与我的2个标准相对应。问题是我不知道如何连接2个范围,因为我的形式是:

Range(Cells(1,columnIndex),Cells(rowCount,columnIndex))

而不是A1:A200。关于如何转换或以当前形式连续范围的任何想法?

3 个答案:

答案 0 :(得分:1)

这有效:

Sub dural()
    crit1 = "find "
    crit2 = "happiness"
    N = Application.WorksheetFunction.Match(crit1 & crit2, Range("A1:A10"), 0)
    MsgBox N
End Sub

A3 包含:

找到快乐

修改#1:

考虑多个列中的多个条件的情况。例如:

demo

我们希望 VBA 检索小黑狗的名称

在工作表单元格中没有 VBA ,我们可以使用:

=INDEX(D1:D100,SUMPRODUCT(--(A1:A100="dog")*(B1:B100="small")*(C1:C100="black")*ROW(1:100)),1)

获取名称​​ Oscar

我们可以在 VBA

中使用相同的公式
Sub luxation()
    Dim s As String, s2 As String
    s = "INDEX(D1:D100,SUMPRODUCT(--(A1:A100=""dog"")*(B1:B100=""small"")*(C1:C100=""black"")*ROW(1:100)),1)"
    s2 = Evaluate(s)
    MsgBox s2
End Sub

答案 1 :(得分:1)

不容易映射到VBA实现,但您可以使用Evaluate作弊:

Sub Tester()

    Dim v1, v2, f

    v1 = "y"
    v2 = 11

    Sheet1.Names.Add Name:="X", RefersTo:=v1
    Sheet1.Names.Add Name:="Y", RefersTo:=v2

    f = "MATCH(X&Y,$A$2:$A$5&$B$2:$B$5, 0)"

    Debug.Print Sheet1.Evaluate(f)

End Sub

或跳过名称:

Sub Tester2()

    Const F_TEMPL As String = "MATCH(""{V1}""&""{V2}"",$A$2:$A$5&$B$2:$B$5, 0)"
    Dim v1, v2, f

    f = Replace(F_TEMPL, "{V1}", "x")
    f = Replace(f, "{V2}", 12)

    Debug.Print Sheet1.Evaluate(f)

End Sub

答案 2 :(得分:0)

您仍然需要将MATCH参数体发送为字符串。 '+'不会连接。

WorksheetFunction.Match(criteria1 & "&" & criteria2, Range(), 0)

应该连接两个值并执行匹配。