Excel vba:在从该单元格调用的UDF执行之前,是否可以访问单元格的值?

时间:2014-01-30 12:23:04

标签: excel vba

我有一个UDF,它间接从其他工作表中读取数据,在多个工作表中添加相同的单元格,即:

Function myFunction( StrArgs As String ) As Long

  ....

End Function

我从单元格A1调用此函数,现在它的值为100:

=myFunction( ... )

计算设置为手动,并在需要时刷新工作表。

由于参数StrArgs定义了要查询的工作表,我在myFunction中包含了一些错误检查,以防指定的工作表不存在,或者StrArgs的规范中存在错误。

这很好用,但是我正在努力解决的问题如下:当在myFunction中发现错误时,我想返回(保留)调用单元的现有值,而不是零或错误值。 / p>

我想在myFunction的开头做的是:

existingCellValue = Application.Caller.Text   'or Application.Caller.Value

然后执行计算,遇到错误时:

myFunction = existingCellValue

然而,我发现这会返回零。在调试器中,我看到,只要myFunction开始执行,单元格值就已经设置为零。

我的问题是 - 在执行UDF之前,有没有办法访问调用单元的现有值?

- 编辑 - 更完整的代码,作为一个例子,似乎工作正常: -

Function GETNUMBER(Col As String, Row As Integer) As Double
    Dim LookStr As String
    Dim TheAnswer As Double
    Dim CellVal As Variant

On Error GoTo errHandler

    CellVal = Application.Caller.Text

    LookStr = "=" & Col & Row
    TheAnswer = Application.Evaluate(LookStr)

    GETNUMBER = TheAnswer

    On Error GoTo 0

Exit Function

errHandler:
    GETNUMBER = CellVal

End Function

使用模块中的上述代码,我在工作簿中输入以下内容:

Row
1:   | D    | 1    | =GETNUMBER(A1,B1)    | 10
2:   | D    | 2    | =GETNUMBER(A2,B2)    | 20
3:   | D    | 3    | =GETNUMBER(A3,B3)    | 30

这将从D列返回10,20和30的值。

现在我将B列中的一个单元格更改为零,以调用errHandler,并返回存储在开头的CellVal。

这似乎有效,Application.Caller.Text和Application.ThisCell.Text都给出了正确的结果。

感谢Charles Watson和KazJaw,他们都回答了这个问题。

2 个答案:

答案 0 :(得分:4)

有几种可能的方法,但它们都有缺点。
最简单的方法是使用Application.Caller.Text但它返回格式化的值而不是实际值。
有关此主题的更多信息,请参阅我关于该主题的博客文章http://fastexcel.wordpress.com/2012/01/08/writing-efficient-vba-udfs-part-8-getting-the-previously-calculated-value-from-the-calling-cells/

答案 1 :(得分:0)

您可以使用Application.ThisCell property执行此操作。看下面这个非常简单的例子:

Public Function MultipleAB(a, b)
    Debug.Print Application.ThisCell.Text   'here you get current value
    MultipleAB = a * b                      'here you get new value
End Function

重要!! Application.ThisCell仅对单元格中使用的UDF有效。在其他VBA Subs中使用时可以返回错误。

下面的图片介绍了此解决方案的工作原理(对于单元格C1和C2中随机更改的值):

enter image description here