问题描述
我希望我在正确的论坛上问这个问题:
我正在用 VBA 为 MS-Excel 编写 UDF;它基本上为该行上的事务构建了一个状态消息。它逐步执行一系列 IF 语句,评估 FOR THAT ROW 不同列中的单元格值。
但是,此 UDF 将驻留在多行中。所以它可能在 C12、C13、C14 等中。UDF 如何知道使用哪一行?我正在尝试这样的事情,但没有效果
Tmp_Row = Application.Evaluate("Row()")
似乎返回空值
我在这里遗漏了什么?
先谢谢大家
解决方法
Application.Caller
很少使用,但是当 UDF 需要知道是谁调用它时,它需要知道 Application.Caller
。
除此之外,您不能仅仅假设函数是从 Range
调用的。因此,您应该使用 TypeOf...Is
运算符验证其类型:
Dim CallingCell As Excel.Range
If TypeOf Application.Caller Is Excel.Range Then
'Caller is a range,so this assignment is safe:
Set CallingCell = Application.Caller
End If
If CallingCell Is Nothing Then
'function wasn't called from a cell,now what?
Else
'working row is CallingCell.Row
End If
建议:让函数将其依赖的单元格作为Range
参数(如果您需要Range
元数据;如果您只需要值则取Double
,{{1} },Date
参数),而不是让它从工作表中获取值。这将工作表布局与函数的逻辑分离,从而使其更加灵活和易于使用 - 如果/当工作表布局发生变化时不需要任何调整。
Application.ThisCell
MS Docs:
以 Range 对象的形式返回从中调用用户定义函数的单元格。
您可以使用以下代码对其进行测试:
Function testTC()
testTC = Application.ThisCell.Row
End Function
在 Excel
中使用公式
=testTC()
和 (Cut)Copy/Paste
到各种单元格。