MS-Excel:检索 VBA 函数所在的行号

问题描述

我希望我在正确的论坛上问这个问题:

我正在用 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 到各种单元格。