【问题标题】:VBA code issue with Match and 2 matching criteria匹配和 2 个匹配条件的 VBA 代码问题
【发布时间】:2019-09-09 22:11:42
【问题描述】:

尝试在 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)

我希望此代码返回同时存在 Criteria 1 和 Criteria 2 的行号(结果)。 Locals 窗口显示 Criteria 1 是 Variant/String。我尝试了代码的精简版本,并得到了类似的错误。本例的结果是 Test,Locals 窗口显示 Test type 是 Variant/Double,Criteria1 是 Variant/String 并且 Range("A:A") 是 Variant/Variant(我将 Range(A:A) 分配给变量来确定这一点)

【问题讨论】:

  • 请将代码部分格式化为代码块。

标签: excel vba


【解决方案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

【讨论】:

  • 谢谢!您建议的代码有效。了解为什么我的原始代码不起作用?
  • 您正在混合使用 VBA 和工作表公式语法 - 它只是不能那样工作。
  • 我相信我需要 VBA 语法,因为最终我要做的是从数组中传入匹配条件,并在循环中传入搜索列/范围。我弄乱了评估方法,但无法让它接受变量。
  • Evaluate 将接受变量,但它们需要连接到 Evaluate 操作的最终公式字符串中。如果您用您尝试过的方法更新您的问题,我可以提出一些修复建议。
  • 效果很好。我不熟悉 语法。我尝试搜索,但只找到不相等。你能指出这个语法叫什么,以便我可以阅读它吗?
猜你喜欢
  • 2016-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-28
相关资源
最近更新 更多