VBA取消保护纸张,运行子,然后再重新保护纸张?

时间:2015-06-16 18:47:58

标签: excel vba excel-vba

这是我的问题,当我用未锁定的纸张测试它们时,我有可用的功能,但是当我锁定纸张以保护某些单元格不被选中或删除/更改时,则输出错误。所以我需要在我的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

然而,我并不知道实现此目的的代码应该是什么样的。我已经尝试过研究,我发现的所有内容都是基于评论的不完整代码,并不是一直都有效。我确实找到了一个错误的建议,有一个错误处理程序重新保护工作表,但不知道如何写这个。有什么建议吗?

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

5 个答案:

答案 0 :(得分:3)

发布原始评论作为答案。

如果您使用宏录制器然后保护& unprotect sheet,它会显示代码。

编辑:添加以下内容。

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

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

答案 1 :(得分:1)

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

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 

答案 2 :(得分:1)

有类似的问题,并在网络上发现此代码:     Sub protectAll()         昏暗的myCount         朦胧我         myCount = Application.Sheets.Count         片材(1)。选择         对于i = 1到myCount             ActiveSheet.Protect“password”,true,true             如果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

请注意,它旨在保护/取消保护工作簿中的所有工作表,并且工作正常。向原作者道歉和尊重,我不记得我发现它的位置(但我没有声称)...

答案 3 :(得分:0)

受保护最常见的对象是工作表对象这样可以通过锁定包含它们的单元格来保留公式。

Sub Demo()
    Dim sh As Worksheet
    Set sh = ActiveSheet

    sh.Unprotect
        '   DO YOUR THING
    sh.Protect
End Sub

答案 4 :(得分:0)

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

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,因此您不必明确指定,尽管您可以为清楚起见。