Как запустить файл с включенными макросами?
В данной статье хочу описать вкратце способ, как можно запустить какой-то файл Excel с разрешенными макросами. Зачем это надо: бывают ситуации, когда Вы высылаете файл с макросами и хотите, чтобы его открывали только с разрешенными макросами, т.к. без них он бесполезен (как правило через макросы выполняются некие операции при работе с файлом). В принципе есть способы заставить пользователя работать с файлом только при включенных макросах. Самый простой (способ 1) - это заставить его именно разрешить их выполнение, прежде чем начать работу с файлом.
Самый простой и легко исполняемый способ. Создаете в нужной книге новый лист. Называете его "WARNING". На листе мы пишем инструкцию по действиям пользователя для включения макросов. Что-то типа:
Excel 2003: Сервис- Безопасность- Уровень макросов «Низкий»
Excel 2007: Меню- Параметры Excel- Центр управления безопасностью- Параметры центра управления безопасностью- Параметры макросов- Разрешить все макросы;
Excel 2010: Файл- Параметры- Центр управления безопасностью- Параметры центра управления безопасностью- Параметры макросов- Разрешить все макросы.
И скрываем все листы в книге, кроме листа "WARNING". Теперь в остается дело за малым: в модуль книги вставляете следующий код:
'Данная процедура скрывает перед закрытием книги все листы, 'кроме листа "WARNING" Private Sub Workbook_BeforeClose(Cancel As Boolean) Application.ScreenUpdating = False Dim wsSh As Worksheet Sheets("WARNING").Visible = -1 For Each wsSh In ThisWorkbook.Sheets If wsSh.Name <> "WARNING" Then wsSh.Visible = 2 Next wsSh ThisWorkbook.Save End Sub 'Данная процедура показывает перед открытием книги все листы, 'кроме листа "WARNING" Private Sub Workbook_Open() Dim wsSh As Worksheet For Each wsSh In ThisWorkbook.Sheets wsSh.Visible = -1 Next wsSh ThisWorkbook.Sheets("WARNING").Visible = 2 End Sub |
Из кода видно, что если макросы будут отключены, то код Workbook_Open не будет выполнен. Следовательно пользователь увидит только лист "WARNING", на котором у нас написаны инструкции по включению макросов, которые ему в любом случае придется выполнить, если есть желание работать с файлом.
Этот способ подразумевает создание отдельного файла, который будет запускать файл Excel. Я предоставлю на выбор либо скрипт VBS, либо созданный мной файл EXE. В чем прелесть. При использовании данного способа совершенно неважно запущен ли уже у пользователя Excel или нет, разрешены ли макросы. Скрипт или EXE сам все запустит и разрешит.
Что такое скрипт VBS? Это обычный текстовый файл, сохраненный с расширением VBS. Такой файл распознается операционной системой как исполняемый и код, расположенный в нем, запускается при двойном щелчке на файле. Чтобы создать такой файл необходимо: создать обычный текстовый файл. Открыть его. Записать в него текст:
test Sub test() Dim objXL Dim Secur Set objXL = CreateObject("Excel.Application") objXL.Visible = TRUE secur = objXL.AutomationSecurity objXL.AutomationSecurity = 1 objXL.Workbooks.Open replace(Wscript.ScriptFullName,".vbs",".xls"),,,,"4321" objXL.AutomationSecurity = secur End Sub |
Сохранить. Поменять расширение текстового файла с .txt на .vbs.
Панель управления-Свойства папки(для Win 7 - Параметры папок)- вкладка Вид- Снять галочку с "Скрывать расширение для зарегистрированных типов файлов"
Скрипт запускает файл Excel, имя которого совпадает с именем скрипта и расположенного в той же папке. В примере к статье это файл "Test". Таким образом Вы можете давать любое имя файлу Excel и файлу скрипта, лишь бы они совпадали. Т.е. назвав скрипт "Run", Вы должны будете и файл Excel назвать так же - "Run". В приведенном коде так же есть возможность указать пароль для открытия файла(в тексте скрипта это пароль 4321, но установить можно любой через свойства файла). Как установить пароль я описывал в этой статье: Как удалить книгу из самой себя. Пароль как правило устанавливается для того, чтобы при попытке запустить файл Excel без скрипта был запрошен пароль. Т.е. без скрипта файлом не воспользоваться. Есть и ложка дегтя - после открытия файла пароль может удалить любой, кто его открыл.
Плюсы использования скрипта:
- пользователь совершает минимум действий
- макросы разрешены как ни крутись
Минусы:
- необходимость создания отдельного файла и привязка к имени
- возможность подсмотреть пароль к файлу, просто сменив расширение файла-скрипта на .txt
- возможность сменить/снять пароль к файлу после его открытия скриптом(можно избежать, внеся некоторый код в файл. Например сохранять только с нужным паролем). В примере пароль к файлу: 4321
Файл EXE. Долго пояснять не буду. Основные моменты все те же, что и со скриптом, т.к. в принципе это одно и то же, за исключением того, что код файла EXE нельзя подсмотреть, просто сменив расширение. А это значит, что и пароль к файлу подсмотреть тоже не получится(без использования специальных навыков и программ). Создается такой файл в специальной программной среде: С++, VisualBasic, Delphi и т.п.
В примере вы найдете файлы с примерами реализации всеми описанными способами:
Run_Wit_Macro.zip (28,1 KiB, 3 899 скачиваний)
Также см.:
Почему не работает макрос?
Управление безопасностью макросов
Статья помогла? Поделись ссылкой с друзьями!

