我有一个简单的 VBA 子程序,可以解锁工作簿中的所有工作表,调用 Application.RefreshAll,然后重新锁定。在最后一行(Application.DisplayAlerts = True)我收到此弹出窗口,警告我该单元格受到保护。
如果我在调试器中逐步执行子程序,则不会收到警告。只有当我让它正常运行时才会收到警告。
我在代码中设置了断点,包括在调用 LockAllSheets 时。它始终运行良好,并且仅在 Application.DisplayAlerts 重新设置为 True 时才显示弹出窗口。我还禁用了 DisplayAlerts 的初始设置为 False,以为它可能只是“保存”了之前想要显示的警报,但这并没有什么区别。
我已经设置了 Err.number 的监视,它始终为零。
我也做了一个 Range("A1").Select 来查看它是否有任何作用,但并没有。
我发现唯一有区别的事情是注释掉对 LockAllSheets 的调用,这当然是我不想做的事情。
Private Sub btnUpdateAll_Click()
On Error Resume Next
Me.Range("A1:A4").Value = ""
Me.Range("A1:A4").Font.Color = vbBlue
Me.Range("A1") = "Now refreshing all data...please wait"
Me.Range("A2") = "You can monitor progress in the Queries panel on the right."
Application.CommandBars("Queries and Connections").Visible = True
Application.StatusBar = "Refreshing tables...this may take a minute"
ActiveWindow.ScrollColumn = 1
ActiveWindow.ScrollRow = 1
Application.DisplayAlerts = False
Call UnlockAllSheets
ActiveWorkbook.RefreshAll
If Err.Number <> 0 Then
Me.Range("A1:A4").Font.Color = vbRed
Me.Range("A1").Value = "The required Oracle driver isn't installed. Create an IT ticket to install it. "
Err.Clear
Else
Me.Range("A1") = "Workbook last refreshed on " & Now
Me.Range("A2") = "The data warehouse updates nightly."
End If
On Error GoTo err_handler
Application.CommandBars("Queries and Connections").Visible = False
Application.StatusBar = False
Call LockAllSheets
Application.DisplayAlerts = True
Exit Sub
err_handler:
MsgBox "An error has occurred: " & Err.Number & ": " & Err.Description
Stop
End Sub
Sub LockAllSheets()
Dim ws As Worksheet
For Each ws In ActiveWorkbook.Sheets
If Not ws.ProtectContents Then
ws.Protect Password:=sPassword, userinterfaceonly:=True, AllowSorting:=True, AllowFiltering:=True, AllowUsingPivotTables:=True
End If
Next
End Sub
Sub UnlockAllSheets()
Dim ws As Worksheet
Application.ScreenUpdating = False
For Each ws In ActiveWorkbook.Sheets
ws.Unprotect sPassword
Next
Application.ScreenUpdating = True
End Sub
答案1
啊哈!搞明白了。我注意到,当弹出有关锁定工作表的警告时,Excel 在状态栏上显示“正在运行后台查询”。其中一个查询(使用 PowerQuery 筛选表格并在不同选项卡上创建筛选表的查询)在 VBA 锁定工作表后仍在运行。取消选中其复选框以启用后台刷新,问题就解决了。
编辑:虽然锁使用 userinterfaceonly=true,所以我不确定为什么 Excel 仍然会对此提出异议。
答案2
在这里猜测一下,尝试一下
Application.EnableEvents = False
'Your code ...
Application.EnableEvents = True