我对 VBA 还很陌生,但我通过阅读这些论坛找到了解决方法。我从来没有遇到过 Application.ScreenUpdating 不起作用的问题,并且在网上研究后,我找不到问题的答案。
我在 Excel 中创建了一个每日检查表应用程序,它在每日检查表中提供了月视图。任务按行排列,您只需为日历上当天的该任务选择是、否或不适用。您可以保存清单,并将信息复制到单独选项卡中的数据表中。一切都很完美,除了保存信息时,Application.Screenupdating 不起作用,并且用户最终会看到数据表和日历视图之间的闪烁和来回跳转。
关于为什么 Application.ScreenUpdating 没有更改为 false 的任何想法或指导?我尝试过将其移动到不同的区域,但似乎没有任何效果。
这是保存清单子项:
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
Run Code Online (Sandbox Code Playgroud)
这是我在打开工作簿时运行的代码(我在“将任务添加到月份日历”工作表中进行了分组):
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
Run Code Online (Sandbox Code Playgroud)
任何帮助将不胜感激。
谢谢,克里斯
就我个人而言,我只是将 screenupdating 属性设置为 false 而不检查它,一旦 VBA 完成运行,屏幕就会正常更新。
另外,我认为问题在于,打开工作表时运行的第二段代码不会将 screenupdating 变为 false,因此您将看到您描述的所有动作。Excel 不记得屏幕更新被之前的宏设置为 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
Run Code Online (Sandbox Code Playgroud)