解锁和锁定受保护的工作表

Unlocking and locking protected Worksheets

我有一个 Excel 工作簿,其中有许多 sheet 可以通过编程方式锁定和解锁。

除非 sheet 被激活,否则

WorkSheet.ProtectContents 似乎不会更新,所以我开始将其放入使用 属性.

的函数中

但是,我重构了一点,如果我激活 sheet,下面代码中的“for each”循环就会停止工作。我的锁定和解锁子例程循环正常,sheetObj.activate 未注释。

这不起作用,卡在 sheet1

Public Function getLockStatus() As Boolean
    
    Dim sheetObj As Worksheet
    For Each sheetObj In ThisWorkbook.Worksheets
        sheetObj.Activate
        Debug.Print sheetObj.Name & ": is locked: " & sheetObj.ProtectContents
        If sheetObj.ProtectContents = False And sheetObj.Name <> "CSV Compatible" Then
            Set sheetObj = Nothing
            getLockStatus = False
            Exit Function
        End If
    Next sheetObj
    
    Set sheetObj = Nothing
    
    getLockStatus = True
    
End Function

但以下代码有效:

Public Function unlockSheets() As Boolean
On Error GoTo doh:

    Dim sheetObj As Worksheet
    For Each sheetObj In ThisWorkbook.Sheets
        sheetObj.Activate
        If sheetObj.ProtectContents = True And sheetObj.Name <> "CSV Compatible" Then
            sheetObj.Unprotect Password:="somestring"
        End If
    Next sheetObj
    Set sheetObj = Nothing
    
    unlockSheets = True
    Exit Function

doh:
    Set sheetObj = Nothing
    Debug.Print "Failed to unlock sheets."
    unlockSheets = False
    
End Function

你在和一头本应关在笼子里的狮子搏斗。不要想着要一根更长的矛。相反,找出笼子打开的原因。

保护对象有一个 属性 UserInterfaceOnly。如果您创建保护并将此 属性 设置为 True,您的代码可以访问 sheet 而无需解除保护。问题是这个属性无法保存。它与当前会话一起过期。

因此应使用Workbook_Open 事件创建保护对象。所以,在 Open 事件中移除保护并设置新的保护,'UserInterfaceOnly = True`,您上面讨论的所有问题都不会发生。