Поиск по меткам
Access apple watch Multex Power Query и Power BI VBA управление кодами Бесплатные надстройки Дата и время Записки ИП Надстройки Печать Политика Конфиденциальности Почта Программы Работа с приложениями Разработка приложений Росстат Тренинги и вебинары Финансовые Форматирование Функции Excel акции MulTEx ссылки статистикаКомментарии, не имеющие отношения к комментируемой статье, могут быть удалены без уведомления и объяснения причин. Если есть вопрос по личной проблеме - добро пожаловать на Форум
а вы точно уверены, что версия 2007 года это 12, а не 13, так как 2010 это 14!
Сергей, совершенно точно.
Здравствуйте, Дмитрий! Можно ли вторым или третьим способом запустить файл excel из rar- архива с паролем?
Здравствуйте, Дмитрий! Решил эту задачу, при условии, что winrar находится в корневом каталоге. А если в Program Files, то скрип не находит winrar. Как я понял проблема в пробеле в названии папки. Не подскажите, как решить эту проблему?
Что самое интересное - если я помещаю скрипт в Program Files и определяю к нему путь через wscript.scripfullname и потом соединяю с winrar, то все работает. Хотя если вывожу через msgbox, то пути абсолютно одинаковые. Не пойму почему не работает.
Добрый день! По варианту 1. Как сделать, чтобы макрос, который скрывает все листы (кроме "warning"), работал до закрытия файла, но после стандартного диалогового окна "сохранить изменения в файле?" и выбора "да"?
Сейчас получается, что если внести изменения, потом выйти, то файл автоматически сохраняется без стандартного окна сохранения (высокая вероятность сохранения ошибок). Если из макроса на закрытие убрать автосохранение, то при выходе появляется диалоговое окно, все листы уже скрыты, если нажать "отменить", то файл не работает, нужно выбрать да/нет (при уже скрытых листах) и заново зайти в файл для продолжения работы.
Возникает проблема с выбором версии Excel при запуске. Нашел статью возможно с решением:
http://www.sql.ru/forum/1046212/vybor-versii-excel-kodom
но к сожалению совсем не владею прог.языком, не подскажите как соединить совет в части:
------
Попробуйте так:
Shell """Путь к Excel 2013"" ""Путь к файл.xlsx"""
Set xlBook = GetObject("Путь к файл.xlsx")
Set xlApp = xlBook.Application
------
с Вашим файлом, чтобы принудительно запускать Excel 2007?
Спасибо
Здравствуйте,Дмитрий. Пытаюсь приладить ваше решение по запуску файла excel. Второй вариант с VBA скриптом у меня работает нормально. Но есть желание сделать исполняемый файл с паролем на открытие из рабочего VBA скрипта. Пробовал несколько программ, но ничего не вышло. Вот самая рабочая, которую я нашел ScriptCryptor создает ехе файл и даже пытается открыть ехсеl файл с некоторой автоматом запускаемой процедурой. Но обламывается на этапе выполнения этой самой процедуры, как я понимаю из-за того, что файл открывается в режиме [только для чтения]. Что заставляет компилятор создавать такой код или это сам excel чудит? VBS скрипт обращается к excel в нормальном режиме и процедура выполняется.
Пожалуйста, посоветуйте, чем и как лучше скомпилировать и полностью обфусцировать. Вы не сталкивались с такой проблемой?
Дмитрий, скажите, а как в первом варианте отобразить не все листы, а только 1 конкретный лист?
Спасибо!
ivan31888, в этой статье подробно написано про скрытые листы:Как сделать лист очень скрытым
Добрый день, Дмитрий, воспользовался Вашим примером и очень понравилось. Подскажите как скомпилировать Ваш скрипт в новый .ехе в VB6 (пока дружу только с ним), для смены пароля. Спасибо.