设置Application.Volatile为False后自定义函数不触发?NOW()联动异常求助
问题解析与解决方案
核心原因:非易失性函数的触发逻辑
你的AddOne函数设置了Application.Volatile False,意味着它仅当输入参数的实际存储值发生修改时才会重算。而NOW()是Excel内置的易失性函数,它的特点是:
- 每次工作表计算时会动态生成当前时间,但它的单元格存储值并不会主动更新(Excel只是在计算时临时生成显示值);
- 对于依赖它的非易失性函数来说,Excel认为输入参数(A1的存储值)没有变化,因此不会触发
AddOne的重算——这就是为什么你看到A1显示时间变了,但B1和立即窗口都没反应的原因。
关于“Excel桌面应用的控制面板”
微软文档里的“控制面板”是翻译误差,实际指的是Excel的公式计算选项设置,路径是:
- 点击「文件」→「选项」→「公式」
- 这里可以设置计算模式(自动/手动)、迭代计算、是否启用自动重算等,是控制Excel何时触发公式计算的核心设置。
解决方法
根据你的需求,有几种可选方案:
- 将自定义函数设为易失性:去掉
Application.Volatile False(默认就是易失性),或者改为Application.Volatile True。这样每次工作表计算(包括NOW()更新时)都会触发AddOne重算; - 强制全工作簿重算:按
F9(而非Shift-F9),Shift-F9仅重算当前工作表,但非易失性函数依赖的易失性单元格不会被识别为“变化”,而F9会强制所有公式重新计算; - 手动更新参数存储值:如果必须保持
AddOne为非易失性,可以用VBA定时修改A1的存储值(比如每隔1分钟写入当前时间),这样Excel会识别到A1的存储值变化,触发AddOne重算。示例代码:
Sub UpdateA1() Range("A1").Value = Now() Application.OnTime Now() + TimeValue("00:01:00"), "UpdateA1" End Sub
内容的提问来源于stack exchange,提问作者DS_London
相关产品推荐
相关产品推荐

