Страницы: 1
RSS
Как через макросы снимать и ставить защиту листа
 
Задача такова, есть код:
Код
Sub название_макроса

    Range("L3:L5").Select
    Application.CutCopyMode = False
    Selection.Copy
    Range("C3").Select
    ActiveSheet.Paste

End Sub
Но проблема в его использовании в том, что он работает с ячейками, которые заблокированы (что бы кривые руки не збили формулы и т.д.).

Как мне сделать так, что бы перед использованием макроса он снял защиту с листа, а после выполнения ставил обратно?
 
Можно через запись макроса получить код постановки и снятия защиты и потом успешно применить.
Кому решение нужно - тот пример и рисует.
 
включите макрорекордер, снимите защиту с листа, отключите макрорекордер. Скопируйте что получилось и вставьте в нужный макрос. Тоже самое проделайте для защиты листа. Вкл макрорекордер защитите лист выключите макрорекордер. Посмотрите что получилось, скопируйте и вставьте в нужный макрос.
 
Apos, запишите макрорекордером установку защиты и её отмену. Подрихтуйте. Пользуйтесь на здоровье.

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
вот так должно получиться  это снятие защиты, поставить защиту будет Protect , все остальное также.   Пароль здесь как Вы поняли 555
Код
  Worksheets("Лист1").Unprotect Password:="555"
 
Спасибо я попробывал использовать данный инструмент.
Но проблема в том, что он ссылается на конкретное имя листа. Как мне сделать, что бы макрос не был жостко закреплен за названием страницы? (например, работал строго в рамках того листа, где он прописан)
Изменено: Apos - 23.07.2015 17:11:33
 
Обращение к листу из кода внутри листа - Me.Unrotect
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Не сочтите за наглость, но не могли бы вы на примере показать?
 
Apos, кнопка цитирования не для ответа.
 
Цитата
Apos написал:
не могли бы вы на примере показать
8-0 На каком? Приведенная мною строка и есть готовый код, только без пароля.
Me - обращение к тому листу, внутри которого код записан. Хотите на примере - выкладывайте пример файла. А то окажется, что код у Вас не там, где пишите или еще чего.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Если можно, то на этом примере
Код
Sub Макрос2()

    Sheets("название_листа").Select
    ActiveSheet.Unprotect
    
End Sub
 
Ну вот как? Вы пишите:
Цитата
Apos написал:
что бы макрос не был жостко закреплен за названием страницы? (например, работал строго в рамках того листа, где он прописан
Он у Вас в обычном модуле прописан, я отсюда вижу. Но если так хочется(я уже выше дал точно такой же код):
Код
Sub Макрос2() 
    Me.Unprotect
End Sub
Но код должен быть строго в модуле листа. Вы знаете что такое модуль листа? Если нет - то что значит фраза "в рамках того листа, где он прописан"? Может имеется ввиду лист, с которого код запущен? Тогда так:
Код
Sub Макрос2() 
    ActiveSheet.Unprotect
End Sub
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Apos, можно заблокировать лист так, чтобы на макросы эта блокировка не распространялась - то есть для пользователь ничего не сможет поменять, а у макроса будут права на изменение ячеек (даже заблокированных).

Включается эта блокировка макросом:
Код
Sheet1.Protect UserInterfaceOnly:=True
Соответственно, в макросе можно задать и другие параметры блокировки листа - например, разрешить пользователю форматировать ячейки или пользоваться автофильтром с сортировкой. При этом пользователь изменить заблокированные ячейки не сможет, а макрос не будет на этом спотыкаться и весьма успешно будет все менять ;-)

Цитата
Apos написал:
Код
Sheets("название_листа").Select
ActiveSheet.Unprotect
Пардон, конечно, но зачем вырезать гланды через.. кхм..? А если пользователь поменяет название листа, то Ваш макрос перестанет работать...

Заходите в VBA, там ищите окно Properties: если его нет - нажимаете F4. В дереве проекта выбираете тот лист, с которым работаете - в окно свойств загружаются все свойства листа, которые можно поменять во время разработки. Самое первое свойство - (Name) - это имя листа, которое может использоваться в коде (например, Sheet1 как в моем примере выше). Это имя можно изменить только во время разработки, во время выполнения у этого свойства включается атрибут read-only.

И, соответственно, по этому имени и можете обращаться к данному листу; после чего Вас уже не будет интересовать как этот лист называется и как переименовал его пользователь: Excel будет точно знать, что действия нужно выполнять именно с этим листом.
Изменено: Samaretz - 24.07.2015 08:24:28
 
Цитата
Samaretz написал:
Пардон, конечно, но зачем вырезать гланды через
А не пробегала мимо мысль, что в ходе работы пользователь будет добавлять и удалять листы? :-) Такое тоже случается часто  - зависит от выполняемых задач. Поэтому рекомендация хоть и хороша, но не всегда справедлива.
И про usefinterfaceonly неплохо было бы добавить, что после закрытия книги этот параметр сбрасывается. Поэтому его надо устанавливать в момент открытия книги. С примерами я это описывал в этой статье: Как защитить лист от пользователя, но не от макроса?
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Спасибо всем большое, помогли разобраться, особенное спасибо Samaretz и The_Prist за его статью "Как защитить лист от пользователя, но не от макроса?"

п.с.: я только не давно начал разбираться в Visual Basic и данный форум очень помогает мне в этом.
Страницы: 1
Наверх