2013-07-19 74 views
8

对于所有这一切都很好的爱,我似乎无法得到它的工作。我不断收到上面提到的错误。Excel VBA:无法获得匹配,错误“无法获得WorksheetFunction类的匹配属性”

我有这个表,我试图找出代码是否匹配它自己的子代码在另一列内的某个地方,但它是错误的。非常感谢您的帮助。

enter image description here

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 
+0

大卫的答案是正确的,但为什么不把公式放在C列? –

+0

嗨,道格,我需要将它与其他我稍后想要做的功能一起使用,我只能通过VBA代码优化。 –

回答

14

使用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变量,你可以在If/Then语句True部分内,如果指定此变量,您需要识别,其中找到匹配项。

+0

谢谢,这工作!非常感激。 –

+0

快速问题:如果你想“匹配”单元格内的部分值,你会用什么函数? –

+0

这取决于部分匹配的复杂程度。这可能很简单,例如要计算任何以“steve”开头的单元格的出现次数,“CountIf”函数中的第二个参数将像“steve *'”,或者如果您正在查找包含单词“史蒂夫”,你可以使用'“*史蒂夫*”'等等。更复杂的,你可能想看看使用正则表达式。 –

2

就像另一个选项一样,这也可以通过将下面的公式放在C2单元格中并将其拖动到C23来完成。

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

+1,除非VBA有一些令人信服的理由,否则这是要走的路。 –

+1

试图找到匹配以便与另一组代码一起使用。 –

相关问题