Как снять защиту с определенных ячеек?

Программирование на Visual Basic for Applications
Sandra_83
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 11.10.2006 (Ср) 15:32

Как снять защиту с определенных ячеек?

Сообщение Sandra_83 » 24.10.2006 (Вт) 18:27

Подскажите, pls.

Мне нужно в Excel сделать всю книгу Protected, но оставить возможность для ввода информации в ячейки определенного цвета (например, желтого).

Private Sub Workbook_SheetActivate(ByVal Sh As Object)
On Error Resume Next
If Cells.Interior.Color = 36 Then
Cells.Locked = Fasle
Else
Cells.Locked = True
End If
ThisWorkbook.ActiveSheet.Protect (pass)
End Sub

Как нужно исправить?

KL
Microsoft MVP
 
Сообщения: 483
Зарегистрирован: 30.10.2005 (Вс) 0:31
Откуда: Madrid

Сообщение KL » 24.10.2006 (Вт) 19:03

Может так:

Код: Выделить всё
Const pass = ""

Private Sub Workbook_Open()
    Dim Sh As Worksheet
    For Each Sh In Worksheets
        Sh.Protect Password:=pass, userinterfaceonly:=True
    Next Sh
End Sub

Private Sub Workbook_SheetActivate(ByVal Sh As Object)
    'If Not TypeOf Sh Is Worksheet Then Exit Sub
    Sh.Cells.Locked = True
    For Each c In Sh.UsedRange
        If c.Interior.ColorIndex = 36 Then c.Locked = False Else c.Locked = True
    Next c
End Sub


Но вобще не вижу смысла в повторе этой процедуры при каждой активации листа. Может лучше так:

Код: Выделить всё
Const pass = ""

Private Sub Workbook_Open()
    Dim Sh As Worksheet
    For Each Sh In Worksheets
        Sh.Protect Password:=pass, userinterfaceonly:=True
        Sh.Cells.Locked = True
        For Each c In Sh.UsedRange
            If c.Interior.ColorIndex = 36 Then c.Locked = False Else c.Locked = True
        Next c
    Next Sh
End Sub
Привет,
KL

Sandra_83
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 11.10.2006 (Ср) 15:32

Сообщение Sandra_83 » 26.10.2006 (Чт) 15:23

Последний вариант хороший, только что-то так тоже не работает.

А "c" - это что? Не нужно ли ее объявить как переменную?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 26.10.2006 (Чт) 15:38

Обязательно. As Range. А за код без объявления переменных отрывать ручки, ножки, и чего там ещё...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

KL
Microsoft MVP
 
Сообщения: 483
Зарегистрирован: 30.10.2005 (Вс) 0:31
Откуда: Madrid

Сообщение KL » 26.10.2006 (Чт) 15:56

Sandra_83 писал(а):Последний вариант хороший, только что-то так тоже не работает.

А "c" - это что? Не нужно ли ее объявить как переменную?


Что конкретно значит "не работает"?

GSerg прав - обычно сам "отрываю ручки, ножки, и чего там ещё...за код без объявления переменных", а тут в попыхах облажался :-)

Если след. код помещенный в модуль ThisWorkbook не срабатывает при открытии файла:

Код: Выделить всё
Option Explicit
Const pass = ""

Private Sub Workbook_Open()
    Dim Sh As Worksheet, c As Range
    For Each Sh In Worksheets
        Sh.Protect Password:=pass, userinterfaceonly:=True
        Sh.Cells.Locked = True
        For Each c In Sh.UsedRange
            If c.Interior.ColorIndex = 36 Then c.Locked = False Else c.Locked = True
        Next c
    Next Sh
End Sub
то по-моему может быть только 3 реальных причины:
- не включены макросы
- код цвета полей, которые должны бы разблокироваться, не 36
- ты забыла заменить значение константы Pass на реально использованный при защите листов пароль.
Привет,
KL

Sandra_83
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 11.10.2006 (Ср) 15:32

Сообщение Sandra_83 » 26.10.2006 (Чт) 17:09

Все уже работает ))
Спасибо большущее!!!

Sandra_83
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 11.10.2006 (Ср) 15:32

Сообщение Sandra_83 » 26.10.2006 (Чт) 17:27

KL, спасибки тебе отдельное, очень мне помог ;)

Sandra_83
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 11.10.2006 (Ср) 15:32

Сообщение Sandra_83 » 14.11.2006 (Вт) 16:25

KL, help me one more time :lol:

Очень нужна быстрая помощь.
В примере приведенном выше, как сделать так, чтобы пользователь даже при protected worksheet мог делать делать group/ungroup ячеек (мог раскрывать и сворачивать ячейки по уже имеющимся плюсикам)?


Вернуться в VBA

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот, SemrushBot и гости: 107

    TopList