如何search数组中的string
是否有一个简单的(单行)在VBA中search数组中的string? 或者我需要遍历每个元素,并将其与目标string进行比较?
编辑:这是一个一维数组。 我只需要知道如果一个string在数组中的某处。
IE:
names(JOHN, BOB, JAMES, PHLLIP)
我如何知道“JOHN”是否在数组中,它需要最小化,因为它会重复大约5000次,我不希望函数减慢整个过程。
如果你想知道是否在数组中findstring,试试这个函数:
Function IsInArray(stringToBeFound As String, arr As Variant) As Boolean IsInArray = (UBound(Filter(arr, stringToBeFound)) > -1) End Function
正如肖恩·柴(Sean Cheshire)指出的,这必须是一维数组。
例:
Sub Test() Dim arr As Variant arr = Split("abc,def,ghi,jkl", ",") Debug.Print IsInArray("ghi", arr) End Sub
(以下代码根据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
这也假设一个一维数组。 请记住LBound和UBound是基于零的,所以2的索引代表第三个元素,而不是第二个元素。
例:
Sub Test() Dim arr As Variant arr = Split("abc,def,ghi,jkl", ",") Debug.Print (IsInArray("ghi", arr) > -1) End Sub
如果你有一个具体的例子,请用它更新你的问题,否则示例代码可能不适用于你的情况。
另一种select是使用字典而不是数组:
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
因为这会给你一个单线的
oNames.Exists("JOHN")
字典提供的优点是在Filter
部分匹配上的精确匹配。 说你是否有一个arrays中的原始名单,但是除了我们开始的四个人之外,他们正在寻找实际上是两个新人的“JO”或“PHIL”。 在这种情况下, Filter(oNAMES, "JO")
将匹配可能不需要的“JOHN”。 用字典,它不会。
另一个强制执行精确匹配的选项(即没有部分匹配)将是:
Function IsInArray(stringToBeFound As String, arr As Variant) As Boolean IsInArray = Not IsError(Application.Match(stringToBeFound, arr, 0)) End Function
您可以在http://msdn.microsoft.com/zh-cn/library/office/ff835873(v=office.15);.aspx上阅读有关Match方法及其参数的更多信息
更简单的function这也适用于苹果操作系统:
Function isInArray(ByVal stringToBeFound As String, ByVal arr As Variant) As Boolean For Each element In arr If element = stringToBeFound Then isInArray = True Exit Function End If Next element End Function
有一个函数会返回所有find的string的数组 。
Filter(sourcesrray, match[, include[, compare]])
sourcearray必须是1维的
该函数将返回数组中具有match
string的所有string
这是另一个答案。 它的工作速度快,可靠(请参阅primefaces模的答案),并具有紧凑的调用代码:
' 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
示例用法:
Sub test() Debug.Print "Is 'A' in the list?", IsInArray(Split("A,B", ","), "A") End Sub
如果它是一个常量列表,那么你可以使用Select Case如下:
Dim Item$: Item = "A" Select Case Item Case "A", "B", "C" ' If 'Item' is in the list then do something. Case Else ' Otherwise do something else. End Select
Case
语句可能更简单地适合某些应用程序:
select case var case "a string", "another string", sVar 'do something case else 'do something else end select