Application.ScreenUpdating不会更改为false

时间:2013-08-24 19:33:20

标签: excel vba excel-vba

我对VBA很新,但我通过阅读这些论坛找到了解决方法。我从来没有遇到过Application.ScreenUpdating无法正常工作的问题,在线研究后,我无法找到问题的答案。

我在excel中创建了一个Daily Checklist应用程序,它在Daily Checklist中提供了一个月视图。任务按行排列,您只需为日历上的那一天的任务选择是,否或不适用。您可以保存清单,并将信息复制到单独选项卡中的数据表中。一切都很完美,除非在保存信息时,Application.Screenupdating不起作用,用户最终会看到闪烁并在数据表和日历视图之间来回跳转。

有关Application.ScreenUpdating未更改为false的任何想法或指导?我试过在不同的地方移动它,但似乎什么都没有用。

这是Save checklist sub:

Sub Save_Checklist()

Dim Checklist_Date
Dim Completed As Long
Dim Left_to_Complete As Long
Dim Database_Date As Range
Dim Database_Row As Long
Dim bScrUpdate

bScrUpdate = Application.ScreenUpdating
If bScrUpdate = True Then Application.ScreenUpdating = False

Worksheets("Database").Unprotect Password:="youngC"

If MsgBox("This button will save this month's checklist data into the database. All previous information will be overwritten. Would you like to continue?", vbYesNoCancel, "Reset the Calender") = vbYes Then

Checklist_Date = Worksheets("Daily Checklist").Range("E4").Value
Add_to = Worksheets("Daily Checklist").Range("AL1").Value
Range("E55").Select
ActiveCell.Resize(2, Add_to).Select
Selection.Copy

    On Error Resume Next
    With Worksheets("Database").Activate
        Range("A1:A366").Select
        Selection.Find(What:=Checklist_Date, After:=ActiveCell, LookIn:=xlValues, LookAt:= _
            xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _
            , SearchFormat:=False).Select
    On Error GoTo 0
        If Not Database_Date Is Nothing Then Application.Goto Database_Date, True
    End With

Selection.Offset(0, 1).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=True


Worksheets("Database").Protect Password:="youngC"

Else
    MsgBox ("Please be sure all information is correct before saving it.")
End If

If Not Application.ScreenUpdating = bScrUpdate _
    Then Application.ScreenUpdating = bScrUpdate

End Sub

这是我在工作簿开放时运行的代码(我在“将任务添加到月份的日历”表中进行分组):

Private Sub Workbook_Open()
    Worksheets("Main Menu").Activate
    With Worksheets("Add Tasks to Month's Calendars")
    .EnableOutlining = True
    .Protect Password:="youngC", _
    Contents:=True, UserInterfaceOnly:=True
    End With
End Sub

非常感谢任何帮助。

谢谢, 克里斯

2 个答案:

答案 0 :(得分:4)

就个人而言,我只是将screenupdating属性设置为false而不检查它,一旦VBA运行完毕,屏幕将正常更新。

此外,我认为问题是当您打开工作表时运行的第二个代码片段不会将screenupdating变为false,因此您将看到您描述的所有动作。 Excel不记得前一个宏将screenupdating设置为false,即使它执行了代码,你仍然会将它重新打开。您应该可以通过在第一行上将screenupdating设置为false来解决此问题,修改如下所示。

Private Sub Workbook_Open()
    Application.ScreenUpdating = False
    Worksheets("Main Menu").Activate
    With Worksheets("Add Tasks to Month's Calendars")
    .EnableOutlining = True
    .Protect Password:="youngC", _
    Contents:=True, UserInterfaceOnly:=True
    End With
End Sub

答案 1 :(得分:0)

如果您在运行期间打印调试状态,则该状态为false,但是在调试模式下,则始终为true,因为您的代码处于暂停模式,并且此状态会自动切换回true,直到您在“快速”模式下再次运行