2012-05-01 2 views
0

Я пытаюсь защитить листы (только видимые) в моей книге Excel в VBA. Я хочу разрешить пользователям редактировать объекты на «Лист 2» и «Лист 3», но не на других.Как защитить листы с различными параметрами в Excel VBA?

Это код, который я использую.

Public Sub WBOpen() 
    Dim sh As Worksheet 
    Dim allowObjects As Boolean 
    For Each sh In Sheets 
    If sh.Visible = xlSheetVisible Then 
     **If sh.Name = "Sheet 2" Or "Sheet 3" Then** 
     allowObjects = True 
     Else 
     allowObjects = False 
     End If 
     sh.Protect Password:=pw(sh), DrawingObjects:=allowObjects, Contents:=True, Scenarios:=True, AllowFormattingRows:=True, AllowFiltering:=True, UserInterfaceOnly:=True 
    End If 
    Next 
End Sub 

Я получаю ошибку несоответствия типа на линии, которую я обернул **. Может ли кто-нибудь сказать мне, где я ошибаюсь?

Спасибо

+3

Вы пробовали: Если sh.Name = "Sheet 2" или sh.Name = "Sheet 3" – Randy

+0

Кроме того, убедитесь, что на «Листе 2», на который вы ссылаетесь, на самом деле есть пробел, когда вы смотрите на вкладку. По умолчанию вкладки не имеют места (например, «Лист2»). – Zairja

+0

Рэнди - по-прежнему получает ту же ошибку – user1187347

ответ

0

Эта линия должна быть: ошибка несоответствия

If sh.Name = "Sheet 2" Or sh.Name = "Sheet 3" Then 

типа приходит потому, что вы лечите строку ("Sheet 3") как логическое (True/False).

+0

Спасибо за это. Также спасибо @Randy за предложение этого предложения выше. – user1187347

0

Не знаю, почему он все равно есть ошибка после ошибки @Randy отметил фиксировались, но я могу сказать вам, что я делаю. Вместо того, чтобы проходить через каждый лист, я обращаюсь к листу, который я хочу защитить напрямую. Это делается с помощью кода , а не имени в графическом интерфейсе.. Например, в редакторе VBA в Project Explorer в папке «Microsoft Excel Objects» я нажимаю на лист «Тестирование» и вижу, что у него есть свойство «(Name)» TestingSheet. Обратите внимание, что это, пожалуй, просто дополнительный шаг, для ясности, поскольку мои другие листы тоже имеют имена - например, «Лист1». Затем в коде я просто наберите:

TestingSheet.Protect , True, True, True, True 

Если вы сделали это, вы бы избежать ошибки во время выполнения, и вы бы также быть более гибкими в плане названия ГИП рабочих листов.

+0

Спасибо за ответ, я буду нести ваши комментарии в виду для будущего развития. – user1187347

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