如何在数组中搜索字符串

aSy*_*oad 38 arrays vba

是否有一个简单的(单行)在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)

如果您有特定的示例,请使用它更新您的问题,否则示例代码可能不适用于您的情况.

  • 如果在`arr`中找不到`stringToBeFound`,则第二版IsInArray返回0。 (2认同)
  • 我将分配一个值,例如-1,该值不能由非空数组的UBound()返回。`Dim lngReturn as Long; lngReturn = -1`如果找到`stringToBeFound`:`lngReturn = i`最后,`IsInArray = lngReturn` (2认同)
  • @HansUp你是对的,但是我可以简单地删除整段代码,因为OP仍然不想要它:) (2认同)

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方法及其参数的更多信息.


Sea*_*anC 7

有一个函数将返回找到的所有字符串的数组

Filter(sourcearray, match[, include[, compare]])
sourcearray必须是一维的
。函数将返回数组中所有包含字符串的match字符串


Seb*_*eck 5

更简单的功能也适用于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)


Cha*_*imG 5

这是另一个答案。它工作快速、可靠(参见 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)