Ubound(Filter())函数对部分string匹配返回true
下面的函数对部分匹配返回true
,我怎么修改它只有在整个string匹配时才返回True。
例如,如果数组有AAA
, A
, BB
, B
如果我通过AAA
它也返回True。
Function IsInArray(stringToBeFound As String, arr As Variant) As Boolean IsInArray = (UBound(Filter(arr, stringToBeFound, , vbTextCompare)) > -1) End Function
有没有一个简单的修改,或者我应该编写单独的代码来实现呢?
您可以使用标记从以下位置删除任何部分匹配项:
ary = Array("AAA", "A", "BB", "B")
假设$字符不出现在数组的任何地方。
我们做一个string,如:
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:
用法:
所以如果我们想看看stringAA是否在数组中:
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
这个select 最接近原来的问题“是否有一个简单的修改? 。 而不是使用不同的方法,它使用相同的Filter
函数应用于相同的(1dim)数组:
语法filter(sourcearray,match [,include [,compare]])
Used compare argument: vbTextCompare, not case sensitive (use vbBinaryCompare if CaseSensitive)
附加function
此外,它允许select
- 我)整个stringsearch。
- ii)部分匹配,
代码经过testing并且执行时不会损失性能 。
码
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
函数也会接受空的 ""
string。 这就是为什么我将它们排除在IsInArray函数中的原因。 如果你不想要的话,只需要将第一行代码注释掉。