Пишем свой VLOOKUP для того, чтобы не зависеть от стандартного (Excel functions)

Как получить дополнительный контроль над функцией VLOOKUP (ВПР).
lol_vlookup

 

        Функция VLOOKUP (в русской версии — ВПР) действительно очень удобная и мощная помощница, когда нужно остыскать соответствия данных в разных таблицах. Работает она просто и надежно, как автомат Калашникова.

Но вот незадача, иногда нужно в ходе сравнения уточнить какие-то дополнительные параметры. Например соответствий может быть очень много, и все они в общем-то верные, но некоторые все же «верней». То есть нужно в ходе сравнения провести дополнительную валидацию.

В общем случае, такие дополнительные задачи могут быть какие угодно — получить контроль над столь ценной функцией, как VLOOKUP, может оказаться крайне полезным.

Предлагаю вашему вниманию код, который выполняет такую двойную проверку. По сути это DOUBLE LOOKUP. Если выполняется соответствие для «базовой» колонки, то функция ищет параметр «уточняющей» колонки и в случае успеха выдает результат, по аналогии со стандартным VLOOKUP.

Мануал по решению типизированных задач в Microsoft Excel

Если же базовое соответствие найдено, но уточняющего нет, то для моих целей я поставил выдачу резутьтатом оповещения, но вы конечно теперь можете переделать функцию так, как нужно для вашего проекта.

Его величество код

Формат вызова функции:
VLOOKUP2my
([Table] таблица, внутри которой ищем соответствия;
SearchColumnNum колонка в [Table], в которой ищем "базовое" соответствие;
SearchValue значение для поиска "базового" соответствия;
ResultColumnNum колонка в [Table], из которой заберем результат в случае успеха поисков;
N2 значение для поиска "уточняющего" соответствия;
N2col колонка в [Table], в которой ищем "уточняющее" соответствие)

Function VLOOKUP2my(Table As Range, SearchColumnNum As Integer, SearchValue As Variant, ResultColumnNum As Integer, N2 As Variant, N2col As Integer)
Dim i As Long
For i = 1 To Table.Rows.Count
If UCase(Table.Cells(i, SearchColumnNum)) = UCase(SearchValue) Then
If (UCase(Table.Cells(i, N2col)) = UCase(N2)) Then
VLOOKUP2my = Table.Cells(i, ResultColumnNum)
Exit For
End If
VLOOKUP2my = "Second option not exists"
End If
Next i
End Function