在VLOOKUP的VBA函数中使用命名范围

时间:2014-05-06 19:54:19

标签: excel vba excel-vba range vlookup

我的工作表上有以下内容:

  • 显示[A1]
  • 货币的单元格
  • 一系列单元格(两列,一列用于货币,另一列用于相应的佣金百分比)[定义为/ named RANGE,并作用于工作表]
  • 根据A1RANGE
  • [正在尝试]确定计算佣金百分比的单元格

然后我有一个名为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的原因。我知道我在查找时遇到了问题,因为它是函数中唯一似乎失败的东西 - 其他一切都对应并计算。

1 个答案:

答案 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。我将其重命名以避免混淆。