Excel 解锁和锁定受保护的工作表
我有一个Excel工作簿,其中包含许多可以通过编程方式锁定和解锁的工作表 除非工作表被激活,否则工作表.ProtectContents似乎不会更新,所以我开始将其放入使用该属性的函数中 但是,我进行了一点重构,如果激活工作表,下面代码中的“for each”循环将停止工作。使用Excel 解锁和锁定受保护的工作表,excel,vba,worksheet,Excel,Vba,Worksheet,我有一个Excel工作簿,其中包含许多可以通过编程方式锁定和解锁的工作表 除非工作表被激活,否则工作表.ProtectContents似乎不会更新,所以我开始将其放入使用该属性的函数中 但是,我进行了一点重构,如果激活工作表,下面代码中的“for each”循环将停止工作。使用sheetObj.activate未注释,我的锁定和解锁子例程可以正常循环 这不起作用,会卡在活页1上 Public Function getLockStatus() As Boolean Dim she
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更新@废话!我没有看到,我想我在排除故障时把它放在那里了,但是移除它并不能防止循环被卡住。如果错误仍然存在,您可能需要更新您的问题。我的支持票还不算在内,但我非常感谢您的帮助!非常感谢你!谢谢你竖起大拇指。你可能没有投票的特权,但你确实有权接受一个答案,在这种情况下,我认为你应该这样做,如果你听从我的建议,它解决了你的问题。