Цей підручник покаже, як шукати (знаходити) значення в масиві у VBA
Існує кілька способів пошуку рядка в масиві - в залежності від того, чи є він одновимірним чи багатовимірним.
Пошук в одновимірному масиві
Для пошуку значення в одновимірному масиві можна скористатися функцією фільтра.
123 | Dim z як варіант'фільтрувати вихідний масивz = Фільтр (масив, рядок, True, vbCompareBinary) |
Синтаксис параметра Фільтр виглядає наступним чином
Фільтр (масив джерел, зіставити як рядок, [включити як логічне значення], [порівняти як vbCompareMethod])
The Джерело масив та Відповідати як рядок потрібні, поки Включити як булеве та Порівняйте як vbCompareMethod є необов’язковими. Якщо вони не включені, для них встановлено значення Правда та vbCompareBinary відповідно.
Знайдіть значення, які відповідають фільтру
1234567891011121314 | Sub FindBob ()'Створити масивDim strName () як варіантstrName () = Масив ("Боб Сміт", "Джон Девіс", "Фред Джонс", "Стів Дженкінс", "Боб Вільямс")'оголосити варіант для зберігання даних фільтраЗатемнити strSubNames як варіант'фільтрувати вихідний масивstrSubNames = Фільтр (strName, "Боб")'якщо значення LBound більше -1, то значення було знайденоЯкщо LBound (strSubNames)> -1 Тоді MsgBox ("Я знайшов Боба")End Sub |
Другий масив буде містити значення, знайдені фільтром. Якщо ваші значення LBound і UBound не -1, то масиву вдалося знайти значення, яке ви шукали.
Ви також можете побачити, скільки разів текст з'являється у вихідному масиві.
1234567891011121314 | Sub CountNames ()'Створити масивDim strName () як варіантstrName () = Масив ("Боб Сміт", "Джон Девіс", "Фред Джонс", "Стів Дженкінс", "Боб Вільямс")'оголосити масив для зберігання даних фільтраЗатемнити strSubNames як варіант'фільтрувати вихідний масивstrSubNames = Фільтр (strName, "Боб")'якщо мінус LBound зі значень UBound і додати 1, ми отримаємо кількість разів, коли текст з'явитьсяMsgbox UBound (strSubNames) - LBound (strSubNames) + 1 & "імена знайдені".End Sub |
Знайдіть значення, які НЕ відповідають фільтру
The [Включити як логічне значення] Параметр дозволяє вам дізнатися, скільки значень у вашому масиві НЕ відповідає вашому фільтру
1234567891011121314 | ПідрахунокExtraNames ()'створити масивDim strName () як варіантstrName () = Масив ("Боб Сміт", "Джон Девіс", "Фред Джонс", "Стів Дженкінс", "Боб Вільямс")'оголосити масив для зберігання даних фільтраЗатемнити strSubNames як варіант'фільтрувати вихідний масивstrSubNames = Фільтр (strName, "Bob", False)'якщо мінус LBound зі значень UBound і додати 1, ми отримаємо кількість разів, коли текст з'явитьсяMsgbox UBound (strSubNames) - LBound (strSubNames) + 1 & "імена знайдені".End Sub |
тому ми змінили цей рядок:
1 | strSubNames = Фільтр (strName, "Боб") |
з цим рядком:
1 | strSubNames = Фільтр (strName, "Bob", False) |
Використовуючи цей рядок у коді, можна було б повернути всі імена, які НЕ відповідають “Bob”.
Фільтри, чутливі до регістру
Ви побачите, що за замовчуванням фільтр чутливий до регістру. Це справедливо для всіх функцій VBA. Якщо ви хочете шукати текст, який не чутливий до регістру, вам потрібно трохи змінити код.
1 | z = Фільтр (strName, "bob" ,, vbTextCompare) |
Додавання vbTextCompare до вашого рядка фільтра дозволить вашому коду знайти "bob" або "Bob". Якщо це опущено, за замовчуванням використовується VBA vbBinaryCompare який буде шукати лише дані, які є ТОЧНО матч. Зауважте, у наведеному вище прикладі ми залишили [Включити як логічне значення] аргумент, тому передбачається True.
Опція Порівняти текст
Крім того, ви можете додати текст Опція Порівняти текст у верхній частині вашого модуля - це зробить усі функції, які ви пишете у цьому конкретному регістрі модуля, нечутливими.
Використання циклу для пошуку в масиві
Використання циклу трохи складніше, ніж використання функції фільтра. Ми можемо створити функцію, яка буде перебирати всі значення в масиві.
1234567891011121314151617 | Sub LoopThroughArray ()'створити масивDim strName () як варіантstrName () = Масив ("Боб Сміт", "Джон Девіс", "Фред Джонс", "Стів Дженкінс", "Боб Вільямс")Знайти як рядокstrFind = "Боб"Dim i As Long'цикл через масивДля i = LBound (strName, 1) До UBound (strName, 1)Якщо InStr (strName (i), strFind)> 0 ТодіMsgBox "Боб знайдений!"Вийти дляЗакінчити ЯкщоДалі iEnd Sub |
Для того, щоб знайти частину текстового рядка, тобто "Боб" замість "Боб Сміт" або "Боб Вільямс", нам потрібно було використати функцію Instr у операторі If. Це виглядало у рядку, що повертається циклом з масиву, щоб побачити, чи є "Bob" у рядку, і як це було в рядку, він повертає вікно повідомлення, а потім виходить із циклу.
Пошук у багатовимірному масиві
Ми також використовуємо цикл для пошуку у багатовимірному масиві. Знову ж таки, нам потрібно створити функцію, яка дозволяє нам перебирати всі значення в масиві, але цього разу нам також потрібно прокрутити кожен вимір масиву.
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 As Long, j As Long'цикл для першого виміруДля i = LBound (varArray, 1) До UBound (varArray, 1)'цикл для другого виміруДля j = LBound (varArray, 2) До UBound (varArray, 2)'якщо ми знайдемо значення, то msgbox скаже, що у нас є значення, і вийде з функціїЯкщо varArray (i, j) = strFind ТодіMsgBox "Лікаря знайшли!"Функція виходуЗакінчити ЯкщоДалі jДалі iФункція завершення |