Использование именованного диапазона в функции 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
. Я бы переименовал его, чтобы избежать путаницы.