Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba Excel 2003-使用条件格式显示错误_Vba_Excel - Fatal编程技术网

Vba Excel 2003-使用条件格式显示错误

Vba Excel 2003-使用条件格式显示错误,vba,excel,Vba,Excel,这实际上是一种改进 上下文: Excel2003,Windows7专业版SP1 处理工作簿A,其中包含调用个人函数的条件格式单元格。此函数引用工作簿a的定义名称 工作簿B已打开或编辑(不仅已激活)。它可以是任何工作簿 我们激活后工作簿A 问题: 如果工作簿B的窗口与工作簿A的窗口重叠,条件格式会导致各种错误。换句话说,当某个时刻工作簿A落后于工作簿B时 根据窗口状态(Excel是否全屏显示,ActiveWindow.WindowsState=xlNormal或xlMaximized,窗口是窄

这实际上是一种改进

上下文:
Excel2003,Windows7专业版SP1

  • 处理工作簿A,其中包含调用个人函数的条件格式单元格。此函数引用工作簿a的定义名称
  • 工作簿B已打开或编辑(不仅已激活)。它可以是任何工作簿
  • 我们激活后工作簿A
问题:
如果工作簿B的窗口与工作簿A的窗口重叠,条件格式会导致各种错误。换句话说,当某个时刻工作簿A落后于工作簿B时

根据窗口状态(Excel是否全屏显示,ActiveWindow.WindowsState=xlNormal或
xlMaximized
,窗口是窄还是宽…),漏洞可能是:

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

  • 显示错误经常发生,特别是当工作簿A和B相邻浮动、相互重叠时。单元格内容消失,具有条件格式的单元格出现重影,屏幕冻结,当尝试在其中一个工作簿周围移动时,将显示窗口边框轨迹(W98样式)

  • 在工作簿A的
    Workbook\u Activate
    中,断点不会停止代码(尽管
    debug.print
    MsgBox
    工作),并且不能使用
    Application
    ActiveWindow
    方法
    Application.CalculateFull
    有时会导致所有单元格的内容消失,直到选中为止(例如,使用Ctrl+A)

如何解决或避免这个问题


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

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

解决方案2:


  • 在工作簿a中的任意位置创建命名单元格,例如,将其称为“CondFormat”。将其值设置为“TRUE”。
    这将是在条件格式公式中驱动调用个人函数的布尔值
  • 按以下方式编辑每个条件格式:
    =MyFunctionWithCellNames($A1)

    变成:
    =IF(CondFormat,MyFunctionWithCellNames($A1))
  • 激活或停用工作簿时自动切换布尔值:
    Private子工作簿_Activate()
    [CondFormat]=真
    末端接头
    专用子工作簿_Deactivate() ThisWorkbook.Names(“CondFormat”).ReferStorRange=False 末端接头
  • 注1:有时,离开工作簿时,[CondFormat]不会切换。
    thiswoolk.Names
    语法使其始终有效

    注2:我们必须将其中一个单元格用于boolean CondFormat,因为只有宏才能访问VBA全局变量


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

    而不是使用Windows状态,您可以使用工作簿.activate将工作簿A放在前面