对于部分匹配,下面的函数返回true
,如果整个字符串匹配,如何修改它以返回True。
E.g。如果数组包含AAA
,A
,BB
,B
如果我通过AAA
,它也会为A
返回True。
Function IsInArray(stringToBeFound As String, arr As Variant) As Boolean
IsInArray = (UBound(Filter(arr, stringToBeFound, , vbTextCompare)) > -1)
End Function
是否有一个简单的修改,或者我应该编写单独的代码来实现它?
答案 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)
其他功能
此外,它允许在
之间进行选择代码经过测试并执行而不会降低性能。
<强>代码强>
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函数中排除的原因;如果您不想这样做,只需注释掉第一个代码行即可。