Вопрос по arrays, vba – Как искать строку в массиве

33

Есть ли простой (однострочный) поиск строки в массиве в VBA? Или мне нужно будет пройти через каждый элемент и сравнить его с целевой строкой?

РЕДАКТИРОВАТЬ: Это одномерный массив. Мне нужно только знатьIF строка находится где-то в массиве.

IE:

names(JOHN, BOB, JAMES, PHLLIP)

Как я узнаю, что & quot; JOHN & quot; находится в массиве, он должен быть минимальным, так как он будет повторяться около 5000 раз, и я не хочу, чтобы функция замедляла весь процесс.

Сколько измерений? Fionnuala
Вы просто хотите узнать, является ли строка одним из элементов массива? Или вы хотите индекс соответствующего элемента? JimmyPena

Ваш Ответ

8   ответов
5

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
13

обеспечивающий точное совпадение (то есть частичное совпадение не будет):

Function IsInArray(stringToBeFound As String, arr As Variant) As Boolean
  IsInArray = Not IsError(Application.Match(stringToBeFound, arr, 0))
End Function

Вы можете прочитать больше о методе Match и его аргументах на http://msdn.microsoft.com/en-us/library/office/ff835873(v=office.15).aspx

55

найдена ли строка в массиве, попробуйте эту функцию:

Function IsInArray(stringToBeFound As String, arr As Variant) As Boolean
  IsInArray = (UBound(Filter(arr, stringToBeFound)) > -1)
End Function

КакШон Чешир указывает, что это должен быть одномерный массив.

Example:

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

Это также предполагает 1-D массив. Помните, что LBound и UBound начинаются с нуля, поэтому индекс 2 означает третий элемент, а не второй.

Example:

Sub Test()
  Dim arr As Variant
  arr = Split("abc,def,ghi,jkl", ",")
  Debug.Print (IsInArray("ghi", arr) > -1)
End Sub

If you have a specific example in mind, please update your question with it, otherwise example code might not apply to your situation.

Обратите внимание, что вы получите ошибку, если начальный массив пуст. Смотрите такжеstackoverflow.com/questions/206324/…
Вторая версияIsInArray возвращает 0, еслиstringToBeFound не найден вarr.
@ HansUp Вы правы, но я мог бы просто удалить весь этот фрагмент кода, так как ОП все равно не хочет :)
+1 хороший пост JP. Фильтр слишком редко используется.
Я бы назначил значение, такое как -1, которое не может быть возвращеноUBound() непустого массива.Dim lngReturn As Long; lngReturn = -1 ЕслиstringToBeFound найден:lngReturn = i  В заключение,IsInArray = lngReturn
4

array из всех найденных строк.

Filter(sourcesrray, match[, include[, compare]])
Sourcearray должен быть одномерным
Функция вернет все строки в массиве, которые имеютmatch струна в них

1

то вы можете использовать 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
0

Case Заявление может подойти для некоторых приложений более просто:

case "a string", "another string", sVar
  'do something
case else
  'do something else
end select
2

надежно (см. Ответ 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

Sample usage:

Sub test()
    Debug.Print "Is 'A' in the list?", IsInArray(Split("A,B", ","), "A")
End Sub
21

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, Скажите, если у вас есть исходный список имен в массиве, но вы искали & quot; JO & quot; или "PHIL"; которые были фактически двумя новыми людьми в дополнение к четырем, с которыми мы начали. В этом случае,Filter(oNAMES, "JO") будет соответствовать & quot; JOHN & quot; которыйmay не желательно Со словарем это не получится.

Похожие вопросы