在VLOOKUP中使用VBA函数中的命名范围
我的工作表上有以下内容:
- 显示货币的单元格[在
A1
] - 一系列单元格(两列,一个用于货币,另一个用于相应的佣金百分比)[定义为/命名为
RANGE
,范围为工作表] - 试图根据
A1
和RANGE
确定计算的佣金百分比的单元格
然后我有一个名为Calculate
的VBA函数,如下所示:
Function Calculate(LookupValue As Double, LookupRange As Range) As Double Calculate = [VLOOKUP(LookupValue, LookupRange, 2)] End Function
确定百分比的单元格具有以下内容:
=Calculate(A1, RANGE)
问题是单元刚刚返回#VALUE!
…
任何想法我可能做错了什么?
我已经尝试了几个东西,如types提示Range()
,传递LookupRange.Value2
VLOOKUP
等,没有一个工作。
我也尝试debugging,注意LookupRange
实际上包含Value2
所需的范围,这就是为什么我试图将它传递给函数。
注意:上面提到的function和布局只是一个虚拟的 – 实际的function是比较复杂的,因为它依赖于谈判的利率,每月的利润等。这就是为什么我使用VBA的原因。 我知道我在查找时做了一些错误,因为它是唯一在函数内部失败的东西 – 其他所有的东西都是对应的并且计算出来的。
来自MSDN :
使用方括号的优点是代码更短。 使用
Evaluate
的优点是参数是一个string,因此您可以在代码中构造string或使用Visual Basicvariables。
换句话说你可以使用
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
不过我build议:
选项2:
Function Calculate(LookupValue As Double, LookupRange As Range) As Double Calculate = Application.VLookup(LookupValue, LookupRange, 2) End Function
我希望你了解第四个参数的含义:
如果为
TRUE
或省略,则返回确切或近似匹配。 如果未find完全匹配,则返回小于lookup_value的下一个最大值。 table_array的第一列中的值必须按升序排列; 否则,VLOOKUP
可能不会给出正确的值。 您可以通过从“数据”菜单中select“sorting”命令并select“升序”来按升序排列值。
顺便说一下, Calculate
并不是UDF的好名字,因为VBA已经有了Application.Calculate
函数。 我会重命名它以避免混淆。