Перейти к содержимому
Наше приложение «Дешевые авиабилеты» в AppGallery >>

VBA Excel. Метод WorksheetFunction.Match

    Метод WorksheetFunction.Match — аналог функции ПОИСКПОЗ в VBA Excel — поиск относительного положения элемента в массиве (диапазоне). Примеры.

    Метод WorksheetFunction.Match

    WorksheetFunction.Match – это метод VBA Excel, который возвращает относительное положение элемента в массиве (диапазоне), соответствующее его порядковому номеру в массиве (диапазоне). Метод WorksheetFunction.Match — аналог функции рабочего листа ПОИСКПОЗ (поиск позиции).

    Обратите внимание на то, что

    • поиск позиции в массиве возможен, если он одномерный или двумерный, но с набором элементов только по одному измерению, например: myArray(8, 0) или myArray(1 To 1, 1 To 20);
    • поиск позиции в диапазоне рабочего листа возможен, если он содержит только одну строку или один столбец;
    • нумерация относительного положения элемента в массиве начинается с единицы, независимо от заданной индексации массива.

    Синтаксис

    Синтаксис метода WorksheetFunction.Match в VBA Excel:

    Параметры

    Описание параметров метода WorksheetFunction.Match:

    Параметр Описание
    Arg1 Обязательный параметр. Значение элемента массива, по которому будет произведен поиск относительного положения элемента в массиве.
    Arg2 Обязательный параметр. Непрерывный диапазон ячеек или массив, в котором будет произведен поиск позиции элемента, значение которого совпадет со значением параметра Arg1.
    Arg3 Необязательный параметр. Задает тип сопоставления значения Arg1 со значениями в массиве Arg2.

    В параметре Arg1 можно использовать знаки подстановки для шаблонов, те же, что и для методов Find и Replace.

    Значения параметра Arg3, задающие тип сопоставления:

    Значение Тип сопоставления
    -1 Метод WorksheetFunction.Match находит наименьшее значение элемента в Arg2, большее или равное Arg1. Значения элементов Arg2 должны быть расположены в убывающем порядке: [m, … 2, 1, 0, -1, -2, … -n], [z – a], [True, False] и т. д.
    0 Метод WorksheetFunction.Match находит в Arg2 первое значение, равное Arg1. Значения элементов Arg2 могут быть расположены в любом порядке.
    1 Значение по умолчанию. Метод WorksheetFunction.Match находит наибольшее значение элемента в Arg2, меньшее или равное Arg1. Значения элементов Arg2 должны быть расположены в возрастающем порядке: [-n, … -2, -1, 0, 1, 2, … m], [a – z], [False, True] и т. д.

    При сопоставлении строк регистр не учитывается.

    Примеры

    Пример 1

    Поиск относительного положения элемента в массиве, индексация которого начинается с нуля:

    Пример 2

    Определение индекса элемента в массиве по его относительному положению, возвращенному методом WorksheetFunction.Match:

    Пример 3

    Определение адреса ячейки на рабочем листе по найденному методом WorksheetFunction.Match относительному положению этой ячейки в заданном диапазоне:


    Содержание рубрики VBA Excel по тематическим разделам со ссылками на все статьи.

    5 комментариев для “VBA Excel. Метод WorksheetFunction.Match”

    1. Сбитый Лётчик Небосводов

      Здравствуйте, Евгений! Здравствуйте, коллеги!
      Почему код

      даёт n=14 (кол-во элементов myArray) вместо верных 9?
      А если кол-во элементов myArray сократить до 13, удалив «, "14?"», то 13.
      А при 12 тот же код даёт верную 9.
      Что это за нечистая сила?
      P.S. «при чем» лучше заменить на «причём»

      1. Евгений

        Здравствуйте!
        Если тип сопоставления используется по умолчанию — 1, элементы массива должны быть расположены по возрастанию, в том числе и текстовые значения. Для вашего примера следует использовать тип сопоставления — 0:

        1. Сбитый Лётчик Небосводов

          Спасибо, Евгений.
          Как пользоваться, более-менее понятно.
          Как работает при 1 (по умолчанию) – не до конца: почему при 12 элементах для «Столб» n=9, а не ожидаемым 12; почему при 14 для «Небо» n=8, а не 13. Это всё при типе сопоставления = 1.

    2. Сбитый Лётчик Небосводов

      Здравствуйте, Евгений!
      Здравствуйте, коллеги!
      А работает ли Match с датами? Что-то у меня при выполнении

      Sub tmp()
      Dim ThAy(4) As Date, fff As Date
      ThAy(0) = "1.1.2000"
      ThAy(1) = "2.8.2009"
      fff = "02.08.2009"
      Debug.Print Application.Match(fff, ThAy, 0), Application.Match(fff, ThAy), WorksheetFunction.Match(fff, ThAy), fff, ThAy(1), WorksheetFunction.Match("то, чего не м.б.", ThAy), TypeName(ThAy), TypeName(ThAy(1)), TypeName(fff)
      End Sub

      любая дата, даже известно находящаяся в массиве, даже известно не находящаяся, даже «то, чего не м.б.», находится. На Ubound+1 месте массива.
      Прошу объяснения или совета, в каком направлении искать.
      Спасибо.

      1. Евгений

        Добрый вечер!
        В вашем примере возвращается порядковый номер, соответствующий элементу массива Ubound, так как нумерация массива идет с нуля, а порядковый номер, возвращаемый функцией Match, с единицы.

        Почему-то с датами Match не работает. Могу предложить такой вариант:

        А также можно использовать текстовый формат:

    Обсуждение закрыто.