Excel 2003 - 显示条件格式的错误

时间:2017-06-19 14:31:44

标签: vba excel-vba excel

这实际上是this previous topic的改进。

上下文
Excel 2003,Windows 7 Professional SP1。

  • 处理工作簿A,其中包含一个带有条件格式的单元格,用于调用个人函数。此函数引用工作簿A的已定义名称。
  • 打开或编辑工作簿B(不仅已激活)。它可以是任何工作簿。
  • 我们激活回工作簿A.

问题:
如果工作簿B的窗口与工作簿A重叠,则条件格式会导致各种错误。换句话说,在某些时候,工作簿A落后于工作簿B.

根据窗口状态(Excel是否全屏显示,无论是ActiveWindow.WindowState = xlNormal还是xlMaximized,窗口是宽还是宽......),错误可能是:

  • 主要是:调用引用定义名称的个人(易失性)函数的单元格在切换回工作簿A时不会计算。这是一个很大的问题,因为我需要使用Ctrl + Alt + F9强制计算。

  • 经常会出现显示错误,特别是当工作簿A和B相互浮动时,相互重叠。当试图移动其中一个工作簿时,单元格内容消失,出现条件格式的单元格的幽灵单元格,屏幕冻结,窗口边框轨迹(W98样式)...

  • 在工作簿A的Workbook_Activate中,断点不会停止代码(尽管debug.printMsgBox工作)并且您无法使用ApplicationActiveWindow方法。 Application.CalculateFull有时会导致所有单元格的内容消失,直到被选中(例如,使用Ctrl + A)。

如何解决或避免这个问题?

如果对任何人都有兴趣,我将在下面给自己回答!

1 个答案:

答案 0 :(得分:1)

解决方案1: 只是不要使用引用条件格式公式中定义的单元格名称的个人函数。 此解决方案可以解决所有问题,但当 具有复杂的条件格式时,这是不可接受的。

解决方案2:

Bug sample
Bug sample (solved)

  1. 在工作簿A中的任意位置创建一个命名单元格,例如将其命名为“CondFormat”。将其值设置为“TRUE” 这将是在条件格式化公式中驱动个人函数调用的布尔值。
  2. 以这种方式编辑每个条件格式:
    =MyFunctionWithCellNames($A1)
    变为:
    =IF(CondFormat,MyFunctionWithCellNames($A1))
  3. 激活或取消激活工作簿时自动切换布尔值:
    Private Sub Workbook_Activate() [CondFormat] = True End Sub
    Private Sub Workbook_Deactivate() ThisWorkbook.Names("CondFormat").RefersToRange = False End Sub
  4. 注1:有时,离开工作簿时切换[CondFormat]。 ThisWorkbook.Names语法使其始终有效。

    注2:我们必须使用其中一个单元格作为布尔CondFormat,因为只有宏才能访问VBA全局变量。

    注3:我花了很多时间搞清楚这一点,我希望它对其他人有用。我认为条件格式的大多数问题只能在Excel 2003中以这种方式解决,因为Sheet.EnableFormatConditionsCalculation方法只出现在Excel 2007中。