【问题标题】:Concat multiple MATCH criteria in Excel VBA在 Excel VBA 中连接多个 MATCH 条件
【发布时间】:2018-03-30 21:38:03
【问题描述】:

所以在 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。有关如何转换或连接当前形式的范围的任何想法?

【问题讨论】:

  • 您可以使用Address() 将您的 Range 对象转换为字符串版本。

标签: vba excel


【解决方案1】:

这行得通:

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

例如 A3 包含:

寻找幸福

编辑#1:

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

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

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

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

获得奥斯卡的名字

我们可以在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

【讨论】:

  • 问题是我正在测试多个标准,这两个标准都必须存在;例如,它是 Match(date & ID, Range(), 0),并且匹配必须具有正确的日期和 ID,而不是两者的串联。
  • 您是否在两个 单元格中考虑标准, 所以 A4 必须有正确的日期,而 B4 有正确的日期ID 然后返回 4?
  • @Gary'sStudent - 请参阅原始问题中的链接
  • 是的@Gary'sStudent,这就是我的意思。我意识到问题是我没有放入 2 个范围,因为我有 2 个标准,如示例所示。问题是,我不知道如何将 Range(Cells(),Cells()) 范围转换为“A2:A10”样式范围。
  • 我会使用与工作表单元格中相同的公式......我喜欢 SUMPRODUCT() ...请参阅我的 EDIT#1
【解决方案2】:

不容易映射到 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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-08-11
      • 2022-11-12
      • 2017-11-03
      • 1970-01-01
      • 2019-10-09
      • 1970-01-01
      相关资源
      最近更新 更多