Метод WorksheetFunction.Match — аналог функции ПОИСКПОЗ в VBA Excel — поиск относительного положения элемента в массиве (диапазоне). Примеры.
Метод WorksheetFunction.Match
Обратите внимание на то, что
- поиск позиции в массиве возможен, если он одномерный или двумерный, но с набором элементов только по одному измерению, например: myArray(8, 0) или myArray(1 To 1, 1 To 20);
- поиск позиции в диапазоне рабочего листа возможен, если он содержит только одну строку или один столбец;
- нумерация относительного положения элемента в массиве начинается с единицы, независимо от заданной индексации массива.
Синтаксис
Синтаксис метода WorksheetFunction.Match в VBA Excel:
1 |
WorksheetFunction.Match (Arg1, Arg2, [Arg3]) |
Параметры
Описание параметров метода 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
Поиск относительного положения элемента в массиве, индексация которого начинается с нуля:
1 2 3 4 5 6 7 8 9 10 |
Sub Primer1() Dim myArray As Variant, n As Long 'заполнение массива значениями, нумерация элементов массива начинается с нуля myArray = Array("Арка", 45, "Дуб", "Клуб", 85.37, "Литр", 103, "Небо", "Столб") 'определяем относительное положение элемента в массиве, при чем 'нумерация относительного положения начинается с единицы n = WorksheetFunction.Match("Клуб", myArray) MsgBox n 'Результат: 4 MsgBox myArray(n) 'Результат: 85.37, так как нумерация массива начинается с нуля End Sub |
Пример 2
Определение индекса элемента в массиве по его относительному положению, возвращенному методом WorksheetFunction.Match:
1 2 3 4 5 6 7 8 9 10 11 12 |
Sub Primer2() Dim myArray(7 To 15) As Variant, i As Long, n As Long 'заполнение элементов массива значениями For i = 7 To 15 myArray(i) = Choose(i, "", "", "", "", "", "", "Арка", 45, "Дуб", "Клуб", 85.37, "Литр", 103, "Небо", "Столб") Next n = WorksheetFunction.Match("Клуб", myArray) MsgBox n 'Результат: 4 'находим индекс элемента в массиве по его относительному положению n = n + LBound(myArray) - 1 MsgBox myArray(n) 'Результат: Клуб End Sub |
Пример 3
Определение адреса ячейки на рабочем листе по найденному методом WorksheetFunction.Match относительному положению этой ячейки в заданном диапазоне:
1 2 3 4 5 6 7 8 9 10 |
Sub Primer3() Dim n As Long n = WorksheetFunction.Match("Брелок", Range("B1400:B1410"), 0) With Range("B1400:B1410") MsgBox "Значение = " & .Cells(n) & vbNewLine & _ "Адрес = " & .Cells(n).Address & vbNewLine & _ "Строка = " & .Cells(n).Row & vbNewLine & _ "Столбец = " & .Cells(n).Column End With End Sub |
Здравствуйте, Евгений! Здравствуйте, коллеги!
Почему код
даёт n=14 (кол-во элементов myArray) вместо верных 9?
А если кол-во элементов myArray сократить до 13, удалив
«, "14?"»
, то 13.А при 12 тот же код даёт верную 9.
Что это за нечистая сила?
P.S. «при чем» лучше заменить на «причём»
Здравствуйте!
Если тип сопоставления используется по умолчанию — 1, элементы массива должны быть расположены по возрастанию, в том числе и текстовые значения. Для вашего примера следует использовать тип сопоставления — 0:
Спасибо, Евгений.
Как пользоваться, более-менее понятно.
Как работает при 1 (по умолчанию) – не до конца: почему при 12 элементах для «Столб» n=9, а не ожидаемым 12; почему при 14 для «Небо» n=8, а не 13. Это всё при типе сопоставления = 1.
Здравствуйте, Евгений!
Здравствуйте, коллеги!
А работает ли 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 месте массива.
Прошу объяснения или совета, в каком направлении искать.
Спасибо.
Добрый вечер!
В вашем примере возвращается порядковый номер, соответствующий элементу массива Ubound, так как нумерация массива идет с нуля, а порядковый номер, возвращаемый функцией Match, с единицы.
Почему-то с датами Match не работает. Могу предложить такой вариант:
А также можно использовать текстовый формат:
Обсуждение закрыто.