用户定义函数不重新计算

| 我最近拍摄了一个稳定的大型XLSM文件,并将其拆分为XLAM和XLSX。 XLSX调用(udfs)中的成千上万个单元在XLAM中起作用,每个这样的udf都以语句“ Application.Volatile”(过度杀伤,强制重新计算)开头。 XLSX不会通过F9通过Ctrl-Alt-Shift F9来进行重新计算,也不会通过Cell.Calc通过Application.CalculateFull进行重新计算。 XLSX单元格只是\“死\” ...但是...如果我按F2键编辑公式然后按ENTER键,我可以将它们一一唤醒。以这种方式重新唤醒的细胞似乎保持清醒状态,此后正常重新计算。 有没有人遇到过这种奇怪的行为,是否还有其他方法可以迫使Excel从头开始重新构建计算图,我应该尝试一下? 万一重要,请另外注意:我通过File Open打开了XLAM和XLSX,但没有使用File ... Options ... Addins路由安装XLAM-因为在过去,我需要一分钟您“取消选中”并安装了XLAM,则所有UDF引用都将替换为完整的路径名链接-非常难看。另外,如果有人可以概述安装XLAM加载项的解决方法,但不会在所有地方都创建断开的链接。     
已邀请:
这有效:
Sub Force_Recalc()
    Cells.Replace What:=\"=\", Replacement:=\"=\", LookAt:=xlPart, SearchOrder _
        :=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
End Sub
    
想通了-不知道为什么微软拥有这个“功能”: 当在打开XLAM之前打开/创建使用XLAM功能的原始XLSX时,就会出现这种情况。在这种情况下,没有任何麻烦可以使XLSX公式绑定并执行这些XLAM函数,除非您进入每个单元格并触摸公式栏并按ENTER(或者,正如我所发现的那样,通过全局替换大规模地这样做-在我的情况下,所有函数都以wa \“ k \”开始,因此用\“ k \”全局替换\“ k \”修复了错误)。如果先打开XLAM,就不会发生此问题。     
在这种情况下,可以通过搜索并替换所有公式开头的
=
来强制重新计算。您也可以将其放入宏并将其映射到组合键。 编辑添加 请参阅宏Greg Glynn的回答。     
对于可以访问“ 2”实例的UDF,可以使用:
Application.CalculateFull()
MSDN来源在这里     
一种可能的解决方案:将计算模式设置为手动,然后返回到自动
    Application.Calculation = xlCalculationManual
    Application.Calculation = xlCalculationAutomatic
    
按CTRL + ALT + SHIFT + F9 这可能比需要的重新计算更多,但它更新了我的UDF。 (资源)     
这是我发现的。我尚未测试过,但我相信可能会有解决方法。 这是直接报价: \“ Excel取决于对函数输入参数的分析,以确定何时需要通过重新计算来评估函数。” 来自http://www.decisionmodels.com/calcsecretsj.htm 这是我今天晚些时候要尝试的。 我将在函数内动态生成表的特定地址。 基于我们在这里的原因,如果计算出的地址处的值发生更改,我就不会得到更新。 通过将整个表作为参数包括在内,即使不使用该参数,如果表中的任何内容发生更改,该函数也应进行更新。 这样,无论您是否实际处理整个表,函数都将击中依赖关系树。     
我的屏幕截图: 我有同样的问题。查找和替换有效,但不是很好。我的解决方案是: 转到“数据”标签>“编辑链接”>单击“开源”即可解决此问题     
Excel会监视公式中提到的范围以进行任何更改,我今天遇到了这个问题,我正在思考并意识到这一点。因此,要解决此问题,请在函数中创建一个哑元参数,该参数采用要监视的范围或创建哑元函数。在我的情况下,我将其称为MonitorRange,它什么也不返回
Function monitorRange(rng As Range)
End Function
我在公式示例中提到了
=myfunction(a,b) & monitorRange(RANGE_TO_MONITOR)
这很好用,并且应该与任何其他功能一起使用     
在最初的问题之后出现了冰河世纪,但是直到今天我遇到了一个类似的问题,在那里我创建了一个UDF来确定选择了数据透视表过滤器的值。在宏编辑器中运行以及直接更新使用UDF的字段时,UDF都可以正常工作,但是在更新工作表或数据透视表时会抛出\“
#VALUE!
\”。 直到我将原始UDF中的内容增量添加到Ali \的简单monitorRange函数中之前,这一直使我丧命。然后,我发现我的UDF有一个数据透视表刷新语句,该语句在删除后消除了\“
#VALUE!
\”错误。以下是UDF的特定违规行,但我的一般规则是UDF在其调用链中不能包含任何代码来更新其他工作簿内容。也就是说,UDF必须仅获取值,而不能设置值。 我使用以下两种情况验证了这一点,这两种情况都会导致此错误: 刷新数据透视表,例如:
pt.PivotCache.Refresh
更改另一个单元格的值,例如:
Range(\"AA1\").Value = \"Test\"
奇怪的是,我测试并发现,UDF可以包含一个MsgBox调用来毫无问题地显示对话框,这是绝对可以的(实际上有点酷)。这将允许UDF监视范围,然后弹出msgbox对话框以显示要包含在UDF中的任何条件。在其他情况下,我会牢记这一点。 希望这可以帮助其他人解决这个令人讨厌的垃圾问题。     
我遇到了同样的问题...(在另一篇文章中)我发现将Application.Volatile添加到功能代码中使其可以通过电子表格(f9)进行计算     

要回复问题请先登录注册