我有一个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,他们都回答了这个问题。
答案 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中随机更改的值):