如何从 UDF 中读取另一个单元格?
Posted
技术标签:
【中文标题】如何从 UDF 中读取另一个单元格?【英文标题】:How to read another cell from within a UDF? 【发布时间】:2020-01-28 17:54:08 【问题描述】:我知道使用用户定义的函数来更改另一个单元格的值非常困难 - 甚至被 MS 禁止。但是,我想只是从另一个单元格中读取并使用该信息做一些事情,但该功能永远不会完全运行。例如,在
Public Function ADD(arg1 as Double, arg2 as Double) as Double
If Worksheets("sheet1").Cells(1,1).Value = 0 Then
ADD = -1
Exit Function
End If
MsgBox "I got here"
ADD = arg1 + arg2
End Function
消息框不显示。它只能是 if 语句。当我删除它时,它可以工作。 有什么方法可以从另一个固定单元格读取而不会使函数崩溃?我正在使用的真正函数是从 if 语句中读取所有内容。
另外,这可以在 MS 网站上找到,但我不明白为什么它会阻止我阅读..
为了正确计算,计算中使用的所有范围都应作为参数传递给函数。如果您不将计算范围作为参数传递,而不是引用函数的 VBA 代码中的范围,Excel 无法在计算引擎中考虑它们。因此,Excel 可能无法充分计算工作簿以确保在计算用户定义函数之前计算所有先例。
提前谢谢你!
【问题讨论】:
它适用于我,但仅更改 A1 时值不会更改。就像信息说的那样,它不知道值发生了变化。如果你让它 volatile 会,但最好将该范围引用作为参数传递。 空单元格的默认值为零,因此如果您将该单元格留空并且您希望您的 If 测试失败,它不会。在 A1 中添加一些其他值。如果您希望在更改 A1 的值时重新计算它,您至少需要Application.Volatile
作为函数的第一行(即使这样也可能无法保证)
我很快就会改进这个问题。我感谢你的建议。我很确定他们没有工作,因为我的例子没有抓住问题。
【参考方案1】:
我将 UDF 名称更改为 ADDD()
,它工作正常:
Public Function ADDD(arg1 As Double, arg2 As Double) As Double
If Worksheets("Sheet1").Cells(1, 1).Value = 0 Then
ADDD = -1
Exit Function
End If
MsgBox "I got here"
ADDD = arg1 + arg2
End Function
【讨论】:
感谢您的快速响应。它确实解决了这个例子,但没有改变任何真实的东西,这意味着我的例子是有缺陷的。我稍后会编辑这个问题,做得更好。【参考方案2】:您不能使用 UDF 运行消息框。如果可以的话,你能想象一下你需要点击多少次“确定”并且你的工作表会经常重新计算吗?
相反,您可以使用debug.print
语句,并且可以从 VBA IDE 运行 UDF 来检查调试值。例如:
Private Function TestMyUDF()
Dim examplevalue1 as Double
Dim examplevalue2 as Double
MyUDF examplevalue1, examplevalue2
End Function
题外话,但如果您引用的(只读)单元格很重要,则使用命名范围(并将其设为工作簿名称,而不是工作表名称)。举个例子,我们称之为“CheckSumCell”。
Public Function MyUDF(arg1 as Double, arg2 as Double) as Double
If ThisWorkbook.Names("CheckSumCell").Value = 0 Then '<-- assumes single cell
MyUDF = -1
Exit Function
End If
MyUDF= arg1 + arg2
End Function
这将更好地在单元格重定位(插入行或列)中存活!如果您决定使用另一个单元格,则只需更改命名范围的定义,您根本不需要编辑宏/UDF。
【讨论】:
以上是关于如何从 UDF 中读取另一个单元格?的主要内容,如果未能解决你的问题,请参考以下文章
如何从另一个工作表中获取单元格值并将其分配给 UDF 的返回值?