【问题标题】:Protect all sheets in a workbook保护工作簿中的所有工作表
【发布时间】:2016-07-22 13:08:38
【问题描述】:

我想根据用户名保护工作簿中的所有工作表,因此将保护工作簿不被外部使用,而在内部我们可以轻松使用。但是,代码总是声明 If ws.Protect = True Then 行是假的,即使我知道工作表受到保护...

Private Sub Workbook_Open()
Dim strUser, Num, myCount, ws

    strUser = CreateObject("WScript.Network").UserName
    strUser = LCase(strUser)
    Num = CLng(Right(strUser, 6))


    If Left(strUser, 1) = "D" And Len(strUser) = 11 And IsNumeric(Num) Then
    For Each ws In ActiveWorkbook.Worksheets
    If ws.Protect = True Then
        ws.Unprotect "password"
    Else
        ws.Protect "password", DrawingObjects:=True, Contents:=True, _
                        AllowSorting:=True, AllowFiltering:=True
    End If
    Next ws
    End If

End Sub

任何帮助将不胜感激!

【问题讨论】:

    标签: vba excel


    【解决方案1】:

    你需要查看ProtectContents属性,所以

    If ws.Protect = True Then 应该是If ws.ProtectContents = True Then

    【讨论】:

    • 谢谢!我离得那么近,却又那么远!
    【解决方案2】:

    ws.protect 是保护工作表的命令,不检查其是否受保护。你可以使用

    ActiveSheet.ProtectContents

    ActiveSheet.ProtectDrawingObjects

    activeSheet.ProtectScenarios

    在您的 if 语句中检查工作表是否在这些属性的任何组合中受到保护。

    查看此处了解更多信息: https://support.microsoft.com/en-us/kb/161245

    【讨论】:

      【解决方案3】:

      我只想评论您的用户名检查代码似乎会失败很多:

      Num = CLng(Right(strUser, 6)) 如果 strUser 不以 6 位数字结尾,则会出错。
      你想要的是IsNumeric( Right(strUser, 6) )
      实际上,甚至不要使用IsNumeric,因为例如IsNumeric("1,234.56") 将返回True。

      Left(strUser, 1) = "D" 这将是 False,因为您使用 strUser = LCase(strUser) 将 strUset 转换为小写(除非您在文件开头有 Option Compare Text

      您可以将检查缩短为

      Private Sub Workbook_Open()
          Dim strUser$, ws As Worksheet
          strUser = Environ$("UserName")
          If Not strUser Like "[Dd]????######" Then Exit Sub  ' ? matches any character, # matches any digit from 0 to 9, and [Dd] matches upper or lower case D
      
          For Each ws In ActiveWorkbook.Worksheets
              If ws.ProtectContents = True Then
                  ws.Unprotect "password"
              Else
                  ws.Protect "password", DrawingObjects:=True, Contents:=True, _
                           AllowSorting:=True, AllowFiltering:=True
              End If
          Next ws
      End Sub
      

      【讨论】:

      • 有趣的代码,我猜使用 [] 表示 D 是 D 还是 d?我会研究一下,主要是在内部,我们都有非常具体的用户代码。
      • 是的,[] 匹配其中的任何字符 msdn.microsoft.com/en-us/library/swf8kaxw.aspx
      • Lowpar,记得点击回答你问题的答案旁边的接受答案复选标记(不是我的)
      猜你喜欢
      • 2022-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多