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

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

  • 显示货币的单元格[在A1 ]
  • 一系列单元格(两列,一个用于货币,另一个用于相应的佣金百分比)[定义为/命名为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!

任何想法我可能做错了什么?

我已经尝试了几个东西,如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函数。 我会重命名它以避免混淆。