2016-07-22 4 views
0

Я хочу защитить все листы в книге на основе имени пользователя, поэтому книги будут защищены от внешнего использования, тогда как внутренне мы можем легко использовать. Тем не менее, код просто всегда заявляет, что линия Если 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 

любая помощь будет оценен по достоинству!

ответ

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

Смежные вопросы