是否有一个简单的(单行)在VBA中搜索数组中的字符串?或者我是否需要遍历每个元素并将其与目标字符串进行比较?
编辑:这是一维数组.我只需要知道如果字符串在数组中的某个位置.
IE:
names(JOHN, BOB, JAMES, PHLLIP)
Run Code Online (Sandbox Code Playgroud)
我怎么知道阵列中是否有"JOHN",它需要是最小的,因为它将重复约5000次,我不希望该功能减慢整个过程.
Jim*_*ena 64
如果您想知道字符串是否在数组中找到,请尝试以下函数:
Function IsInArray(stringToBeFound As String, arr As Variant) As Boolean
IsInArray = (UBound(Filter(arr, stringToBeFound)) > -1)
End Function
Run Code Online (Sandbox Code Playgroud)
正如Sean Cheshire指出的那样,这必须是一维阵列.
例:
Sub Test()
Dim arr As Variant
arr = Split("abc,def,ghi,jkl", ",")
Debug.Print IsInArray("ghi", arr)
End Sub
Run Code Online (Sandbox Code Playgroud)
(根据HansUp的评论更新代码)
如果你想要数组中匹配元素的索引,试试这个:
Function IsInArray(stringToBeFound As String, arr As Variant) As Long
Dim i As Long
' default return value if value not found in array
IsInArray = -1
For i = LBound(arr) To UBound(arr)
If StrComp(stringToBeFound, arr(i), vbTextCompare) = 0 Then
IsInArray = i
Exit For
End If
Next i
End Function
Run Code Online (Sandbox Code Playgroud)
这也假定为1-D阵列.请记住LBound和UBound是从零开始的,因此索引2表示第三个元素,而不是第二个元素.
例:
Sub Test()
Dim arr As Variant
arr = Split("abc,def,ghi,jkl", ",")
Debug.Print (IsInArray("ghi", arr) > -1)
End Sub
Run Code Online (Sandbox Code Playgroud)
如果您有特定的示例,请使用它更新您的问题,否则示例代码可能不适用于您的情况.
ato*_*les 23
另一种选择是使用字典而不是数组:
Dim oNames As Object
Set oNames = CreateObject("Scripting.Dictionary")
'You could if need be create this automatically from an existing Array
'The 1 is just a dummy value, we just want the names as keys
oNames.Add "JOHN", 1
oNames.Add "BOB", 1
oNames.Add "JAMES", 1
oNames.Add "PHILIP", 1
Run Code Online (Sandbox Code Playgroud)
因为这会让你成为一个单线
oNames.Exists("JOHN")
Run Code Online (Sandbox Code Playgroud)
字典提供的优势是与部分匹配的精确匹配Filter.假如你在数组中有原始的名字列表,但是在寻找"JO"或"PHIL",除了我们开始使用的四个人之外,他们实际上是两个新人.在这种情况下,Filter(oNAMES, "JO")将匹配可能不需要的"JOHN" .用字典,它不会.
Bri*_*hey 13
强制完全匹配(即没有部分匹配)的另一个选项是:
Function IsInArray(stringToBeFound As String, arr As Variant) As Boolean
IsInArray = Not IsError(Application.Match(stringToBeFound, arr, 0))
End Function
Run Code Online (Sandbox Code Playgroud)
您可以在http://msdn.microsoft.com/en-us/library/office/ff835873(v=office.15).aspx上阅读有关Match方法及其参数的更多信息.
有一个函数将返回找到的所有字符串的数组。
Filter(sourcearray, match[, include[, compare]])
sourcearray必须是一维的
。函数将返回数组中所有包含字符串的match字符串
更简单的功能也适用于Apple OS:
Function isInArray(ByVal stringToBeFound As String, ByVal arr As Variant) As Boolean
Dim element
For Each element In arr
If element = stringToBeFound Then
isInArray = True
Exit Function
End If
Next element
End Function
Run Code Online (Sandbox Code Playgroud)
这是另一个答案。它工作快速、可靠(参见 atomicules 的回答)并且具有紧凑的调用代码:
' Returns true if item is in the array; false otherwise.
Function IsInArray(ar, item$) As Boolean
Dim delimiter$, list$
' Chr(7) is the ASCII 'Bell' Character.
' It was chosen for being unlikely to be found in a normal array.
delimiter = Chr(7)
' Create a list string containing all the items in the array separated by the delimiter.
list = delimiter & Join(ar, delimiter) & delimiter
IsInArray = InStr(list, delimiter & item & delimiter) > 0
End Function
Run Code Online (Sandbox Code Playgroud)
示例用法:
Sub test()
Debug.Print "Is 'A' in the list?", IsInArray(Split("A,B", ","), "A")
End Sub
Run Code Online (Sandbox Code Playgroud)