如何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维的
该函数将返回数组中具有matchstring的所有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