我可能经历了一些奇怪的事情。我有一本Excel工作簿,其中有许多工作表可能会以编程方式锁定和解锁。
我有一个问题,除非激活工作表,否则WorkSheet.ProtectContents
似乎没有更新,因此我开始将其扔到使用该属性的函数中。
但是,我进行了一些重构,如果激活工作表,下面代码中的“ 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来创建保护,则您的代码可以访问工作表而无需取消保护。问题在于该属性无法保存。它随当前会话到期。
因此保护对象应与Workbook_Open事件一起创建。因此,在Open事件中,删除保护并设置一个新的保护'UserInterfaceOnly = True`,并且上面讨论的所有问题都不会发生。