解锁和锁定受保护的工作表
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`,您上面讨论的所有问题都不会发生。
我有一个 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`,您上面讨论的所有问题都不会发生。