Хитрости »
1 Май 2011 162416 просмотров
Как защитить лист от пользователя, но не от макроса?
Иногда бывает полезно защитить данные на листе от изменений другими пользователями, но при этом так же надо будет работать с данными на листе из VBA(т.е. вносить изменения с помощью кода). Обычная защита листа, конечно, подходит, хоть и есть небольшой недостаток: надо перед каждым обращением к листу снимать с него защиту, выполнять необходимые действия и защищать заново:
Sub Write_in_ProtectSheet() 'снимаем защиту с листа Worksheets("Лист1").Unprotect 'если лист защищен с паролем 1234: Worksheets("Лист1").Unprotect "1234" 'действия на листе.Например,изменение значения ячейки А1 Cells("A1").Value = "www.excel-vba.ru" 'устанавливаем защиту на лист Worksheets("Лист1").Protect 'если лист был защищен с паролем 1234: Worksheets("Лист1").Protect "1234" End Sub
Но есть метод проще.
Если выполнить ниже приведенную строчку кода, то пользователю невозможно будет изменить данные на листе(кроме тех, которые Вы сами разрешите), однако код VBA(макрос) сможет преспокойно вносить любые изменения, не снимая защиту.
Sub Protect_for_User_Non_for_VBA() ActiveSheet.Protect Password:="1111", UserInterfaceOnly:=True End Sub
Основную роль здесь играет параметр UserInterfaceOnly. Если его установить в True, то это говорит Excel-ю, что коды VBA могут выполнять действия по изменению ячеек, не снимая защиты методом Unprotect. Однако сама защита листа при этом не снимается и вручную изменить данные ячеек, не сняв защиту с листа, невозможно.
Код выше устанавливает такую защиту только на активный лист книги. Но можно указать лист явно(например установить защиту на лист с именем Лист1 в активной книге и лист, идущий вторым по порядку в книге(Sheets(2))):
Sub Protect_for_User_Non_for_VBA() Sheets(2).Protect Password:="1111", UserInterfaceOnly:=True Sheets("Лист1").Protect Password:="1111", UserInterfaceOnly:=True End Sub
Так же приведенный код можно еще чуть модернизировать и разрешить пользователю помимо изменения ячеек еще и использовать автофильтр:
Sub Protect_for_User_Non_for_VBA() Sheets(2).Protect Password:="1111", UserInterfaceOnly:=True 'на лист "Лист1" поставим защиту и разрешим пользоваться фильтром Sheets("Лист1").Protect Password:="1111", AllowFiltering:=True, UserInterfaceOnly:=True End Sub
Можно разрешить и другие действия(выделение незащищенных ячеек, выделение защищенных ячеек, форматирование ячеек, вставку строк, вставку столбцов и т.д. Чуть подробнее про доступные параметры можно узнать в статье Защита листов и ячеек в MS Excel). А как будет выглядеть строка кода с разрешенными параметрами можно узнать, записав макрорекордером установку защиты листа с нужными параметрами:
После этого получится строка вроде такой:
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True _ , AllowInsertingColumns:=True, AllowInsertingRows:=True, AllowFiltering:=True
здесь я разрешил использовать автофильтр(AllowFiltering:=True), вставлять строки(AllowInsertingRows:=True) и столбцы(AllowInsertingColumns:=True).Чтобы добавить возможность изменять данные ячеек только через код VBA, останется добавить параметр UserInterfaceOnly:=True:
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True _ , AllowInsertingColumns:=True, AllowInsertingRows:=True, AllowFiltering:=True, UserInterfaceOnly:=True
и так же неплохо бы добавить и пароль для снятия защиты, т.к. запись макрорекордером не записывает пароль:
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True _ , AllowInsertingColumns:=True, AllowInsertingRows:=True, AllowFiltering:=True, UserInterfaceOnly:=True, Password:="1111"
Этот метод всем хорош, все отлично, но. Параметр UserInterfaceOnly сбрасывается сразу после закрытия книги. Т.е. если установить таким образом защиту на лист и закрыть книгу, то при следующем открытии защиты этой уже не будет — останется лишь стандартная защита. Поэтому, если необходимо такую защиту видеть постоянно, то данный макрос лучше всего прописывать на событие открытия книги(модуль ЭтаКнига(ThisWorkbook)).
Сделать это можно таким кодом:
Private Sub Workbook_Open() Sheets("Лист1").Protect Password:="1111", UserInterfaceOnly:=True End Sub
Этот код сработает только после того, как книга будет открыта. А это значит, чтобы увидеть результат необходимо после записи этого кода в ЭтаКнига сохранить книгу, закрыть её и открыть заново. Тогда в сам момент открытия книги код сработает и установит на «Лист1» правильную защиту.
Часто так же бывает необходимо устанавливать одинаковую защиту на все листы книги. Сделать это можно таким кодом, который так же должен быть размещен в модуле ЭтаКнига(ThisWorkbook):
Private Sub Workbook_Open() Dim wsSh As Object For Each wsSh In Me.Sheets Protect_for_User_Non_for_VBA wsSh Next wsSh End Sub Sub Protect_for_User_Non_for_VBA(wsSh As Worksheet) wsSh.Protect Password:="1111", UserInterfaceOnly:=True End Sub
Плюс во избежание ошибок лучше перед установкой защиты снимать ранее установленную(если она была):
Sub Protect_for_User_Non_for_VBA(wsSh As Worksheet) wsSh.Unrotect "1111" wsSh.Protect Password:="1111", UserInterfaceOnly:=True End Sub
Ну и если надо такую защиту установить только на конкретные листы, то убираем цикл и вызываем процедуру только для нужных листов. Если известны их имена, то можно прибегнуть к использованию массивов:
Private Sub Workbook_Open() Dim arr, sSh arr = Array("Отчет", "База", "Бланк") For Each sSh in arr Protect_for_User_Non_for_VBA Me.Sheets(sSh) Next End Sub Sub Protect_for_User_Non_for_VBA(wsSh As Worksheet) wsSh.Protect Password:="1111", AllowFiltering:=True, UserInterfaceOnly:=True End Sub
Для применения в своих задачах в данном коде необходимо лишь изменить(добавить, удалить, вписать другие имена) имена листов в этой строке: Array(«Отчет», «База», «Бланк»)
Примечание: Метод защиты через UsefInterface всем хорош, но есть одно ограничение: метод невозможно использовать в книге с общим доступом(Рецензирование -Доступ к книге), т.к. при общем доступе существуют ограничения, среди которых и такое, которое запрещает изменять параметры защиты для книги в общем доступе.
Также см.:
Как разрешить изменять только выбранные ячейки?
Защита листов/снятие защиты
Как оставить возможность работать со структурой на защищенном листе?
Статья помогла? Поделись ссылкой с друзьями!
Видеоуроки
Поиск по меткам
Access
apple watch
Multex
Power Query и Power BI
VBA управление кодами
Бесплатные надстройки
Дата и время
Записки
ИП
Надстройки
Печать
Политика Конфиденциальности
Почта
Программы
Работа с приложениями
Разработка приложений
Росстат
Тренинги и вебинары
Финансовые
Форматирование
Функции Excel
акции MulTEx
ссылки
статистика
GIG_ant Пользователь Сообщений: 3102 |
Вопрос собственно в теме. А если у юзера макросы отключены, куда тогда вставлять проверку например по дате, мол если текДата больше чем проверочная, тогда не открывать. Макросы же не работают!? |
Hugo Пользователь Сообщений: 23252 |
Тогда нужно делать так, чтобы юзер при отключенных макросах рассматривал пустой лист с дулей, т.е. с надписью ВКЛЮЧИ МАКРОСЫ, ДУРЕНЬ!!! |
nerv Пользователь Сообщений: 3071 |
>>А если у юзера макросы отключены, куда тогда вставлять : ) Не куда. Как вариант: создать лист в книге, на кот. большими буквами написать. «МАКРОСЫ ОТКЛЮЧЕНЫ, ДАЛЬНЕЙШАЯ РАБОТА НЕ ВОЗМОЖНА». И скрывать его каждый раз при открытии, а при закрытии снова делать видимым. |
nerv Пользователь Сообщений: 3071 |
Hugo, а я ведь Ваше сообщение не видел ^_^ =37878= |
Hugo Пользователь Сообщений: 23252 |
nerv, верю Вернее в ключе задачи так — если макросы отключены или дата проверку не прошла — тогда дуля ( ну или две разные дули), а если включены и дата валидна — тогда молча работаем. |
GIG_ant Пользователь Сообщений: 3102 |
я этот вариант рассматривал, но подлый юзер может поступить так: |
Hugo Пользователь Сообщений: 23252 |
Тогда нужно предусмотреть, чтобы функционал был завязан на макросах. |
Hugo Пользователь Сообщений: 23252 |
И кстати перед сохранением тоже нужно макросом скрывать листы в обязательном порядке — тогда будет xlsx с одним видимым листом с дулей. |
nerv Пользователь Сообщений: 3071 |
Еще вариант — подписать документ, сделать Ваши макросы разрешенными по умолчанию, т.е., чтобы окошка открыть с макросами, без них не было вообще. |
nerv Пользователь Сообщений: 3071 |
>>Сохранить в таком виде в формат .xlsx, и дальше опять чихал он на макросы !! Убейте SaveAs |
GIG_ant Пользователь Сообщений: 3102 |
{quote}{login=Hugo}{date=22.08.2011 05:28}{thema=}{post} — и всё равно это ненадёжно :({/post}{/quote} и я о том же, |
KuklP Пользователь Сообщений: 14868 E-mail и реквизиты в профиле. |
Антош, абсолютной защиты не существует. Все, что создано, может быть сломано. Вопрос, сколько времени и средств нужно потратить на взлом. А запрос тоже можно реализовать программно. И нюанс — если юзер способен поломать такую защиту, он наверняка способен сам написать программу, подобную твоей(ну, с некоторыми оговорками). Я сам — дурнее всякого примера! … |
GIG_ant Пользователь Сообщений: 3102 |
Спасибо Сережа. Тогда сделаю несколько уровней защиты, с подковырками, и посмотрим кто кого )) |
KuklP Пользователь Сообщений: 14868 E-mail и реквизиты в профиле. |
Загляни еще сюда: http://www.programmersforum.ru/showthread.php?t=163614 возможно тебе будет интересно. Я сам — дурнее всякого примера! … |
nerv Пользователь Сообщений: 3071 |
Собственно, я не понимаю чем Вам не решение — подписать документ. |
ran Пользователь Сообщений: 7091 |
{quote}{login=nerv}{date=22.08.2011 07:01}{thema=}{post}Собственно, я не понимаю чем Вам не решение — подписать документ. |
nerv Пользователь Сообщений: 3071 |
Пожалуйста. Я специально для себя инфу как-то на этот счет в txt сохранял. Вот она C:Program FilesMicrosoft OfficeOFFICE11SELFCERT.EXE Запускаете SELFCERT.EXE, создаете цифровой сертификат. Потом открываете интересующую Вас книгу, Параметры -> Безопасноть -> Цифровые подписи. Выбираете созданный Вами сертификат. Подписать макросы можно следующим образом: 1. Открываем редактор VBA Затем, закрываем ее. Снова открываем и ставим галку «доверять макросам этого издателя». Все : ) |
ran Пользователь Сообщений: 7091 |
Судя по описанию это, мягко говоря, не совсем то-:) |
nerv Пользователь Сообщений: 3071 |
>>А если у юзера макросы отключены, куда тогда вставлять проверку например по дате Т.о. макросы будут включены ВСЕГДА. ЧТо нето? |
ran Пользователь Сообщений: 7091 |
Не то это то, что, судя по описанию, на моем компе по твоему личному сертификату макросы не включатся. |
Hugo Пользователь Сообщений: 23252 |
#21 23.08.2011 14:10:58 Да, я тоже понял это так — эта штука для того, чтоб на своих макросах небыло запроса (мы им верим), а на всех других был. |
Время на прочтение
5 мин
Количество просмотров 25K
Всем привет! Я обычный пользователь MS Excel. Не являющийся профессиональным программистом, но накопивший достаточно опыта, для установки и обхода защиты проектов VBA.
Дисклеймер:
В данной статье рассмотрены виды защиты проектов VBA, от несанкционированного доступа. Их сильные и слабые стороны – ранжирование.
Цель статьи показать слабые и сильные стороны каждого вида защиты проекта VBA в MS Office.
Демонстрация разработанных инструментов, в надстройке Macro Tools VBA, для снятия и установки той или иной защиты.
Все инструменты реализованы стандартными средствами VBA, без использования дополнительных библиотек.
Главная панель Надстройки Macro Tools VBA
Первый вид защиты — Обычный пароль
Время на снятие: мгновенно
Недостаток: быстрый доступ к запароленному модулю VBA
Стандартный инструмент (В среде VBE: панель Tools -> VBAProject Properties -> Protection).
Самая легко снимающаяся защита. В интернете легко находится код, для снятия данной защиты.
Данную защиту можно снять следующим инструментом:
Второй вид защиты — Project is Unviewable
Время на снятие: от 10 до 15 мин (в ручную)
Недостаток: доступ к исходному коду модуля VBA
Один из самых распространённых видов защит. Встречается в 95% файлах с защитой модуля VBA. При попытке открыть проект, открывается диалоговое окно, с сообщением: Project is Unviewable.
Большинство пользователей Excel, не могут снять данную защиту, так как она имеет множество вариации и нюансов, для ее снятие нужно иметь представление о внутренней структуре файла Excel.
Основан, данный вид защиты, на изменение ключей:
CMG=«4A488FCC54D054D054D054D0»
DPB=«0B09CE0F8E108E108E»
GC=«CCCE09520B120C120CED»
в файле vbaProject.bin
.
Кратко, как создается данная защита
Для создания данной защиты нужно, разархивировать файл Excel. Перейти в архиве в папку xl, открыть файл vbaProject.bin, в конце файла находятся наши ключи, редактируем значения ключей на пусто, сохраняем файл. Переводим наш архив, обратно в файл Excel. Готово!
Это самый простой вариант данной защиты, но существует множество модификаций.
Алгоритм снятия защиты Project is Unviewable.
1) Разархивируем подопытный файл, переходим в файл …xl_relsworkbook.xml.rels
2) В файле workbook.xml.rels ищем строку, содержащую слово vbaProject, обычно имеет следующий вид: />. В этой строке нас интересует ключ Target,иего значение. Значение является название файла, в котором находится проект VBA. Иногда, защищающий меняет значения ключа на printerSettings.bin.Получается маскировка файла с проектом VBA под другой файл.
3) Открываем на редактирование файл, указанный в ключе Target, ищем в файле ключи CMG, DPB, GC. И меняем в их названиях любую букву на любую другую, например: CMC, DPC, CC. При поиске нужно быть аккуратным, так как защищающий может поместить в проект форму, подписью повторяющую один из ключей, например такую: DPB=«0B09CE0F8E108E108E». При ее изменении проект VBA, будет удален из книги Excel. Сохраняем и закрываем файл.
4) Переводим архив обратно в файл Excel.
5) Запускаем приложение Excel, выполняем следующее: в Центре управления безопасностью -> Параметры макросов -> Отключить все макросы без уведомления. Перезапускаем Excel. Данная операция нужна, для блокировки защиты, которую иногда ставят авторы макросов. Данная защита реализована следующим образом. В модуле VBA «ЭтаКнига», создается процедуры, реагирующие на события открытия книги или закрытия книги. Эти события обычно проверяют, наличие пароля на проект VBA, запрет сохранения и прочее.
6) Открываем файл. Если все правильно сделано то, Excel, будет ругаться на не правильные ключи, которые мы отредактировали, в пункте 3. Жмем, да, пока данные сообщения не закончатся и диалоговое окно закроется.
Если данное сообщение не появляется то, вы отредактировали не файл который содержит проект VBA.
7) Открываем проект VBA. После всего, проект VBA должен быть доступен.
Но иногда защита не снимается, тогда нужно сохранить файл, проверить, что он действительно сохранился! И проделать повторно операции с 1 по 7. Обычно так происходит когда в файле workbook.xml.rels в ключе Target установлено printerSettings.bin.При сохранение, Excel исправляет это на значение на vbaProject.bin
Данную защиту можно установить и снять следующим инструментом:
Третий вид защиты — Hidden Module, скрытые модули VBA
Время на снятие: от 15 до 20 мин (нужен редактор OLE — объектов, Structured Storage Viewer, например.
Недостаток: доступ к коду модуля VBA
Менее распространенный вид защиты обычно встречается в комбинации с защитой Project is Unviewable. При установке данной защиты модуль VBA не отображается в проекте книги Excel. О его существовании можно узнать, проанализировав код VBA (что требует время!) или открыть файл Excel в программе OpenOffice или LibreOffice (так же можно смотреть код при защите Project is Unviewable, но данный способ не дает возможность получить рабочий файл, без пароля).
Просмотр кода VBA в LibreOffice
Кратко, как создается данная защита
Для создания данной защиты нужно отредактировать файл с проектом VBA — vbaProject.bin или printerSettings.bin,в зависимости от настроек в файле …xl_relsworkbook.xml.rels. В конце файла удаляются строки вида: Module1=32, 32, 635, 330, Z. С нужными названиями модулей.
Для снятия данной защиты нужно в файле vbaProject.bin — восстановить удаленные записи модулей.
Данную защиту можно установить следующим инструментом.
Четвертый вид защиты — Обфускация кода
Время на снятие: неизвестно, зависит от объема кода и пере использования частей кода
Обфусцированный код VBA
Недостаток: необходимость тестирование файла после обфускации, на работоспособность
Крайне редкий вид защиты, основанный на изменении исходного кода VBA, в не удобочитаемый вид для человека. Удаляются все комментарии, форматирование кода, переименовываются названия всех переменных, процедур, функций, модулей и прочего. Злоумышленнику никогда не удастся восстановить первоначальный вид кода, и потребует достаточно много времени для, его восстановления в удобно читаемый вид для человека.
Для де-обфускации кода нужно иметь время, специализированное ПО.
Данную защиту можно установить следующим инструментом.
Пятый вид защиты — Перенос кода в dll
Время на снятие: неизвестно, зависит от языка программирования и квалификации
Недостаток: необходимости в дополнительном файле dll
Один из самых редких видов защиты. Основная идея перенос основного кода в отдельную библиотеку dll, написанную на любом другом языке программирования. Не распространённость данный вид защиты получил по следующей причине, необходимости за файлом Excel, «таскать» дополнительный файл, dll.
Для получения доступа к коду dll, нужно обладать специальными знаниями.
Заключение
В заключении хочу выделить бесполезность защит: Project is Unviewable и Hidden Module которые, по существу ни отчего не защищают. Позволяют просматривать код VBA, без изменения исходного файла, в таких программах как OpenOffice или LibreOffice. Так и снимаются без особых проблем.
269 / 14 / 0 Регистрация: 26.02.2014 Сообщений: 142 |
|
1 |
|
Защита книги и макрос18.03.2014, 13:33. Показов 19321. Ответов 10
Добрый день уважаемые форумчане. У меня довольно интересный для меня вопрос, если допустим поставить на книгу пароль на открытие стандартным способом через «Сервис» и т.д., можно ли при включении книги с включенными макросами, что бы он снимался каким-то образом? Смысл в том, чтобы при включенных макросах программа запускалась без требования пароля, а если макросы выключить, то книгу без пароля уже открыть нельзя будет. Как ставить защиту листов и структуры книги понятно, а вот как с общей книги…
0 |
Programming Эксперт 94731 / 64177 / 26122 Регистрация: 12.04.2006 Сообщений: 116,782 |
18.03.2014, 13:33 |
Ответы с готовыми решениями: Защита книги Защита книги и кода excel Защита книги от переноса на другой ПК Защита книги excel 2007 10 |
12 / 12 / 4 Регистрация: 16.03.2012 Сообщений: 252 |
|
24.03.2014, 10:07 |
2 |
Нужно в автоопен поставить: Таже нужно ставить пароль автоматом перед закрытием. Для нужно в саб Sub Workbook_BeforeClose вставить:
0 |
40 / 40 / 9 Регистрация: 19.03.2014 Сообщений: 215 |
|
24.03.2014, 12:03 |
3 |
Скорее всего нельзя.
0 |
12 / 12 / 4 Регистрация: 16.03.2012 Сообщений: 252 |
|
24.03.2014, 15:02 |
4 |
Stormy day,
0 |
269 / 14 / 0 Регистрация: 26.02.2014 Сообщений: 142 |
|
24.03.2014, 15:10 [ТС] |
5 |
Может глупый вопрос, а что есть Auto Open и где задавать ему макрос?
0 |
12 / 12 / 4 Регистрация: 16.03.2012 Сообщений: 252 |
|
24.03.2014, 15:16 |
6 |
авто опен — это обычный макрос в каталоге макросов. Делает «создать макрос» …и т.д. Просто первая строчка в макросе «Private Sub auto_open()». Вобщем, если макрос так называется — он запусется при открытии книги.
0 |
40 / 40 / 9 Регистрация: 19.03.2014 Сообщений: 215 |
|
24.03.2014, 15:18 |
7 |
0 |
Derjzemit 269 / 14 / 0 Регистрация: 26.02.2014 Сообщений: 142 |
||||
24.03.2014, 15:30 [ТС] |
8 |
|||
Имеется в виду такой вариант? Если да, то я задаю в лист «Эта книга» его и все равно книга с нуля запускается под паролем. Добавлено через 10 минут
0 |
mrf 12 / 12 / 4 Регистрация: 16.03.2012 Сообщений: 252 |
||||||||
24.03.2014, 15:32 |
9 |
|||||||
книга не запускается под поролем если он не установлен.
2. Также у вас прописан макрос на автоматической выполнение при открытии (обычный макрось в «mudules»:
Т.е. Получается, что выходя из книги устанавливаетсяы пароль на защиту книги(структуры и окно). А при открытии книги выполняется макрос, которые его снимает. Т.о. если макросы отключены, то книги остается защищенной (структура окна и т.п.)
0 |
269 / 14 / 0 Регистрация: 26.02.2014 Сообщений: 142 |
|
24.03.2014, 15:40 [ТС] |
10 |
Да это все и так понятно) я говорю про тот пароль, который устанавливается в сохранении-сервис и пока его не введешь, структуру в принципе увидеть нельзя, не то что бы изменить.
0 |
mrf 12 / 12 / 4 Регистрация: 16.03.2012 Сообщений: 252 |
||||
24.03.2014, 15:44 |
11 |
|||
наверное, это я не правильно понял Добавлено через 1 минуту
0 |
Защита структуры книги при открытии |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |