【问题标题】:VBA un-protect sheet, run sub, then re-protect sheet?VBA取消保护工作表,运行子程序,然后重新保护工作表?
【发布时间】:2015-06-16 18:47:57
【问题描述】:

这是我的问题,当我在工作表解锁的情况下测试它们时,我的 subs 可以工作,但是当我锁定工作表以保护某些单元格不被选择或删除/更改时,subs 错误。所以我需要在我的 sub 中添加一个部分来解锁,运行主代码,然后重新锁定工作表。

我正在寻找这样的东西

Sub Example ()
Dim sample as range
set sample as range("A3:Z100")
Application.ScreenUpdating = false
UN-PROTECT CODE
'Existing sub code here
RE-PROTECT CODE
Application.ScreenUpdating = True
End Sub

然而,我不知道实现这一点的代码应该是什么样子。我已经尝试过研究,但我发现的只是基于 cmets 的不完整代码,并没有一直有效。我确实找到了一个关于错误的建议,让错误处理程序重新保护工作表,但也不知道如何写这个。有什么建议吗?

哦,使用此工作表的人将无法访问工作表密码。我计划对模块进行自我密码保护,并将潜艇附加到按钮上。因此,如果需要,将 Sheet 解锁密码放在 sub 中就可以了。

【问题讨论】:

  • 如果您使用宏记录器然后保护和取消保护工作表,它将显示代码。
  • 在我将密码添加到代码中之后它就不会要求它了,然后添加了一个事件处理程序,然后根据需要调用了 sub(s)。请发布一个答案,以便我可以在到期时给予信用。

标签: vba excel


【解决方案1】:

发布我的原始评论作为答案。

如果您使用宏记录器,然后保护和取消保护工作表,它会显示代码。

编辑:添加以下内容。

如果您尝试取消保护未受保护的工作表,您将收到错误消息。我使用此函数测试工作表是否受保护,将结果存储在 Boolean 变量中,然后测试变量以查看 a) 工作表在写入之前是否必须不受保护,以及 b) 查看工作表是否应该在过程结束时受到保护。

Public Function SheetIsProtected(sheetToCheck As Worksheet) As Boolean
    SheetIsProtected = sheetToCheck.ProtectContents
End Function

【讨论】:

    【解决方案2】:

    您需要它来删除密码吗?这对我有用

    Sub macroProtect1()
    
    Sheet1.Unprotect Password:="abc" 
    
    'Enable error-handling routine for any run-time error
    On Error GoTo ErrHandler   
    
    'this code will run irrespective of an error or Error Handler
    Sheet1.Cells(1, 1) = UCase("hello")
    
    'this code will give a run-time error, because of division by zero. The worksheet will remain unprotected in the absence of an Error Handler. 
    Sheet1.Cells(2, 1) = 5 / 0
    
    'this code will not run, because on encountering the above error, you go directly to the Error Handler 
    Sheet1.Cells(3, 1) = Application.Max(24, 112, 66, 4)
    
    Sheet1.Protect Password:="abc" 
    
    ErrHandler:
      Sheet1.Protect Password:="abc" 
    
    End Sub 
    

    【讨论】:

    • 无法让它为我工作。但它确实帮助我编写了 ErrorHandler。
    • @proxy156 你试过没有密码部分吗?这是选项,并假设您有密码。
    【解决方案3】:

    遇到了类似的问题,在网上找到了这段代码: 子保护所有() 暗淡我的计数 昏暗 myCount = Application.Sheets.Count 工作表(1).选择 对于 i = 1 到 myCount ActiveSheet.Protect“密码”,真,真 如果 i = myCount 则 结尾 万一 ActiveSheet.Next.Select 接下来我 结束子

    Sub Unprotect1()
        Dim myCount
        Dim i
        myCount = Application.Sheets.Count
        Sheets(1).Select
            For i = 1 To myCount
                ActiveSheet.Unprotect "password"
                If i = myCount Then
                End
            End If
            ActiveSheet.Next.Select
        Next i
    End Sub
    

    请注意,它旨在保护/取消保护工作簿中的所有工作表,并且工作正常。对原作者表示歉意和尊重,我不记得我在哪里找到它(但我没有声称它)......

    【讨论】:

    • 您可以直接循环浏览工作表,无需myCountIf i = myCount Then 代码。
    【解决方案4】:

    最常见的受保护对象是工作表对象。这使得通过锁定包含公式的单元格来保存公式成为可能。

    Sub Demo()
        Dim sh As Worksheet
        Set sh = ActiveSheet
    
        sh.Unprotect
            '   DO YOUR THING
        sh.Protect
    End Sub
    

    【讨论】:

      【解决方案5】:

      对于不需要密码的情况(这是我遇到的大多数情况),这是我非常简单的技术:

      Dim IsProtected As Boolean
      
      IsProtected = SomeWkSh.ProtectContents: If IsProtected Then SomeWkSh.Unprotect
      
      'Do stuff on unprotected sheet...
      
      If IsProtected Then SomeWkSh.Protect
      

      当然,您可以通过使用 With SomeWkSh 语句稍微简化语法,但如果“Do stuff...”部分指的是更大的方法的属性,跨越 使用语句对象,那么这样做会破坏该功能。

      另请注意,Protect 方法的 Contents 参数默认为 True,因此您不必明确指定,尽管您可以为了清楚起见。

      【讨论】:

        猜你喜欢
        • 2019-03-30
        • 1970-01-01
        • 1970-01-01
        • 2023-03-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-22
        • 2019-05-27
        相关资源
        最近更新 更多