2016-07-22 192 views
0

我想基於用戶名保護工作簿中的所有工作表,因此工作簿將受到保護而不受外部使用,而內部我們可以輕鬆使用。但是,代碼只是一直說行如果ws.Protect = TRUE,則是假的,甚至當我知道紙張保護...保護工作簿中的所有工作簿

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 

任何幫助,將不勝感激!

回答

1

你需要看看ProtectContents屬性,因此

If ws.Protect = True Then應該If ws.ProtectContents = True Then

+0

由於這將是假的!我很親密,但還很遙遠! – Lowpar

1

ws.protect是保護不檢查表,如果它的保護命令。您可以使用

ActiveSheet.ProtectContents

ActiveSheet.ProtectDrawingObjects

activeSheet.ProtectScenarios

如果檢查語句,如果表是這些特性的任意組合的保護。

看看這裏的更多信息: https://support.microsoft.com/en-us/kb/161245

1

我要評論您的用戶名檢查代碼,好像它會失敗很多:

Num = CLng(Right(strUser, 6))這將給錯誤,如果strUser的不是結束6位數字。
你想要的是IsNumeric(Right(strUser, 6))
其實,甚至不使用IsNumeric因爲例如IsNumeric("1,234.56")將返回True。

Left(strUser, 1) = "D",因爲你轉換strUset與strUser = LCase(strUser)小寫(除非你在文件的開頭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 
+0

有趣的代碼,我推測使用[]意味着D是D還是d?我會研究這一點,主要是從內部來看,我們都有非常具體的用戶代碼。 – Lowpar

+0

是的,'[]'匹配任何字符https://msdn.microsoft.com/en-us/library/swf8kaxw.aspx – Slai

+0

謝謝!我喜歡你的代碼! – Lowpar

相關問題