Файл с макросами не открывается
В данной статье хочу описать вкратце способ, как можно запустить какой-то файл Excel с разрешенными макросами. Зачем это надо: бывают ситуации, когда Вы высылаете файл с макросами и хотите, чтобы его открывали только с разрешенными макросами, т.к. без них он бесполезен (как правило через макросы выполняются некие операции при работе с файлом). В принципе есть способы заставить пользователя работать с файлом только при включенных макросах. Самый простой (способ 1) - это заставить его именно разрешить их выполнение, прежде чем начать работу с файлом.
Вариант 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", на котором у нас написаны инструкции по включению макросов, которые ему в любом случае придется выполнить, если есть желание работать с файлом.
Вариант 2:
Этот способ подразумевает создание отдельного файла, который будет запускать файл 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
- возможность сменить/снять пароль к файлу после его открытия скриптом(можно избежать, внеся некоторый код в файл. Например сохранять только с нужным паролем). В примере пароль к файлу: 4321
Файл EXE. Долго пояснять не буду. Основные моменты все те же, что и со скриптом, т.к. в принципе это одно и то же, за исключением того, что код файла EXE нельзя подсмотреть, просто сменив расширение. А это значит, что и пароль к файлу подсмотреть тоже не получится(без использования специальных навыков и программ). Создается такой файл в специальной программной среде: С++, VisualBasic, Delphi и т.п. Основной минус: нельзя поменять пароль к файлу, не скомпилировав новый файл EXE. Т.е. если планируете использовать не с одним файлом, то надо всем им давать один и то же пароль, либо вообще не устанавливать пароль на открытие.
Не так давно очередной раз столкнулся с ошибками приложения Excel при попытке включения макросов после открытия файлов .xlsm. Вспомнил, что подобные проблемы преследуют пользователей довольно давно, но чаще всего они наблюдались с Excel 2013 и Excel 2016. Характерные особенности этой группы ошибок следующие:
- Приложение Excel закрывается при открытии файла с макросами (при включенном режиме безопасности Включить все макросы );
- Ошибка приложения Excel возникает при попытке включить содержимое (нажатии соответствующей кнопки);
- Ошибка приложения Excel возникает при сохранении файла с макросами;
Ну и по горячим следам очередного инцидента, дабы не откладывать на потом, решил для себя собрать небольшой хаб по ошибкам приложения Excel с последующей модификацией, дабы опять не терять время на поиск информации в Сети и на составление облака причин.
Суть в том, что в процессе открытия файла xlsm, и при отключенных макросах, в верхней части основного окна (над таблицей), высвечивается строка уведомления: ПРЕДУПРЕЖДЕНИЕ СИСТЕМЫ БЕЗОПАСНОСТИ Запуск макросов отключен , с кнопкой включения содержимого (макросов). Как только пользователь её нажимает, Excel попросту аварийно завершается (падает) с ошибкой Программа Microsoft Excel не работает и характерным окном уведомления:
При этом было замечено, что непосредственно перед возникновением ошибки приложения Excel никаких системных обновлений и обновлений пакета Office не устанавливалось. Возможно, каким-то образом задействованы последние обновления на Office, но прямой связи я не заметил, а подробного исследования проблемы не проводил. При этом зависимости от версии операционной системы (мною лично сбои наблюдались на Windows 10 LTSC и Windows 7 Professional) так же выявлено не было. При анализе аварийного дампа приложения ( *.hdmp ) обычно можно увидеть подобную информацию исключения (вывод урезан):
обычно это NTSTATUS с кодом c0000005 - Access violation, доступ запрещен. И чаще всего в дампе можно увидеть такой вот стек потока (вывод оптимизирован для улучшения представления):
000000b9 ` 1acfdd08 000001d3 ` 24c1fe20 : 00000000 ` 00000000 000001d3 ` 2fda9640 : 0x000001d3 ` 2fb24e90
000000b9 ` 1acfdd10 000001d3 ` 6cf35760 : 000001d3 ` 2fda9640 000001d3 ` 045c9b30 : 0x000001d3 ` 24c1fe20
000000b9 ` 1acfdd18 000001d3 ` 5a0e0ef0 : 000001d3 ` 045c9b30 000001d3 ` 2fcbb2b0 : 0x000001d3 ` 6cf35760
000000b9 ` 1acfdd20 00000000 ` 00000000 : 000001d3 ` 2fcbb2b0 000001d3 ` 2fcbb318 : 0x000001d3 ` 5a0e0ef0
из которого единственное что понятно, так это то, что падение Excel происходит в недрах функций библиотеки vbe7.dll (среда исполнения VBA), подгруженной в адресное пространство процесса. Это указывает на проблемы с обработчиком VBA-скриптов, в контексте Excel чаще именуемых макросами.
НЕРЕШЕННОЕ: при отладке приложений из комплекта MS Office, вы не увидите имен функций в стеке вызовов, поскольку отсутствуют отладочные символы как к основным исполняемым файлам (Excel/Word/Outlook), так и к многочисленным библиотекам. Интересно, есть ли какое-либо решение?
Так что же такое VBA и для чего он предназначается?
В приложениях, входящих в комплект MS Office, таких как Excel, Word, PowerPoint и Access, VBA используется для автоматизации множества рутинных задач (напр.: повторяющихся однотипных действий), позволяет создавать формы для общения с пользователем и предлагает множество иного богатого функционала. При помощи VBA доступно управление электронной таблицей посредством объектно-ориентированной модели кода/данных, при помощи VBA-кода входные данные таблиц могут быть обработаны и представлены в итоговых (результирующих) таблицах и диаграммах (графиках). Таблица становится интерфейсом кода, позволяя легко работать, изменять его и управлять расчётами. На выходе VBA проект, используемый в структурах описанных выше приложений (электронные таблицы Excel, презентации PowerPoint, базы Access), компилируется в специальный бинарный исполняемый файл, который размещается внутри файла основного формата. Применительно к Excel это файл vbaProject.bin , который располагается внутри *.xslm-файла в директории /xl , представляющий собой бинарный исполняемый файл проекта, содержащий макрос в откомпилированном (готовом к исполнению) виде.
Наиболее вероятной причиной сбоя является повреждение блока кода VBA, содержащегося в книге Excel. Об истоках этого остается только догадываться, возможно что в структуре .xlsm-файла, в процессе работы с документом, происходят какие-то [непредвиденные разработчиками] изменения, способные приводить блок кода в неработоспособное состояние.
Решение 1: вставка нового листа
Выполните приведенную последовательность действий:
- Открываем [проблемный] .xlsm-файл (файл с макросами).
- Не нажимаем кнопку Включить содержимое .
- Добавляем в книгу Excel новый лист: правая кнопка мыши на ярлыках Лист1/Лист2/Лист3 → Вставить → Лист .
- Сохраняем электронную таблицу. Закрываем Excel.
- Открываем проблемный файл заново и включаем макросы.
Решение 2: перекомпиляция проекта
Выполните последовательность действий:
- Запускаем и открываем новую книгу Excel (не ваш проблемный файл).
- Открываем меню Файл - выбираем Параметры - далее открываем Центр управления безопасностью и заходим в Параметры центра управления безопасностью .
- В разделе Параметры макросов - выставляем чекбокс Отключить все макросы с уведомлением .
- В разделе Надежные расположения - выставляем чекбокс Отключить все надежные расположения .
- В разделе Надежные документы - выставляем чекбокс Отключить надежные документы .
- Жмем везде OK . Закрываем Excel.
- Открываем [проблемный] .xlsm-файл (файл с макросами).
- Не нажимаем кнопку Включить содержимое .
- Открывает редактор Visual Basic при помощи комбинации клавиш Alt + F11 . Либо можно использовать обходной маневр: в настройках включаем меню Разработчик , после этого в появившемся сверху в ленте меню Разработчик выбираем пункт Visual Basic .
- В открывшемся окне редактора Visual Basic (VBA редактор) пересохраняем проект: для этого жмем на панели инструментов кнопку Сохранить (изображение дискетки или комбинация Ctrl + S ).
- Выбираем из меню Debug - выбираем пункт меню Compile VBA Project :
Решение 3: добавление модуля
Дополнительное решение состоит в том, что бы внести изменения в макрос без перекомпиляции.
- Открываем [проблемный] .xlsm-файл (файл с макросами).
- Не нажимаем кнопку Включить содержимое .
- Открывает редактор Visual Basic (при помощи комбинации клавиш Alt + F11 ).
- Открываем меню Tools → пункт Options . В открывшемся окне переходим на вкладку General и деактивируем чекбокс Compile on Demand :
Вчера не успела отредактировать очень трудный текст своей сестры. А он ей срочно нужен. Заново редактировать - слишком большой напряг - я не в состоянии! Выручайте, пожалуйста!
". Пишу Вам, разлюбезная Катерина Матвеевна, поскольку выдалась свободная минутка.. . "
(тов. Сухов Ф. И. , красноармеец)
во первых строках своего письма позвольте мне, разлюбезная Катерина Матвеевна баушка Бекар, выразить свое негодудение тем фактом, что Вы, засидевшись допоздна, как самый изощренный маньяк-трудоголег, сохраняли документ не глядя, или глядя в сторону любимой пепельницы, што практически одно и то же, и приравнивается к термину "автоматом".
неудивительно, что заместо ожидаемого расширения > сей важный документ получил сомнительное окончание (фелолагам превед! ) >.
это еще раз подтверждает Ваше легкомысленное отношение к данным не одному десятку пользувателей клятвам ложиться вовремя, при лучине не писать, регулярно посещать душ Шарко и тэ дэ.. .
поэтому при попытке вскрытия документа поутру ("утро вечера мудренее", - одна лигушка сказала, ога! ) ошибка была неизбежной. .
необходимо пересохранить документ в другом (нужном нам) формате.. .
поскольку Вы переслали мне его с оказией, позволю себе графически изобразить ход мысли.. . =))
итак. . на почте лежит документ с расширением >, который мы пытаемся скачать в собственный комп.. .
поскольку установленным браузером является opera, не удивляемся указанному типу файла и предложению открыть документ в том же браузере. .
быстренька находим в ячейке нужный нам Microsoft Word (Билли, с тебя таки пара сотен американских бублегав за скрытую рекламу!). .
. и выбираем кнопку "сохранить"..
затем в новоявленном окне (см. ниже) в ячейке "Тип файла" выбираем
"Все", а в ячейке "Имя файла" принудительно дописываем расширение - >
после всех манипуляций находим файл в компьютере и пытаемся открыть его по новой, скрестив пальцы на правой руке, а левой удерживая кнопку "Shift", на случай, есле эта макросовая сволочЪ еще там. .
вот, сопсссна, и всё. =))
P.S. Помогать людям - нашефсьо!. . ". Потому как долг революционный к тому нас обязывает. " (с)
Ой! Ну ты ж знаиш, што я пацталом! Ваще.
Каг жы я типерь ЛО выберать буду, сирота я нещасная. Текст доправлен, сестра спасена! Я уже бегу Саньке отчет писать про твои доблести. А сестра небось очумеет, што тока Киев - матерь городов русских, спас ейную америку (засратую, пардон! так говорила одна старенькая сотрудница Общего отдела АПН), в т. ч. Южную (аргентина отдыхает!).
На сем остаюсь твоя обратно вечная должница Ирка, туды меня в качель.
Слать УПК фргшный штоль?
((= Могулия =)) Мудрец (17401) сестра пущай для билли (гейтса, есле чо!) превед передаст.. =)).. и мысленна фигу скрутет. ат фсиво эСэСэСэРу. =)))))) давай ужо кодекс. с афтографам.. =)) и брысь ат компа на десять метрав. минемум. $-)
втарая картинго - ниапхадимае пасобие фслучае, есле мы захочим аткрыдь дакумент сразу, нисахраняя исходнег в кампьютыре..
ну и билли прапеаредь, самосабой.. =))
Предположим, Вы скачали файл с данного сайта с примером макроса, открываете файл, но макросы в нем не работают! Как такое может быть? Неужели автор сайта выложил неработающий пример и не знает об этом? И тем более как может случиться такое, что Вы перенесли со своего ПК на другой ПК файл с рабочими макросами на флешке, запускаете, а он не работает. Почему? Вроде все правильно делаете, да ведь и у Вас работает на ПК. И начинает закрадываться мысль: "А чем же этот ПК и Excel на нем такие особенные?" . А ответ может быть прост - перед выполнением макроса не было разрешено выполнение этих самых макросов. Да, в большинстве случаев по умолчанию выполнение макросов в Excel отключено. И их надо включить. Для этого:
- Excel 2003:
Сервис-Безопасность-Уровень макросов "Низкий" - Excel 2007:
Кнопка Офис-Параметры Excel (Excel Options) -Центр управления безопасностью (Trust Centr) -Параметры центра управления безопасностью (Trust Centr Settings) -Параметры макросов (Macro Settings) -Разрешить все макросы (Enable All Macros) - Excel 2010-2016:
Файл (File) -Параметры (Options) -Центр управления безопасностью (Trust Centr) -Параметры центра управления безопасностью (Trust Centr Settings) -Параметры макросов (Macro Settings) -Разрешить все макросы (Enable All Macros)
Если макросы уже включены, но некоторые макросы отказываются работать (как правило те, которые записаны в модулях листов и книг и запускаются при наступлении определенного события - Worksheet_SelectionChange (выделение ячеек), Worksheet_Change (изменение значений ячеек) и т.п.), то скорее всего когда-то вы выполнили какой-нибудь макрос и он отключил отслеживание событий. Тогда надо в любую активную книгу добавить модуль(переходим в редактор VBA( Alt + F11 ) -Insert -Module), вставить в него приведенный ниже код и запустить:
Sub Reset_Events() Application.EnableEvents = True End Sub
чтобы запустить(выполнить) данный макрос макрос необходимо установить курсор в любое место между Sub и End Sub и нажать клавишу F5 .
В данной статье хочу описать вкратце способ, как можно запустить какой-то файл Excel с разрешенными макросами. Зачем это надо: бывают ситуации, когда Вы высылаете файл с макросами и хотите, чтобы его открывали только с разрешенными макросами, т.к. без них он бесполезен (как правило через макросы выполняются некие операции при работе с файлом). В принципе есть способы заставить пользователя работать с файлом только при включенных макросах. Самый простой (способ 1) - это заставить его именно разрешить их выполнение, прежде чем начать работу с файлом.
Вариант 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", на котором у нас написаны инструкции по включению макросов, которые ему в любом случае придется выполнить, если есть желание работать с файлом.
Вариант 2:
Этот способ подразумевает создание отдельного файла, который будет запускать файл 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
- возможность сменить/снять пароль к файлу после его открытия скриптом(можно избежать, внеся некоторый код в файл. Например сохранять только с нужным паролем). В примере пароль к файлу: 4321
Файл EXE. Долго пояснять не буду. Основные моменты все те же, что и со скриптом, т.к. в принципе это одно и то же, за исключением того, что код файла EXE нельзя подсмотреть, просто сменив расширение. А это значит, что и пароль к файлу подсмотреть тоже не получится(без использования специальных навыков и программ). Создается такой файл в специальной программной среде: С++, VisualBasic, Delphi и т.п. Основной минус: нельзя поменять пароль к файлу, не скомпилировав новый файл EXE. Т.е. если планируете использовать не с одним файлом, то надо всем им давать один и то же пароль, либо вообще не устанавливать пароль на открытие.
Читайте также: