Ubound(Filter())函数对部分字符串匹配

时间:2016-04-03 10:10:59

标签: excel vba excel-vba filter

对于部分匹配,下面的函数返回true,如果整个字符串匹配,如何修改它以返回True。

E.g。如果数组包含AAAABBB

如果我通过AAA,它也会为A返回True。

Function IsInArray(stringToBeFound As String, arr As Variant) As Boolean
  IsInArray = (UBound(Filter(arr, stringToBeFound, , vbTextCompare)) > -1)
End Function

是否有一个简单的修改,或者我应该编写单独的代码来实现它?

2 个答案:

答案 0 :(得分:4)

您可以使用标记从以下位置删除任何部分匹配:

ary = Array("AAA", "A", "BB", "B")

我们假设 $ 字符没有出现在数组中的任何位置。
我们创建一个字符串:

st = "$" & Join(ary, "$") & "$"

$ AAA $ A $ BB $ B $
如果我们想查看 A 是否在数组中,请检查InStr(st,$A$) > 0如果我们想查看 AAA 是否在数组中,请检查InStr(st,$AAA$) > 0
等。

如果 $ 位于数组中,使用Chr(1)之类的标记作为标记。

修改#1:


实现:

Public Function IsInArray(stringToBeFound As String, arr As Variant) As Boolean
    Dim st As String, M As String

    M = "$"
    st = M & Join(arr, M) & M
    IsInArray = InStr(st, stringToBeFound) > 0
End Function

修改#2:

用法:

因此,如果我们想查看字符串 AA 是否在数组中:

Sub MAIN()
    ary = Array("AA", "BB", "CC", "", "DD")
    MsgBox IsInArray("$AA$", ary)
End Sub

如果我们想查看是否有任何数组元素为空:

Sub MAIN()
    ary = Array("AA", "BB", "CC", "", "DD")
    MsgBox IsInArray("$$", ary)
End Sub

答案 1 :(得分:1)

替代 最接近原始问题'是否进行了简单的修改?' 。它不使用不同的方法,而是使用应用于同一(1dim)数组的相同Filter函数:

语法过滤器(sourcearray,match [,include [,compare]])

       Used compare argument: vbTextCompare, not case sensitive
                              (use vbBinaryCompare if CaseSensitive)

其他功能

此外,它允许在

之间进行选择
  • i)整个字符串搜索。
  • ii)部分匹配,

代码经过测试并执行而不会降低性能

<强>代码

Public Function IsInArray(stringToBeFound As String, arr As Variant, Optional bFull = False) As Boolean
'  Purpose: search strings in 1dim arrays using the Filter function
'           i)  whole strings   (bFull = True) or
'           ii) partial matches (bFull = False, default)
'  Exclude empty strings "" (Note: if not wanted, comment the next line out!)
   If stringToBeFound = "" Then Exit Function
If bFull Then             ' i)  search whole strings
   IsInArray = (UBound(Filter(Split(Join(arr, ".|") & ".|", "|"), stringToBeFound & ".", , vbTextCompare)) > -1)
Else                      ' ii) partial match
   IsInArray = (UBound(Filter(arr, stringToBeFound, , vbTextCompare)) > -1)
End If
End Function

注意

值得注意的是,Filter函数也会接受 ""字符串。这就是我在IsInArray函数中排除的原因;如果您不想这样做,只需注释掉第一个代码行即可。