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

Mik*_*étt 6 excel vba range excel-vba vlookup

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

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

然后我调用了一个VBA函数Calculate,如下所示:

Function Calculate(LookupValue As Double, LookupRange As Range) As Double
    Calculate = [VLOOKUP(LookupValue, LookupRange, 2)]
End Function
Run Code Online (Sandbox Code Playgroud)

确定百分比的单元格具有以下内容:

=Calculate(A1, RANGE)
Run Code Online (Sandbox Code Playgroud)

问题是细胞刚刚返回#VALUE!......

知道我可能做错了吗?

我已经试过几件事情像类型暗示来Range(),通过LookupRange.Value2VLOOKUP等,其中没有工作.

我也试过调试,注意到LookupRange它实际上包含了所需的范围Value2,这就是为什么我试图将它传递给函数.

旁注:上面提到的功能和布局只是一个虚拟 - 实际功能有点复杂,因为它依赖于协商费率,月利润率等.这就是我首先使用VBA的原因.我知道我在查找时遇到了问题,因为它是函数中唯一似乎失败的东西 - 其他一切都对应并计算.

Dmi*_*liv 11

来自MSDN:

使用方括号的优点是代码更短.使用的优点Evaluate是参数是一个字符串,因此您可以在代码中构造字符串或使用Visual Basic变量.

换句话说,你可以使用

Calculate = [VLOOKUP(3, A1:B100, 2)]
Run Code Online (Sandbox Code Playgroud)

但你不能使用

LookupValue = 3
LookupRange = Range("A1:B100")
'or
'LookupRange = "A1:B100"
Calculate = [VLOOKUP(LookupValue, LookupRange, 2)]
Run Code Online (Sandbox Code Playgroud)

你能做的是:

选项1:

Function Calculate(LookupValue As Double, LookupRange As Range) As Double
    Calculate = Evaluate("VLOOKUP(" & LookupValue & "," & LookupRange.Address & ", 2")
End Function
Run Code Online (Sandbox Code Playgroud)

或更好:

Function Calculate(LookupValue As Double, LookupRange As Range) As Double
    Calculate = Evaluate("VLOOKUP(" & LookupValue & ",'" & _
        LookupRange.Parent.Name & "'!" & LookupRange.Address & ", 2")
End Function
Run Code Online (Sandbox Code Playgroud)

不过我建议:

选项2:

Function Calculate(LookupValue As Double, LookupRange As Range) As Double
    Calculate = Application.VLookup(LookupValue, LookupRange, 2)
End Function
Run Code Online (Sandbox Code Playgroud)

我希望你知道第4个参数的含义:

如果TRUE或省略,则返回精确或近似匹配.如果未找到完全匹配,则返回小于lookup_value的下一个最大值.table_array第一列中的值必须按升序排列; 否则,VLOOKUP可能无法给出正确的值.您可以通过从"数据"菜单中选择"排序"命令并选择"升序"来按升序排列值.

顺便说一下,Calculate对于UDF来说,这不是一个好名字,因为VBA已经具备了功能Application.Calculate.我会重命名它以避免混淆.

  • +1表示第4个参数的重要性.我已经看过很多次省略这一点,人们想知道为什么它不能按预期的方式工作. (2认同)