Excel 中出现“您尝试更改的单元格或图表受到保护”的原因是什么?

Excel 中出现“您尝试更改的单元格或图表受到保护”的原因是什么?

我有一个简单的 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 

相关内容