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,怎样将工作簿内所有橙色单元格公式转换为数值?

VBA密码保护Excel工作簿而不保存

引用另外表格,提示 #REF!路径也设置好了。被引用的表格不打开就错误,打开就正常。不用vba能处理吗?

如何使用vba在excel2010中将保存类型从excel工作簿更改为excel 97-2003?

从Access VBA保存Excel工作簿

保存工作簿 Excel VBA 时删除非法字符