ВПР поиск в обратном порядке

Весь MS Office, программирование на Visual Basic for Applications и MS VB

Модератор: Naeel Maqsudov

Ответить
pppmaxa
Сообщения: 2
Зарегистрирован: 08 дек 2012, 18:29

14 апр 2013, 10:14

Можно ли осуществить сопоставление с помощью функции ВПР в обратном порядке, с конца таблицы?
pashulka
Сообщения: 831
Зарегистрирован: 24 ноя 2004, 03:46
Контактная информация:

14 апр 2013, 11:02

Формально нет, но если таблица неотсортирована, то Вы можете попробовать вариант без использования необязательного аргумента Диапазон_просмотра
или написать пользовательскую функцию, в которой, для поиска снизу вверх, будет применяться метод .Find об'екта Range, только не стоит забывать, что вызывать такую UDF из ячеек рабочего листа, имеет смысл только начиная с версии XP(2002)
pppmaxa
Сообщения: 2
Зарегистрирован: 08 дек 2012, 18:29

14 апр 2013, 12:39

Знания о VBA по прежнему отсутствуют. Можете помочь в написании и использовании функции?
pashulka
Сообщения: 831
Зарегистрирован: 24 ноя 2004, 03:46
Контактная информация:

14 апр 2013, 13:15

Код: Выделить всё

'Microsoft Excel XP(или старше)

Public Function MyVLookUp(Search$, Source As Range, Column%, _
                          Optional DownSearch As Boolean = True) As Variant
    Dim iCell As Range
    If DownSearch = True Then
       Set iCell = Source.Columns(1).Find(Left(Search, 255), _
       Source(Source.Rows.Count, 1), xlValues, xlWhole, , xlNext)
    Else
       Set iCell = Source.Columns(1).Find(Left(Search, 255), _
       Source(1, 1), xlValues, xlWhole, , xlPrevious)
    End If
    
    If Not iCell Is Nothing Then
       MyVLookUp = iCell(1, Column)
    Else
       MyVLookUp = CVErr(xlErrNA)
    End If
End Function
По умолчанию ищет сверху вниз, т.е.

=MyVLookUp("Искомый_текст";A1:C100;2)
=MyVLookUp(Адрес_или_имя_ячейки;A1:C100;3)


для поиска снизу вверх достаточно использовать последний и необязательный аргумент DownSearch, т.е.

=MyVLookUp("Искомый_текст";A1:C100;2;0)
=MyVLookUp(Адрес_или_имя_ячейки;A1:C100;3;ЛОЖЬ)
pashulka
Сообщения: 831
Зарегистрирован: 24 ноя 2004, 03:46
Контактная информация:

14 апр 2013, 13:28

P.S. Разумеется, вместо вышеопубликованной функции, можно использовать и формулы, однако последние не будут столь лаконичные как UDF (конечно, если мы не "схитрим" и не присвоим формуле имя)
@Nik
Сообщения: 2
Зарегистрирован: 13 авг 2007, 11:54

08 фев 2016, 01:56

А вот и можно :-)
Если данные располагаются в диапазоне A1:A10, то формула обратного поиска для чисел будет такой:
{=ПОИСКПОЗ(искомое_значение;Ч(СМЕЩ($A$10;-(СТРОКА(A1:A10)-СТРОКА($A$1)); ));0)}
{=ПОИСКПОЗ(искомое_значение;Ч(СМЕЩ($A$1;-(СТРОКА(A1:A10)-СТРОКА($A$10)); ));0)}


Для текста:
{=ПОИСКПОЗ("искомое_значение";Т(СМЕЩ($A$10;-(СТРОКА(A1:A10)-СТРОКА($A$1)); ));0)}
{=ПОИСКПОЗ("искомое_значение";Т(СМЕЩ($A$1;-(СТРОКА(A1:A10)-СТРОКА($A$10)); ));0)}


*формулы массива, вводится через Ctrl+Shift+Enter
pashulka
Сообщения: 831
Зарегистрирован: 24 ноя 2004, 03:46
Контактная информация:

08 фев 2016, 07:22

@Nik писал(а):А вот и можно :-)
Где в Вашем решении наличествует ВПР ?


P.S. Если же говорить о решении с помощью формул, то можно вспомнить формулу массива :

{=ИНДЕКС(C1:C100;МАКС((A1:A100="Искомый_текст")*СТРОКА(A1:A100)))}
@Nik
Сообщения: 2
Зарегистрирован: 13 авг 2007, 11:54

08 фев 2016, 12:17

Тоже верно :) и формула нелетучая
Ответить