Использование именованного диапазона в функции VBA для VLOOKUP

у меня есть следующее На моем рабочем листе:

  • ячейка, которая показывает валюту [in A1]
  • диапазон ячеек (два столбца, один для валюты, а другой для соответствующего процента комиссии) [определяется как/named RANGE, и область видимости на листе]
  • ячейка, которая [пытается] определить рассчитанный процент комиссии на основе A1 и RANGE

у меня тогда есть функция VBA, называемая Calculate следующим образом:

Function Calculate(LookupValue As Double, LookupRange As Range) As Double
    Calculate = [VLOOKUP(LookupValue, LookupRange, 2)]
End Function

ячейка, которая определяет процент, имеет следующее:

=Calculate(A1, RANGE)

проблема в том, что ячейка просто возвращает #VALUE!...

есть идеи, что я могу делать неправильно?

Я пробовал несколько вещей, таких как тип-намек на Range(), передает LookupRange.Value2 to VLOOKUP и т. д., Ни один из которых не работал.

Я также попытался отладить, отметив, что LookupRange на самом деле содержит диапазон, необходимый в Value2, именно поэтому я попытался передать его функции.

Примечание: функция и макет, упомянутые выше, являются просто фиктивными-фактическая функция несколько сложнее, поскольку она зависит от согласованных ставок, ежемесячной маржи и т. д. Вот почему я использую VBA в первую очередь. Я знаю, что я делаю что-то неправильно с поиском, так как это единственное, что, кажется, не работает в функции - все остальное соответствует и вычисляет.

1 ответов


С MSDN:

преимущество использования квадратных скобок заключается в том, что код короче. Преимущество использования Evaluate является ли аргумент строкой, поэтому вы можете либо построить строку в коде, либо использовать переменную Visual Basic.

другими словами, can использовать

Calculate = [VLOOKUP(3, A1:B100, 2)]

а вы не может использовать

LookupValue = 3
LookupRange = Range("A1:B100")
'or
'LookupRange = "A1:B100"
Calculate = [VLOOKUP(LookupValue, LookupRange, 2)]

что вы можете сделать есть:

Вариант 1:

Function Calculate(LookupValue As Double, LookupRange As Range) As Double
    Calculate = Evaluate("VLOOKUP(" & LookupValue & "," & LookupRange.Address & ", 2")
End Function

или лучше:

Function Calculate(LookupValue As Double, LookupRange As Range) As Double
    Calculate = Evaluate("VLOOKUP(" & LookupValue & ",'" & _
        LookupRange.Parent.Name & "'!" & LookupRange.Address & ", 2")
End Function
Я предлагаю:

Вариант 2:

Function Calculate(LookupValue As Double, LookupRange As Range) As Double
    Calculate = Application.VLookup(LookupValue, LookupRange, 2)
End Function

надеюсь, вы знаете о значении 4-й параметр:

если TRUE или опущено, возвращается точное или приблизительное совпадение. Если точное совпадение не найдено, возвращается следующее по величине значение, которое меньше lookup_value. Значения первый столбец table_array должен быть помещен в порядке возрастания сортировки; в противном случае VLOOKUP может не дать правильное значение. Значения можно расположить в порядке возрастания, выбрав команду Сортировать в меню Данные и выбрав возрастание.

кстати, Calculate не является хорошим именем для UDF, так как VBA уже имеет функцию Application.Calculate. Я бы переименовал его, чтобы избежать путаницы.