VBA Пошук значення (Знайти) у масиві

Цей підручник покаже, як шукати (знаходити) значення в масиві у 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Функція завершення
wave wave wave wave wave