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

Excel 解锁和锁定受保护的工作表,excel,vba,worksheet,Excel,Vba,Worksheet,我有一个Excel工作簿,其中包含许多可以通过编程方式锁定和解锁的工作表 除非工作表被激活,否则工作表.ProtectContents似乎不会更新,所以我开始将其放入使用该属性的函数中 但是,我进行了一点重构,如果激活工作表,下面代码中的“for each”循环将停止工作。使用sheetObj.activate未注释,我的锁定和解锁子例程可以正常循环 这不起作用,会卡在活页1上 Public Function getLockStatus() As Boolean Dim she

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

除非工作表被激活,否则工作表.ProtectContents似乎不会更新,所以我开始将其放入使用该属性的函数中

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

这不起作用,会卡在活页1上

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
公共函数getLockStatus()作为布尔值 将工作表对象设置为工作表 对于此工作簿中的每个sheetObj。工作表 sheetObj.激活 Debug.Print sheetObj.Name&“:已锁定:”&sheetObj.ProtectContents 如果sheetObj.ProtectContents=False且sheetObj.Name为“CSV兼容”,则 Set sheetObj=无 getLockStatus=False 退出功能 如果结束 下一张单张 Set sheetObj=无 getLockStatus=True 端函数 但以下代码是有效的:

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
Public函数unlockSheets()作为布尔值
错误转到doh时:
将工作表对象设置为工作表
对于此工作簿中的每个工作表。工作表
sheetObj.激活
如果sheetObj.ProtectContents=True且sheetObj.Name为“CSV兼容”,则
sheetObj.Unprotect密码:=“somestring”
如果结束
下一张单张
Set sheetObj=无
解锁表=真
退出功能
卫生署:
Set sheetObj=无
Debug.Print“未能解锁工作表”
解锁表=假
端函数

你正在和一只应该关在笼子里的狮子搏斗。不要想得到一支更长的矛。相反,找出为什么笼子是打开的

保护对象有一个属性
UserInterfaceOnly
。如果创建保护时将此属性设置为True,则代码可以访问工作表,而无需解除保护。问题是无法保存此属性。它将在当前会话中过期


因此,应使用工作簿\u打开事件创建保护对象。因此,在打开的事件中,删除保护并设置新的保护,“UserInterfaceOnly=True”,您上面讨论的所有问题都不会发生。

为什么要使用
。激活
sheetObj
是您的循环对象,因此在循环中将其设置为
无任何
没有意义。这并不奇怪,因为它不能像您预期的那样工作。您断言必须激活工作表才能执行保护操作,这是不正确的。你能解释一下“这不起作用,卡在活页1上”是什么意思吗?您是否遇到运行时错误?如果是这样,哪一行抛出了错误?我添加了。激活所有这些,因为我遇到了一个问题,用户不愉快地关闭了Excel。无论何时尝试将其打开备份,Sheet.ProtectedStatus都将返回false,即使该工作表实际上受到了保护。在故障排除过程中,我激活了该工作表,并注意到它导致.ProtectedStatus更新@废话!我没有看到,我想我在排除故障时把它放在那里了,但是移除它并不能防止循环被卡住。如果错误仍然存在,您可能需要更新您的问题。我的支持票还不算在内,但我非常感谢您的帮助!非常感谢你!谢谢你竖起大拇指。你可能没有投票的特权,但你确实有权接受一个答案,在这种情况下,我认为你应该这样做,如果你听从我的建议,它解决了你的问题。