。WorkSheets中每个ws都有奇怪的副作用

问题描述 投票:0回答:1

我可能经历了一些奇怪的事情。我有一本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
excel vba worksheet
1个回答
0
投票

您正在与一只应该关在笼子里的狮子打架。不要想长矛。相反,找出为什么笼子保持打开状态。

保护对象具有属性UserInterfaceOnly。如果您将此属性设置为True来创建保护,则您的代码可以访问工作表而无需取消保护。问题在于该属性无法保存。它随当前会话到期。

因此保护对象应与Workbook_Open事件一起创建。因此,在Open事件中,删除保护并设置一个新的保护'UserInterfaceOnly = True`,并且上面讨论的所有问题都不会发生。

© www.soinside.com 2019 - 2024. All rights reserved.