VBA阵列 - 检查严格(非近似)匹配

时间:2013-01-07 23:38:08

标签: vba excel-2007

If UBound(Filter(myArray, Sheets(i).Cells(1, j).Value, True)) = -1 Then
 'take action
End if

我使用这种语法将在Cells(1,j)中找到的元素(例如“ally”)与数组的所有元素(例如“mally”,“kate”,“becks”)进行比较,并采用找不到完全匹配时的动作。 麻烦的是,根据这一行代码,似乎“盟友”被认为是“匹配”(可能是因为“盟友”是来自“mally”的子串),而我希望“盟友”被认为不同于“mally” ”

有关实现此目的的语法帮助吗?谢谢!

4 个答案:

答案 0 :(得分:4)

IsInArray = Not IsError(Application.Match(stringToBeFound, arr, 0))

答案 1 :(得分:2)

过滤器将返回任何部分匹配的项目。 Microsoft建议的解决方法是在过滤后的数组中搜索完全匹配。

Function FilterExactMatch(astrItems() As String, _
                          strSearch As String) As String()

   ' This function searches a string array for elements
   ' that exactly match the search string.

   Dim astrFilter()   As String
   Dim astrTemp()       As String
   Dim lngUpper         As Long
   Dim lngLower         As Long
   Dim lngIndex         As Long
   Dim lngCount         As Long

   ' Filter array for search string.
   astrFilter = Filter(astrItems, strSearch)

   ' Store upper and lower bounds of resulting array.
   lngUpper = UBound(astrFilter)
   lngLower = LBound(astrFilter)

   ' Resize temporary array to be same size.
   ReDim astrTemp(lngLower To lngUpper)

   ' Loop through each element in filtered array.
   For lngIndex = lngLower To lngUpper
      ' Check that element matches search string exactly.
      If astrFilter(lngIndex) = strSearch Then
         ' Store elements that match exactly in another array.
         astrTemp(lngCount) = strSearch
         lngCount = lngCount + 1
      End If
   Next lngIndex

   ' Resize array containing exact matches.
   ReDim Preserve astrTemp(lngLower To lngCount - 1)

   ' Return array containing exact matches.
   FilterExactMatch = astrTemp
End Function

此代码取自http://msdn.microsoft.com/en-us/library/office/aa164525%28v=office.10%29.aspx

答案 2 :(得分:2)

如果您不需要使用过滤器,那么以下代码段将起作用

Dim v
Dim bMatch As Boolean
bMatch = False

For Each v In myArray
    'compare strings
    If StrComp(CStr(v), Sheets(i).Cells(1, j).Value, vbTextCompare) = 0 Then
        bMatch = True
    End If
Next

If Not bMatch Then
'do something
End If

答案 3 :(得分:2)

如果数组仅用于此比较而不需要其他任何内容,您还可以通过添加自己的数据中未出现的分隔符强制进行完整的单词比较 - 也许是方括号。
因此,如果您更改数组以包含“[mally]”,“[kate]”,“[becks]”
然后你的状况变成:

If UBound(Filter(myArray, "[" & Sheets(i).Cells(1, j).Value & "]", True)) = -1