排除VBA-“屏幕更新=真”故障:屏幕不刷新(例如更改工作表视图)

排除VBA-“屏幕更新=真”故障:屏幕不刷新(例如更改工作表视图),vba,excel,Vba,Excel,在将屏幕更新从关闭切换到打开,再切换到关闭之间,工作簿没有将视图更改为新的未隐藏/激活的工作表,我遇到了一些问题-实际上并没有刷新屏幕。代码如下 我有一个模块,它从主sub调用表单和sub来执行许多任务-在每个sub中(主sub除外),我在开始时关闭屏幕更新,并在下面的示例结束时打开屏幕更新。工作簿中有许多工作表,大部分是隐藏的,用于处理或作为最终可见视图-打开时,只有一个工作表可见,用于启动主子系统 运行时,其中一个子系统取消隐藏并激活最终工作表,然后删除起始工作表,并将屏幕更新切换回True

在将屏幕更新从关闭切换到打开,再切换到关闭之间,工作簿没有将视图更改为新的未隐藏/激活的工作表,我遇到了一些问题-实际上并没有刷新屏幕。代码如下

我有一个模块,它从主sub调用表单和sub来执行许多任务-在每个sub中(主sub除外),我在开始时关闭屏幕更新,并在下面的示例结束时打开屏幕更新。工作簿中有许多工作表,大部分是隐藏的,用于处理或作为最终可见视图-打开时,只有一个工作表可见,用于启动主子系统

运行时,其中一个子系统取消隐藏并激活最终工作表,然后删除起始工作表,并将屏幕更新切换回True,然后退出主子系统,再次调用另一个子系统

但它不会改变视图,视图保留在已删除的工作表上,而子工作表全部完成。我可以通过插入一个MsgBox来诱使它将视图更改为新激活的工作表,但我不想这样做

这对我来说是一个很难找到答案的问题,因为查找屏幕更新和其他任何东西都会找到无数关于如何阻止屏幕更新的答案

Sub createADS()
Dim oneForm As Object
    Set MainWrkBk = ActiveWorkbook
    cancel = False 'initialise
Call ADSheaderFormShow
    Set MainWrkBk = ActiveWorkbook 're-Set MainWrkBk after doing "SaveAs" in previous form
Call ADSformGen
    MainWrkBk.Worksheets("ADSform").Activate 'Doesn't change view
'MsgBox "Enter antenna information from RFDS"
'^^^ Tricks it into refreshing worksheet when active
Call ADSinputFormShow
Call ADSsetAntennas
Call ADSpullData

GoTo ExitHandler

ExitHandler:
    For Each oneForm In UserForms
        Unload oneForm
        ThisWorkbook.Save
    Next oneForm
    Application.ScreenUpdating = True
    Application.DisplayAlerts = True   
End Sub

Private Sub ADSformGen()
    Application.ScreenUpdating = False 'Returned to True after running sub
MainWrkBk.Worksheets("HidDbSh").Visible = True

MainWrkBk.Worksheets("HidDbSh").Cells(1, 1).Value = "Site Info"
MainWrkBk.Worksheets("HidSiteTemp").Range("a1").CurrentRegion.Copy _
    Destination:=MainWrkBk.Worksheets("HidDbSh").Cells(2, 1)
    Columns.AutoFit
    Application.Calculation = xlCalculationAutomatic 'to reset all formula calcs before deleting source
MainWrkBk.Worksheets("HidDbSh").Visible = False

Application.DisplayAlerts = False
MainWrkBk.Worksheets("HidSiteTemp").Delete
Application.DisplayAlerts = True

MainWrkBk.Worksheets("HidADSform").Visible = True
MainWrkBk.Worksheets("HidADSform").Name = "ADSform"
With MainWrkBk.Worksheets("ADSform").UsedRange
        .Copy
        .PasteSpecial Paste:=xlPasteValues, _
        Operation:=xlNone, SkipBlanks:=False, Transpose:=False
        Application.CutCopyMode = False
End With

Application.DisplayAlerts = False
MainWrkBk.Worksheets("BlankADSForm").Delete
Application.DisplayAlerts = True

MainWrkBk.Worksheets("ADSform").Activate
    MainWrkBk.Worksheets("ADSform").Range("B2").Select

Application.ScreenUpdating = True

End Sub

如果要确保激活工作表时屏幕更新,请在激活工作表之前打开屏幕更新。否则,您将面临激活呼叫将生成的重画事件被吞食的风险:

    '...
    Application.ScreenUpdating = True
    MainWrkBk.Worksheets("ADSform").Activate
    MainWrkBk.Worksheets("ADSform").Range("B2").Select    
End Sub

在Application.ScreenUpdate=True(用于更新已删除工作表中的屏幕)之后,立即发出DoEvents命令。消息泵可能塞满了积压的排队命令,以至于屏幕更新丢失。也考虑一些明智的应用来减少在ADSformGen制造的重复的父工作簿和工作表引用。@ JeppED感谢+ 1 DoEvts是我的新闻,而且很棒——它像一个魅力。在我进入它之前,我查了一下,有人提到要小心使用它,你把它放在哪里,它叫什么?。我不确定它的警告是什么,但我把它放在[上面例子中的结束子行]的前面,然后它就翻转过来了。TYVM.@被嘲笑到。。。以语句结束,然后进行干净的编码:我仍然对VBA一点也不精通,我一直在为类似的东西而挣扎,也一直没有激活工作表/工作簿或单元格/范围。我很想学习更好的实践,除了谷歌搜索之外,我当然欢迎并非常感谢关于资源的建议,这些建议为我指明了正确的方向。我正在阅读你发布的链接,并试图让我的头脑围绕着ATM机转,不过-再次感谢你。另请参阅主小节,没有提及屏幕更新更改-屏幕更新应该始终打开-我有以下几行:致电ADSformGen;MainWrkBk.WorksheetsADSform.Activate;MainWrkBk.WorksheetsADSform.RangeB2.Select;'MsgBox从RFD输入天线信息;请致电AdInputFormShow。另外,我在下部潜艇中的更改为True后立即尝试了它,但没有更改。我理解你的意思,不过-它应该是这样工作的,对吧??,它只是没有翻转。@JGR-它应该是这样工作的。如果消息处理程序被淹没,您可以尝试显式调用ScreenRefresh。查看编辑。我似乎没有应用程序。屏幕刷新。@JGR-Doh!很明显,这只是一个词——回滚。