16

Волшебный метод Match

В VBA Excel есть недодокументированный, но очень мощный и полезный метод Application.Match(). Есть метод-близнец WorksheetFunction.Match(). Работают они похожим образом, но возвращают разные результаты.

В VBA-коде лучше использовать именно Application.Match().

С помощью этого метода можно:

  • искать элементы (один или сразу несколько) в одномерных диапазонах и массивах;

  • сравнивать массивы и диапазоны на предмет наличия одинаковых элементов;

  • осуществлять точный и неточный поиск.

Скорость работы Application.Match() значительно выше, чем у циклов, перебирающих элементы массивов или, тем более, ячейки листов Excel.

Отдельно необходимо отметить, что метод этот довольно известный, но, как правило, не используемый на полную мощность. Так, многим неизвестно - и в официальной справке этого нет - что можно искать не одно значение, а массив значений. Также многие продолжают использовать неудобный вариант WorksheetFunction.Match() вместо удобного Application.Match().

С помощью Application.Match() можно, например, организовать, эффективный поиск множества подразделов на листе за одну операцию при обработке таблиц. Это позволяет сильно экономить по времени поиска и по количеству строчек кода. Также довольно просто можно применить этот метод для операций пересечения и сравнения множеств.

Синтаксис:

Application.Match(<что ищем>, <где ищем>, <как ищем>)

<Что ищем> может быть:

  • одно значение - переменная или константа, например «aaa», 123 или ValueToFind, причем различных типов - строка, число, дата, логическое.

    • текстовые значения могут содержать подстановочные знаки * (0+ любых символов),? (один любой символ). Их можно экранировать тильдой ~, если нужно найти именно * или ?

  • одномерный массив Array(«aaa», 123)

  • диапазон листа Excel (строка или столбец) Range("A1:A10"), Range("A1:F1")

<Где ищем> может быть:

  • одномерный массив, содержащий значения различных типов, например, Array(«aaa», 123)

  • диапазон листа Excel (строка или столбец) Range("A1:A10"), Range("A1:F1")

<Как ищем>:

  • 0 - точно. Массив <Где ищем> может быть неупорядоченным (неотсортированным)

  • -1 - поиск наименьшего значения. Массив <Где ищем> должен быть отсортирован по убыванию

  • 1 - поиск наибольшего значения. Массив <Где ищем> должен быть отсортирован по возрастанию

Application.Match() возвращает:

  • если <что ищем> – одно значение, то возвращается одно значение типа Double (индекс найденного значения в массиве, начиная с 1) или значение типа Error (если значение не найдено);

  • если <что ищем> – массив из N элементов, то возвращается массив, содержащий N значений типа Double (индекс найденного значения в массиве, начиная с 1) или значений типа Error (если значение не найдено).

Особенности:

  • если значение не найдено, возвращается значение ошибки #N/A [Error 2042] (метод WorksheetFunction.Match() в этом случае генерирует исключение)

  • поиск текста производится всегда регистронезависимо, т.е. прописные и строчные буквы А и а считаются одинаковыми, и не зависит от установки Option Compare { Binary | Text }

  • при успешном поиске Application.Match() возвращает для каждого искомого значения только первый индекс найденного элемента в <где ищем>. Т.е. если <что ищем> = 2,2 а в <где ищем> находится 2,1,2,2, то результатом будет массив 1,1 - обе двойки найдется в первом индексе.

  • Индексы нумеруются с 1 независимо от установки Option Base { 0 | 1 }.

Примеры применения Application.Match()

1. Ищем несколько текстов, в т.ч. по маске, в массиве:

Волшебный метод Match Microsoft Excel, Vba, Длиннопост, Проба пера

Данный код ищет строки «qqq» (три q или Q подряд) и «a?b» (строка из трех символов, начинающаяся на a или A, заканчивающаяся на b или B с любым символом посередине) в массиве arr, содержащем строки «AAA», «A5A», «Abb».

В результате работы кода в окне Immediate будет напечатано:

Error 2042

3

Этот результат означает, что строка "qqq" не найдена в массиве arr, а "a?b" соответствует третьему элементу "Abb".

2. Ищем значения из столбца A в столбце C:

Волшебный метод Match Microsoft Excel, Vba, Длиннопост, Проба пера

Этот код ищет значения из ячеек колонки A листа Excel в колонке C листа Excel. Результат выводится в цикле с предварительной проверкой, найден ли очередной элемент или нет. Эта проверка производится с помощью функции IsNumeric(), которая возвращает Истину в том случае, если аргумент - число. В том случае, если значение не найдено, в результирующем массиве будет находиться значение ошибки (Error), и IsNumeric() вернет Ложь. Также это можно проверить с помощью функции IsError(), которая возвращает Истину, если аргумент является значением ошибки.

Element 1 is found at index 9

Element 8888 not found (Error 2042)

Element 3 not found (Error 2042)

Element 4 not found (Error 2042)

Element 5 is found at index 4

Element 6 not found (Error 2042)

Element 7 is found at index 10

Element aaa is found at index 6

Element 9 not found (Error 2042)

Element 06.09.2022 is found at index 8

Лига помощи Excel

94 поста904 подписчика

Добавить пост
Чтобы оставить комментарий, необходимо или