VBA поиск (найти) значение в массиве

В этом руководстве будет показано, как искать (находить) значение в массиве в VBA.

Существует несколько способов поиска строки в массиве - в зависимости от того, является ли массив одномерным или многомерным.

Поиск в одномерном массиве

Для поиска значения в одномерном массиве вы можете использовать функцию фильтра.

123 Dim z как вариант'фильтровать исходный массивz = Фильтр (Массив, Строка, Истина, vbCompareBinary)

Синтаксис опции фильтра следующий

Фильтр (исходный массив, сопоставить как строку, [включить как логическое], [сравнить как vbCompareMethod])

В Исходный массив и Соответствовать как строка требуются, в то время как Включить как логическое и Сравнить как vbCompareMethod являются необязательными. Если они не включены, для них установлено значение Правда а также vbCompareBinary соответственно.

Найдите значения, соответствующие фильтру

1234567891011121314 Sub FindBob ()'Создать массивDim strName () как вариантstrName () = Array («Боб Смит», «Джон Дэвис», «Фред Джонс», «Стив Дженкинс», «Боб Уильямс»)'объявить вариант для хранения данных фильтра вDim strSubNames как вариант'фильтровать исходный массивstrSubNames = Фильтр (strName, «Боб»)'если значение LBound больше -1, значит, значение найденоЕсли LBound (strSubNames)> -1, то MsgBox («Я нашел Боба»)Конец подписки

Второй массив будет содержать значения, найденные фильтром. Если ваши значения LBound и UBound не равны -1, значит массиву удалось найти значение, которое вы искали.

Вы также можете увидеть, сколько раз текст появляется в исходном массиве.

1234567891011121314 Sub CountNames ()'Создать массивDim strName () как вариантstrName () = Array («Боб Смит», «Джон Дэвис», «Фред Джонс», «Стив Дженкинс», «Боб Уильямс»)'объявить массив для хранения данных фильтра вDim strSubNames как вариант'фильтровать исходный массивstrSubNames = Фильтр (strName, «Боб»)'если вы вычтите LBound из значений UBound и добавите 1, мы получим количество раз, когда текст появляетсяMsgbox UBound (strSubNames) - LBound (strSubNames) + 1 & «имена найдены».Конец подписки

Найдите значения, которые НЕ соответствуют фильтру

В [Включить как логическое] опция позволяет вам узнать, сколько значений в вашем массиве, которые НЕ НАДО соответствовать вашему фильтру

1234567891011121314 Sub CountExtraNames ()'создать массивDim strName () как вариантstrName () = Array («Боб Смит», «Джон Дэвис», «Фред Джонс», «Стив Дженкинс», «Боб Уильямс»)'объявить массив для хранения данных фильтра вDim strSubNames как вариант'фильтровать исходный массивstrSubNames = Фильтр (strName, «Боб», ложь)'если вы вычтите LBound из значений UBound и добавите 1, мы получим количество раз, когда текст появляетсяMsgbox UBound (strSubNames) - LBound (strSubNames) + 1 & «имена найдены».Конец подписки

поэтому мы изменили эту строку:

1 strSubNames = Фильтр (strName, «Боб»)

с этой строкой:

1 strSubNames = Фильтр (strName, «Боб», ложь)

Использование этой строки в коде вернет все имена, НЕ совпадающие с «Боб».

Фильтры с учетом регистра

Вы обнаружите, что фильтр по умолчанию чувствителен к регистру. Это верно для всех функций VBA. Если вы хотите искать текст без учета регистра, вам нужно немного изменить код.

1 z = Фильтр (strName, "bob" ,, vbTextCompare)

Добавление vbTextCompare к вашей строке фильтра позволит вашему коду найти «bob» или «Bob». Если это опущено, VBA по умолчанию использует vbBinaryCompare который будет искать только те данные, которые ТОЧНЫЙ соответствие. Обратите внимание, что в приведенном выше примере мы не учли [Включить как логическое] аргумент, поэтому предполагается True.

Вариант Сравнить текст

Как вариант, вы можете добавить текст Вариант Сравнить текст в верхнюю часть вашего модуля - это сделает все функции, которые вы пишете в этом конкретном модуле, нечувствительными к регистру.

Использование цикла для поиска в массиве

Использование цикла немного сложнее, чем использование функции фильтра. Мы можем создать функцию, которая будет перебирать все значения в массиве.

1234567891011121314151617 Sub LoopThroughArray ()'создать массивDim strName () как вариантstrName () = Array («Боб Смит», «Джон Дэвис», «Фред Джонс», «Стив Дженкинс», «Боб Уильямс»)Dim str Найти как строкуstrFind = "Боб"Тусклый я до тех пор, пока'перебирать массивДля i = LBound (strName, 1) To UBound (strName, 1)Если InStr (strName (i), strFind)> 0, тоMsgBox "Боб найден!"Выход дляКонец, еслиДалее яКонец подписки

Чтобы найти часть текстовой строки, то есть «Боб» вместо «Боб Смит» или «Боб Вильямс», нам нужно было использовать функцию Instr в операторе If. Он просматривал строку, возвращаемую циклом из массива, чтобы увидеть, был ли «Боб» в строке, и, поскольку он был в строке, он вернул бы окно сообщения и затем вышел из цикла.

Поиск в многомерном массиве

Мы также используем цикл для поиска в многомерном массиве. Еще раз, нам нужно создать функцию, которая позволит нам перебрать все значения в массиве, но на этот раз нам также нужно перебрать каждое измерение массива.

123456789101112131415161718192021222324252627 Функция LoopThroughArray ()Dim varArray () как вариантDim str Найти как строкуstrFind = "Доктор"'объявить размер массиваReDim varArray (1, 2)'инициализировать массивvarArray (0, 0) = "Мел Смит"varArray (0, 1) = "Фред Бакл"varArray (0, 2) = "Джейн Эйр"varArray (1, 0) = "Бухгалтер"varArray (1, 1) = "Секретарь"varArray (1, 2) = "Доктор"'объявить переменные для циклаDim i до тех пор, j до тех пор'цикл для первого измеренияДля i = LBound (varArray, 1) To UBound (varArray, 1)'цикл для второго измеренияДля j = LBound (varArray, 2) To UBound (varArray, 2)'если мы найдем значение, тогда msgbox скажет, что у нас есть значение, и выйдет из функцииЕсли varArray (i, j) = strFind ТогдаMsgBox "Доктор найден!"Функция выходаКонец, еслиСледующий jДалее яКонечная функция

Вы поможете развитию сайта, поделившись страницей с друзьями

wave wave wave wave wave