更改另一个工作簿上的值时,Application.Volatile 不会重新计算函数

Posted

技术标签:

【中文标题】更改另一个工作簿上的值时,Application.Volatile 不会重新计算函数【英文标题】:Application.Volatile not recalculating functions when values on another workbook are changed 【发布时间】:2019-02-06 16:40:30 【问题描述】:

我有一个在三个用户定义的函数中使用 Application.Volatile 的 Excel 工作簿。下面是其中一个功能的示例,其他两个非常相似。他们所做的只是在指定的工作表上找到一个值并将该值返回到一个汇总工作表。

Function estimated_commission(client As Range) As Double

    Application.Volatile

    Name = CStr(client.Value)
    pull_value = Worksheets(Name).Range("A500").End(xlUp).Offset(0, 5).Value

    estimated_commission = pull_value

End Function

当最终用户只打开使用这些函数的工作簿时,该函数按我的预期工作。工作簿的计算选项设置为自动。

当用户更改单元格值或保存另一个工作簿时,就会出现问题。这些工作簿与具有用户定义函数的工作簿无关。当用户使用函数重新激活工作簿时,所有用户定义的函数都返回 #VALUE 错误。按 F9 或重新计算工作表将删除所有错误并返回正确的值。

有没有办法防止这个问题发生?

【问题讨论】:

【参考方案1】:

Worksheets(Name) 缺少对其工作簿的引用。如果您不引用工作簿,Excel 会假定 ActiveWorkbook 是具有焦点 / 位于顶部的那个。这就是用户切换到的工作簿,它可能没有名为Name 的工作表,因此您的函数错误并返回#VALUE

引用ThisWorkbook,这是代码正在运行的工作簿。

ThisWorkbook.Worksheets(Name)

【讨论】:

这么愚蠢的错误...感谢您的快速回复,完美!

以上是关于更改另一个工作簿上的值时,Application.Volatile 不会重新计算函数的主要内容,如果未能解决你的问题,请参考以下文章

在 oracle 中更改另一个字段的值时更改表字段的值

在另一个工作簿上执行刷新时用户定义的函数出错

当我在另一个单元格中选择一个值时如何更改单元格的值

VBA - 删除每张工作簿上的每 N 行(每张工作表 100k+ 值)

多个Google表格/工作簿上的SQL联盟

sql 中如何设置触发器使修改一个表中列的值时,同时修改另一个表的值