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

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

Function myFunction( StrArgs As String ) As Long .... End Function 

我从单元格A1调用这个函数,现在它的值是100:

 =myFunction( ... ) 

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

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

这工作正常,但是我挣扎的是以下内容:当在myFunction中发现错误时,我想返回(保留)调用单元格的现有值,而不是零或错误值。

我在myFunction开始时想要做的是:

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

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

 myFunction = existingCellValue 

但是,我发现这返回零。 在debugging器中,我看到,只要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 

通过模块中的上述代码,我在工作簿中input以下内容:

 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,他们都回答了这个问题。

有几种可能的方式,但都有缺点。
最简单的方法是使用Application.Caller.Text,但它返回格式化的值而不是实际的值。
看到我的博客文章的主题更多的讨论http://fastexcel.wordpress.com/2012/01/08/writing-efficient-vba-udfs-part-8-getting-the-previously-calculated-value-from-该呼细胞/

你可以用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中使用时,可以返回错误。

下面的图片展示了这个解决scheme是如何工作的(在C1和C2单元格中随机改变的值):

在这里输入图像描述