Excel VBA > 公式在保存工作簿之前不会更新
Posted
技术标签:
【中文标题】Excel VBA > 公式在保存工作簿之前不会更新【英文标题】:Excel VBA > Formula not updating until workbook is saved 【发布时间】:2015-02-17 00:54:31 【问题描述】:我有一个非常大的 Excel 工作簿(25+ 工作表,15+ VBA 模块)用于财务分析。
我注意到,在我手动保存工作簿 2 到 3 次之前,其中一个公式不会显示值。在保存之前,它将显示为破折号 (-)。保存 2 到 3 次后,数值按预期显示。
我已经在我的宏运行中添加了一些ActiveWorkbook.Save
,但它们似乎不会影响这种情况。
有问题的公式是(对于一个单元格):
=OFFSET(THIS_CELL, 0, -1)+INDEX('ExternalWorksheet'!$A$1:$CR$300,MATCH("Some Term",'ExternalWorksheet'!$A:$A,0),MATCH($B5,'ExternalWorksheet'!$1:$1,0))+INDEX('ExternalWorksheet'!$A$1:$CR$300,MATCH("Some Other Term",'ExternalWorksheet'!$A:$A,0),MATCH($B5,'ExternalWorksheet'!$1:$1,0))+INDEX('ExternalWorksheet'!$A$1:$CR$300,MATCH("Yet Another Term",'ExternalWorksheet'!$A:$A,0),MATCH($B5,'ExternalWorksheet'!$1:$1,0))-OFFSET(THIS_CELL, 0, -17)
(我知道它不守规矩,我没有创建它,我只是程序员;))
我正在使用in this other SO post 所述的THIS_CELL
技巧,因为此公式出现在此工作表的多个“表”中。
我的客户不满意此列显示为破折号,而依赖于它的列在他保存之前显示为 N/A。据我所知,这种行为与 THIS_CELL (或 OFFSET)的使用有关,就好像我删除了 OFFSET 单元格按预期更新一样。但是,我看不出如何摆脱它,因为我必须在工作表中的多个“表”上重复这个公式,并让它们引用正确的单元格。我也无法切换到 RC 表示法,因为我的客户不喜欢它。
【问题讨论】:
由于OFFSET
是一个volatile 函数,它应该在每个 计算周期中重新计算,而不仅仅是影响其结果的那些。 'ExternalWorksheet' 是本地工作表的名称还是外部工作簿中的工作表的名称?如果它是本地的并从已关闭的外部工作簿中提取值,请查看 Excel 选项 ► 高级 ► 计算此工作簿时 ► 更新指向其他文档的链接并保存外部链接值。
'ExternalWorksheet' 指的是不同工作簿中的工作表。我已经打开了更新链接和保存外部链接。
【参考方案1】:
您可以修改 THIS_CELL 诡计以完全消除对 OFFSET
函数的依赖,方法是更改初始选定的单元格以产生必要的偏移量。在这些方向上的第一步声明 选择单元格 A1(这很重要!) 的原因是 THIS_CELL 始终引用您选择的单元格。您不想要您选择的单元格。您想要左边的 1 或 17 列。
(盗用Create a named formula called THIS_CELL修改)
-
在当前工作表中,选择单元格R1(这很重要!)
打开名称管理器 (Ctl+F3)
点击新建...
在名称中输入“THE_CELL_BEHIND_ME”:
在引用中输入以下公式:
=!Q1
注意:确保选择单元格 R1。这个公式是相对于 ActiveCell 的。
在范围下:选择工作簿。
点击确定。
重复使用名称 THE_CELL_WAY_BEHIND_ME 和 =!A1
用于引用。
关闭名称管理器。
使用=THE_CELL_BEHIND_ME
与=OFFSET(THIS_CELL, 0, -1)
相同,=THE_CELL_WAY_BEHIND_ME
与=OFFSET(THIS_CELL, 0, -17)
相同。
【讨论】:
虽然可以删除偏移量,但它并没有解决在发生多次手动保存之前不出现值的问题。不过谢谢你,我现在更了解 THIS_CELL 的魔力了!【参考方案2】:我在 CTRL+S 保存和ActiveWorkbook.Save
之间进行了比较,在这种情况下它们的工作方式不同。无论我通过 VBA 保存多少次,它都不会更新公式。 CTRL+S 似乎在强制重新计算。
从这个post我添加进来
ActiveSheet.EnableCalculation = False
ActiveSheet.EnableCalculation = True
在保存之前已经解决了问题。
【讨论】:
以上是关于Excel VBA > 公式在保存工作簿之前不会更新的主要内容,如果未能解决你的问题,请参考以下文章
excel或者vba,怎样将工作簿内所有橙色单元格公式转换为数值?
引用另外表格,提示 #REF!路径也设置好了。被引用的表格不打开就错误,打开就正常。不用vba能处理吗?