我的工作表上有以下内容:
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!
...
知道我可能做错了吗?
我尝试过类似提示Range()
,将LookupRange.Value2
传递给VLOOKUP
等等,但都没有效果。
我也尝试过调试,注意到LookupRange
确实包含了Value2
中所需的范围,这就是我尝试将其传递给函数的原因。
附注: 上面提到的功能和布局只是一个假人 - 实际功能稍微复杂一些,因为它依赖于协商费率,每月保证金等等。这就是我首先使用VBA的原因。我知道我在查找时遇到了问题,因为它是函数中唯一似乎失败的东西 - 其他一切都对应并计算。
答案 0 :(得分:11)
来自MSDN:
使用方括号的优点是代码更短。使用
Evaluate
的优点是参数是一个字符串,因此您可以在代码中构造字符串或使用Visual Basic变量。
换句话说,你可以使用
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
我希望你知道4th parameter的意思:
如果
TRUE
或省略,则返回精确或近似匹配。如果未找到完全匹配,则返回小于lookup_value的下一个最大值。 table_array第一列中的值必须按升序排列;否则,VLOOKUP
可能无法给出正确的值。您可以通过从“数据”菜单中选择“排序”命令并选择“升序”来按升序排列值。
顺便说一下,Calculate
不是UDF的好名字,因为VBA已经有了函数Application.Calculate
。我将其重命名以避免混淆。