保护工作簿中的所有工作表

时间:2016-07-22 13:08:38

标签: vba excel-vba excel

我想基于用户名保护工作簿中的所有工作表,因此工作簿将不受外部使用的影响,而在内部我们可以轻松使用。但是,代码只是总是声明行如果ws.Protect = True则为假,即使我知道工作表受到保护...

int num1;
signed char ch1;
if (scanf("%hhd",&ch1) == 1) {
  num1 = ch1;
  printf("%d \n",num1);
}

任何帮助将不胜感激!

3 个答案:

答案 0 :(得分:1)

您需要查看ProtectContents属性,所以

If ws.Protect = True Then应为If ws.ProtectContents = True Then

答案 1 :(得分:1)

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

ActiveSheet.ProtectContents

ActiveSheet.ProtectDrawingObjects

activeSheet.ProtectScenarios

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

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

答案 2 :(得分:1)

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

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