【问题标题】:Excel 2003 - Workbook_Activate bug for ActiveSheet.CalculateExcel 2003 - ActiveSheet.Calculate 的 Workbook_Activate 错误
【发布时间】:2017-06-14 15:58:06
【问题描述】:

上下文:
Excel 2003、Windows 7 专业版 SP1

  1. 处理包含自定义函数的工作簿 A。
  2. 工作簿 B 已打开或编辑
  3. 返回工作簿 A,Workbook_Activate sub 如下:

    Private Sub Workbook_Activate
        ActiveSheet.Calculate
    End Sub
    
  4. 此过程应强制计算工作簿 A 的自定义函数,在工作簿 B 的编辑期间,这些单元格显示 #VALUE

以下是我电脑上的bug,希望大家帮帮我!

  • 当工作簿(不是整个 Excel 窗口)不在状态 ActiveWindow.WindowState = xlNormal 时(即全屏或最小化)

或:

  • 当工作簿处于状态 ActiveWindow.WindowState = xlNormal 并且工作簿的宽度 > 725 像素 (!)

那么:

  • 函数Workbook_Activate 一直被触发(好事)。
  • ActiveSheet.Calculate 函数未触发(或无效)。
  • 断点不会停止代码。
  • 您无法运行任何编辑单元格的代码或运行Application.CalculateFull,否则会出现显示错误,例如在选择范围之前文本或边框消失的整个范围。

问题解决:

在过程Workbook_Activate中,如果我们在ActiveSheet.Calculate之前添加ActiveWindow.WindowState = xlNormal

当工作簿不在状态 ActiveWindow.WindowState = xlNormal 并且 Excel 窗口最大化时

  • 仅在这种情况下,错误仍然存​​在。这是唯一没有触发函数 ActiveSheet.Calculate 的情况。 ActiveWindowmethods 也不会触发。

Obs.: Application.EnableEvents = False 不会改变任何东西。 (它可能甚至没有被触发。)

谢谢!

【问题讨论】:

  • ActiveSheet 可能不是你想的那样。也许在运行Calculate 方法之前尝试Activate 您想要的工作表,或者至少使用MsgBox ActiveSheet.Name 之类的东西对其进行调试,这样您就可以确定哪个工作表当前处于活动状态。由于这种潜在的混淆,许多人建议不要使用ActiveSheet,而是直接指定工作表。
  • ActiveSheet 是正确的,我已经检查过了。实际上,一切正常(debug.print、msgbox...),除了 .Calculate 或 .CalculateFull 方法没有正确触发。

标签: vba excel


【解决方案1】:

我找到了一个简单的解决方案来避免这个错误。

Private Sub Workbook_Deactivate()
    Application.Calculation = xlCalculationManual
End Sub

Private Sub Workbook_Activate()
    Application.Calculation = xlCalculationAutomatic
End Sub

[编辑]
...但这是不可接受的,因为在任何其他打开的工作簿上,计算默认设置为“手动”。

最佳解决方案在这里:Excel 2003 - Display bug with conditional formatting

【讨论】:

    猜你喜欢
    • 2013-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多