В этом руководстве будет показано, как искать (находить) значение в массиве в 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Далее яКонечная функция |