【问题标题】:Excel VBA: Can't get a match, error "Unable to get the Match property of the WorksheetFunction class"Excel VBA:无法获得匹配,错误“无法获得 WorksheetFunction 类的匹配属性”
【发布时间】:2013-07-19 16:49:07
【问题描述】:

看在一切美好事物的份上,我似乎无法让它发挥作用。我不断收到上面提到的错误。

我有这张表,我试图找出代码是否与另一列中某处的它自己的子代码匹配,但是它出错了。非常感谢您的帮助。

Sub testing()

    Dim m1 As long
    Dim myrange As Range

    Set myrange = Worksheets("Sheet1").Range("B2:B23")

    For e = 2 To 23
        m1= Application.WorksheetFunction.Match(Cells(e, 1).Value, myrange, 0)

        If m1 > 0 Then
            Cells(e, 3).Value = "Yes"
        Else
            Cells(e, 3).Value = "No"
        End If
    Next e

MsgBox "Complete!"

End Sub

【问题讨论】:

  • 大卫的答案是正确的,但为什么不把公式放在C列呢?
  • 嗨,Doug,我需要将它与我稍后想做的其他功能结合使用,我只能通过 VBA 代码以最佳方式完成。

标签: vba excel vlookup


【解决方案1】:

使用Application.Match 函数可以更好地捕获错误。使用WorksheetFunction.Match 时,如果找不到匹配项,则会返回错误,这就是您遇到的情况。

If Not IsError(Application.Match(Cells(e, 1).Value, myrange, 0)) Then
    'Do stuff when the match is found
    Cells(e, 3).Value = "Yes"
Else:
    Cells(e, 3).Value = "No"
End If

您还可以使用CountIf 函数:

If Application.WorksheetFunction.CountIf(myRange, Cells(e,1).Value) > 0 Then
    Cells(e,3).Value = "Yes"
Else:
    Cells(e,3).Value = "No"
End If

这两种方法都不需要您使用m1 变量,如果您需要识别匹配项where,您可以在If/Then 语句的True 部分中分配此变量找到了。

【讨论】:

  • 快速提问:如果您想“匹配”单元格中的部分值怎么办,您会使用什么函数?
  • 这取决于部分匹配的复杂程度。这可能很简单,例如计算以“steve”开头的任何单元格的出现次数,CountIf 函数中的第二个参数类似于"steve*",或者如果您正在寻找包含单词的任何单元格“史蒂夫”,你可以使用"*steve*"等。更复杂的,你可能想看看使用正则表达式。
【解决方案2】:

作为另一种选择,这也可以通过将下面的公式放入单元格 C2 中,然后将其向下拖动到 C23 来完成。

=IF(COUNTIF($A$2:$A$23,B2)>=1,"YES","NO")

【讨论】:

  • +1,这是要走的路,除非有一些令人信服的理由使用 VBA。
  • 试图找到一个匹配的部分与另一组代码一起使用。
猜你喜欢
  • 2023-03-22
  • 1970-01-01
  • 2014-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-13
相关资源
最近更新 更多