用户定义的函数不重新计算

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

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

有没有人遇到这种奇怪的行为,有没有任何其他的方法来强制Excel重新构buildcalc图,我应该尝试从头开始?

另外一个注意事项是:我通过文件打开打开了XLAM和XLSX,并没有使用File … Options … Addinspath安装XLAM,因为在过去当我这样做的时候,你“取消”并安装XLAM,然后所有的UDF引用被完整的path名链接所取代 – 非常难看。 或者,如果有人可以概述一个解决方法来安装XLAM插件,不会在任何地方创build破碎的链接,我会去那里。

想通了 – 不知道为什么微软有这个“function”:

在打开XLAM之前打开/创build使用XLAMfunction的处女XLSX时,会出现这种情况。 在这种情况下,没有数量的调用会导致XLSX公式绑定和执行这些XLAM函数,除非你进入每个单元格并触摸公式栏并按下ENTER键(或者,正如我发现的那样,通过全局replace – 在我的情况下,所有funcs开始wa“k”,所以用“k”全局replace“k”修正了错误)。 如果XLAM首先打开,则不会发生此问题。

这工作:

Sub Force_Recalc() Cells.Replace What:="=", Replacement:="=", LookAt:=xlPart, SearchOrder _ :=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False End Sub 

您可以通过search在这种情况下强制重新计算,并replace所有公式开始处的= 。 你也可以把它变成一个macros,并把它映射到一个组合键。

编辑添加

格雷格·格林(Greg Glynn)在答复中看到了这个macros。

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

这是一个直接的引用:“Excel取决于对函数的input参数的分析,以确定函数何时需要通过重新计算来评估。

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

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

通过包含整个表作为参数,即使不使用参数,如果表中的任何内容改变,函数应该更新。

通过这种方式,无论您是否实际处理整个表,您的函数都会触发依赖关系树。

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

  Application.Calculation = xlCalculationManual Application.Calculation = xlCalculationAutomatic 

我有同样的问题…我发现(在另一篇文章),添加Application.Volatile函数代码使它与电子表格(f9)计算,

我的屏幕截图:

在这里输入图像描述

我有同样的问题。 查找和replace的作品,但不是很好。 我的解决scheme是:

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

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

 Application.CalculateFull() 

MSDN源码在这里

按CTRL + ALT + SHIFT + F9

这可能比想要的更重要,但它更新了我的UDF。

( 来源 )

Excel将会监控公式中提到的范围内的任何变化,我今天面对这个问题,并且正在思考和意识到这一点。 所以要解决这个问题,在你的函数中创build一个虚拟的参数,它需要你想要监视的范围或创build一个虚拟函数。 在我的情况下,我把它叫做monitorRange,它什么都不返回

 Function monitorRange(rng As Range) End Function 

我在公式示例中提到了它

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

这工作得很好,它应该与任何其他function