18

我最近拍摄了一个大而稳定的 XLSM 文件,并将其拆分为 XLAM 和 XLSX。XLSX 调用 (udfs) 中的数千个单元格在 XLAM 中起作用,每个这样的 udf 都以语句“Application.Volatile”开头(矫枉过正,强制重新计算)。

XLSX 不会使用 F9 到 Ctrl-Alt-Shift F9 重新计算,也不会使用 Cell.Calculate 到 Application.CalculateFull。XLSX 单元格只是“死”了......但是......如果我按 F2 编辑公式然后按 ENTER,我可以一一重新唤醒它们。以这种方式重新唤醒的细胞似乎保持清醒,并在此后正常重新计算。

有没有人遇到过这种奇怪的行为,是否有任何其他方法可以强制 Excel 从头开始​​重建计算图,我应该尝试一下?

一个重要的附加说明:我通过 File Open 打开了 XLAM 和 XLSX,并且没有使用 File ... Options ... Addins 路径安装 XLAM - 因为过去我这样做时,分钟您“取消选中”并安装了 XLAM,然后所有 UDF 引用都被完整的路径名链接替换 ​​- 非常难看。或者,如果有人可以概述安装 XLAM 插件的解决方法,该插件不会在任何地方创建断开的链接,我将使用它。

4

11 回答 11

10

这有效:

Sub Force_Recalc()
    Cells.Replace What:="=", Replacement:="=", LookAt:=xlPart, SearchOrder _
        :=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
End Sub
于 2015-11-04T22:09:31.147 回答
6

想通了 - 不知道为什么微软有这个“功能”:

当在打开 XLAM 之前打开/创建使用 XLAM 功能的原始 XLSX 时,就会出现这种情况。在这种情况下,再多的哄骗都不会导致 XLSX 公式绑定并执行那些 XLAM 函数,除非您进入每个单元格并触摸公式栏并按 ENTER(或者,正如我发现的那样,通过全局替换集体这样做- 在我的情况下,所有功能都以“k”开始,因此用“k”全局替换“k”修复了错误)。如果先打开 XLAM,则不会出现此问题。

于 2011-04-19T19:12:07.993 回答
5

对于可以访问实例的UDF可以使用:Application

Application.CalculateFull()

MSDN 源码在这里

于 2016-12-21T11:33:29.117 回答
4

=在这种情况下,您可以通过在所有公式开头的搜索和替换来强制重新计算。您也可以将其制作成宏并将其映射到组合键。

编辑添加

请参阅 Greg Glynn 在他的回答中的宏。

于 2014-05-30T18:47:58.960 回答
2

按 CTRL+ALT+SHIFT+F9

这可能会重新计算超出预期,但它更新了我的 UDF。

来源

于 2017-01-31T00:47:02.467 回答
2

一种可能的解决方案:将计算模式设置为手动,然后返回自动

    Application.Calculation = xlCalculationManual
    Application.Calculation = xlCalculationAutomatic
于 2016-03-15T21:40:46.367 回答
1

这是我发现的。我还没有测试过,但我相信可能会有解决方法。

这是直接引用:“Excel 依靠对函数输入参数的分析来确定何时需要通过重新计算来评估函数。”

来自http://www.decisionmodels.com/calcsecretsj.htm

这是我今天晚些时候要尝试的。我将在我的函数中动态生成表的特定地址。根据我们在这里的原因,如果计算出的地址的值发生变化,我不应该得到更新。

通过将整个表作为参数包括在内,即使不使用参数,如果表中的任何内容发生更改,该函数也应该更新。

这样,无论您是否实际处理整个表,您的函数都会命中依赖关系树。

于 2014-05-30T18:42:52.570 回答
0

我的屏幕截图:

在此处输入图像描述

我有同样的问题。查找和替换工作,但不是很好。我的解决方案是:

转到数据选项卡>编辑链接>单击开源将解决此问题

于 2016-11-21T10:52:04.417 回答
0

Excel 将监控公式中提到的范围是否有任何变化,我今天遇到了这个问题,我正在思考并意识到这一点。因此,要修复它,请在您的函数中创建一个虚拟参数,该参数采用您要监视的范围或创建一个虚拟函数。在我的情况下,我称之为 monitorRange 什么都不返回

Function monitorRange(rng As Range)
End Function

我在公式示例中提到了它

=myfunction(a,b) & monitorRange(RANGE_TO_MONITOR)

这工作得很好,它应该与任何其他功能一起使用

于 2017-05-24T13:57:40.193 回答
0

在最初的问题之后出现了冰河时期,但今天遇到了一个类似的问题,我创建了一个 UDF 来确定选择了数据透视表过滤器的哪些值。在宏编辑器中运行以及直接更新使用 UDF 的字段时,UDF 可以正常工作,但#VALUE!在更新工作表或数据透视表时会抛出“”。

直到我将原始 UDF 中的内容逐渐添加到 Ali 的简单 monitorRange 函数中,这让我感到很沮丧。然后我发现我的 UDF 有一个数据透视表刷新语句,删除后消除了“ #VALUE!”错误。下面是我的 UDF 中的具体违规行,但我的一般规则是 UDF 在其调用链中不能有任何代码来更新其他工作簿内容。也就是说,UDF 只能获取值,而不是设置值。

我用以下两种情况验证了这一点,它们都导致了这个错误:

  1. 刷新枢轴,例如: pt.PivotCache.Refresh
  2. 更改另一个单元格的值,例如: Range("AA1").Value = "Test"

奇怪的是,我测试并发现 UDF 可以包含 MsgBox 调用以毫无问题地显示对话框是完全可以的(实际上有点酷)。这将允许 UDF 监视范围,然后针对您希望包含在 UDF 中的任何条件弹出一个 msgbox 对话框。对于其他情况,我会记住这一点。

希望这可以帮助其他人解决这个讨厌的垃圾问题。

于 2018-10-30T19:39:59.083 回答
-1

我遇到了同样的问题...我发现(在另一篇文章中)将 Application.Volatile 添加到函数代码使其使用电子表格进行计算(f9)

于 2011-11-28T20:00:58.310 回答