Страницы: 1
RSS
Как избежать ошибки кода на защищенном листе при изменении ячеек?, Включение и отключение защиты листа при наличии кода
 
Доброго времени суток!
Имеется приложение в Excel, некоторые ячейки которого хотелось бы защитить.
Не столько скрыть формулы - сколько просто от случайного стирания.
Что разумеется легко решается.
Ничего нового - тема стара как мир и решается через Protect.
На всех процедурах: Sub ... End Sub все прекрасно работает.
Однако когда дело доходит до процедур изменения ячеек с последующими действиями
исполнение кода завершается ошибкой.
То есть при появлении завершающего присваивания пароля:
Код
Worksheets("List1").Protect Password:="555"
Процедура вылетает. Ошибка вида: Run Time Error '1004'
Код
Private Sub Worksheet_Change(ByVal Target As Range)
Application.ScreenUpdating = False
Worksheets("List1").Unprotect Password:="555"
'много ячеек подверженных изменению
    Set KeyCells = Range("B1")
If Not Application.Intersect(KeyCells, Range(Target.Address)) _
    Is Nothing Then
'необходимые действия    
    Set KeyCells = Range("B2")
If Not Application.Intersect(KeyCells, Range(Target.Address)) _
    Is Nothing Then
'необходимые действия
'и так далее
Worksheets("List1").Protect Password:="555"
End Sub
Может кто сталкивался с подобным и знает простое решение.
По сути нужно защитить даже не лист а просто диапазон ячеек на листе.
Формулы в этих ячейках тоже желательно все-таки скрыть.
Заранее благодарен за советы и решения

Изменено: Vrajadas - 21.11.2018 19:17:48
 
UserInterfaceOnly
 
Изменил:

Код
Worksheets("List1").Protect Password:="555", UserInterfaceOnly:=True
К сожалению процедура по прежнему прерывается.
Мест где пароль присваивается всего несколько.
Пробовал отключать.
Возможно, что пароль включается раньше завершения изменения ячеек.
События меняются более чем в 30 ячейках за 1 раз.
Идет присваивание ячейкам пользовательских значений.
Однако пауза тоже не решила проблему:
Код
Application.Wait (Now + TimeValue("0:00:02")) 
Worksheets("List1").Protect Password:="555", UserInterfaceOnly:=True

Надо сказать что включение пароля вызывает ошибку именно в завершении этой процедуры

Код
Private Sub Worksheet_Change(ByVal Target As Range)
Другие процедуры нормально реагируют на включение/отключение защиты.
Файл выслать не могу - в нем конфиденциальная информация.
Приложение работает с анкетами.
Изменено: Vrajadas - 21.11.2018 20:06:42
 
Спасибо всем!
Решил, но через "одно место" :)
Создал дополнительную пустую процедуру Sub,
внутри которой выполнил
Код
Private Sub Worksheet_Change(ByVal Target As Range)
End Sub 
И уже перед внешним End Sub присвоил нужный пароль
Все сработало очень неплохо.
Задача решена.
Изменено: Vrajadas - 21.11.2018 20:55:30
 
Цитата
Vrajadas написал: Файл выслать не могу - в нем конфиденциальная информация.
Прочитайте правила про файл-пример.

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
Страницы: 1
Наверх