Excel VBA未执行的Workbook_Deactivate代码仍引发屏幕闪烁求助
Excel VBA Workbook_Deactivate事件未执行代码分支引发界面闪烁问题解答
问题背景
我在Excel的ThisWorkbook模块中编写了如下Workbook_Deactivate事件子过程:
Private Sub Workbook_Deactivate() On Error GoTo errore If Left(ActiveWorkbook.Name, 4) = "CALC" Then If Uscita = False Then ScreenUpdateOnOff (False) Application.DisplayFormulaBar = False With ActiveWindow .DisplayHorizontalScrollBar = True .DisplayVerticalScrollBar = True End With If CreazioneConfrontoSomme = False Then ThisWorkbook.Protect Password:=" " ScreenUpdateOnOff (True) Else MsgBox "Running here!" ScreenUpdateOnOff (False) Call DeleteSheet("CONFRONTO SOMME") With ActiveWindow .DisplayHorizontalScrollBar = True .DisplayVerticalScrollBar = True End With If Application.Workbooks.Count <= 1 Then ScreenUpdateOnOff (False) Massimizza_Ribbon Application.DisplayFormulaBar = True ScreenUpdateOnOff (True) End If End If End If errore: End Sub
测试环境覆盖Excel 2010和2019两个版本,均出现以下问题:
下述代码片段会导致屏幕上方区域出现短暂“闪烁”:
If Application.Workbooks.Count <= 1 Then ScreenUpdateOnOff (False) Massimizza_Ribbon Application.DisplayFormulaBar = True ScreenUpdateOnOff (True) End If
甚至在这段代码根本没有被执行的情况下,闪烁现象依然会发生:变量Uscita默认值为False,仅关闭工作簿时才会变为True,实际运行时"Running here!"的MsgBox也从未弹出。如果删除或注释掉这段代码,闪烁现象就会完全消失。
问题原因
- VBA即时编译的预扫描机制:Excel VBA运行任何过程前,都会先对整个过程的所有代码做伪代码(p-code)即时编译,哪怕代码处在未命中的逻辑分支里,只要包含对Ribbon、公式栏这类顶层界面元素的操作指令,编译阶段就会触发Excel对这些界面元素的状态重绘检查,这个检查操作会导致顶部区域短暂重绘,也就是你观察到的闪烁。
- 事件触发时机的叠加影响:
Workbook_Deactivate事件本身就发生在工作簿切换的系统界面重绘节点,这个时间点的任何微小界面状态校验操作,都会被放大成肉眼可见的闪烁。 - 可尝试的优化方案:如果需要保留该段代码功能,可以将这段代码单独封装成一个独立的子过程,仅在原分支位置调用该子过程,即可规避预扫描阶段的界面重绘检查,无需删除代码就能解决闪烁问题。
内容的提问来源于stack exchange,提问作者Dolphin975
相关产品推荐
相关产品推荐

