我想基于用户名保护工作簿中的所有工作表,因此工作簿将不受外部使用的影响,而在内部我们可以轻松使用。但是,代码只是总是声明行如果ws.Protect = True则为假,即使我知道工作表受到保护...
int num1;
signed char ch1;
if (scanf("%hhd",&ch1) == 1) {
num1 = ch1;
printf("%d \n",num1);
}
任何帮助将不胜感激!
答案 0 :(得分:1)
您需要查看ProtectContents
属性,所以
If ws.Protect = True Then
应为If ws.ProtectContents = True Then
答案 1 :(得分:1)
ws.protect
是保护工作表的命令,不检查其是否受保护。你可以使用
ActiveSheet.ProtectContents
ActiveSheet.ProtectDrawingObjects
activeSheet.ProtectScenarios
点击此处了解更多信息: 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