Макрос для снятия ограничений Excel (безопасность макросов и файлов)

Если вы работаете с книгами Excel древних форматов (таких, например, как Excel 4),
то в Excel 2010 вы можете столкнуться с проблемой, что редактирование этих файлов по-умолчанию запрещено.

В настройках Excel 2010 для этого предусмотрены специальные опции (скриншот)

Мало того, что Excel блокирует редактирование этих устаревших файлов,
так ещё и макросы начинают вести себя очень странно
(например, если активен файл Excel4, простейший макрос чтения пути текущего файла не запускается)

Избежать проблем при работе с такими файлами (а проблемы возможны, если вы обрабатываете макросом множество файлов, полученных от разных организаций), можно, если при открытии надстройки (файла с макросами) выполнить следующий код:

Sub DeleteFileBlock()
    On Error Resume Next
    Key$ = "HKEY_CURRENT_USER\Software\Microsoft\Office\14.0\Excel\Security\FileBlock\"
    arr = Array("XL2Macros", "XL2Worksheets", "XL3Macros", "XL3Worksheets", _
                "XL4Macros", "XL4Workbooks", "XL4Worksheets")
    For Each Item In arr
        CreateObject("WScript.Shell").RegWrite Key$ & Item, 0, "REG_DWORD"
    Next
End Sub

Достаточно поместить вызов этого макроса в процедуру Workbook_Open, - и ограничения будут сниматься при каждом запуске вашей надстройки.

 


 

Аналогично можно сделать макрос, включающий опцию «Доверять доступ к объектной модели проектов VBA»: 

Sub Enable_AccessVBOM() ' включает программный доступ к объектной модели проекта VBA
    On Error Resume Next
    Key$ = "HKEY_CURRENT_USER\Software\Microsoft\Office\" & Application.Version & _
           "\Excel\Security\AccessVBOM"
    CreateObject("WScript.Shell").RegWrite Key$, 1, "REG_DWORD"
End Sub

Этот код припишет в реестре Windows (в ветке с настройками безопасности Excel) необходимые параметры, и вы макросом сможете обращаться к свойствам проекта VBA
(например, чтобы выгрузить код макросов в текстовый файл, изменить кодовое имя листа или программно отредактировать код макросов, программно добавить элементы управления на форму, и т.д. и т.п.)

 

Отключить доступ тоже можно - достаточно поменять в макросе записываемое в реестр значение (с 1 на 0):

Sub Disable_AccessVBOM() ' отключает программный доступ к объектной модели проекта VBA
    On Error Resume Next
    Key$ = "HKEY_CURRENT_USER\Software\Microsoft\Office\" & Application.Version & _
           "\Excel\Security\AccessVBOM"
    CreateObject("WScript.Shell").RegWrite Key$, 0, "REG_DWORD"
End Sub

 


 

Многие пользователи надстроек (и других файлов Excel, содержащих макросы), при каждом запуске книги Excel во всплывающем окне жмут кнопку «Включить макросы».

Что, в принципе, неудивительно, т.к. не все знают, как раз и навсегда включить макросы в разных версиях Excel.

Чтобы избавить пользователя от ежедневного уведомления об «опасных» макросах, можно использовать такой код:

Sub Enable_AccessVBOM_and_Macro()
    On Error Resume Next
    Key$ = "HKEY_CURRENT_USER\Software\Microsoft\Office\" & Application.Version & _
           "\Excel\Security\"
 
    ' включаем программный доступ к объектной модели проекта VBA
    CreateObject("WScript.Shell").RegWrite Key$ & "AccessVBOM", 1, "REG_DWORD"
 
    ' ставим низкий уровень безопасности (применится после перезапуска Excel)
    CreateObject("WScript.Shell").RegWrite Key$ & "VBAWarnings", 1, "REG_DWORD"
End Sub

После выполнения этого макроса, уровень безопасности в Excel будет изменен на «низкий» (при следующем запуске Excel), и уведомления об отключенных макросах (с предложением их включить) появляться не будут.

PS: C одной стороны, нехорошо без уведомления пользователя изменять настройки безопасности его программ.
Но, с другой стороны, макровирусов давно нет, а я сам не пишу вредоносные программы, так что считаю использование такого макроса допустимым.

Комментарии

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".

Добрый день. Я собираюсь распространять некие рекомендации на каждый день в формате эксель.
Довольно частая проблема - блокирована работа макросов + старые версии эксель.
Пожалуйста напишите мне код в котором при открытии книги я разрешаю работу макросов для этой книги.
Для других, я так понимаю разрешения не будет. но, мне надо, что бы это работало "железно" и у всех.

И еще одна проблема. Одна из моих пользовательниц пользуется яблочным компьютером. Там макросы вообще не идут. Делать что?

Не знаю, почему у вас так
Этот код проверен мной на тысячах компов, и у всех сообщение про макросы более не появлялось

Чтобы избавить пользователя от ежедневного уведомления об «опасных» макросах, можно использовать такой код:
-----------------------------------------
Sub Enable_AccessVBOM_and_Macro()
On Error Resume Next
Key$ = "HKEY_CURRENT_USER\Software\Microsoft\Office\" & Application.Version & _
"\Excel\Security\"

' включаем программный доступ к объектной модели проекта VBA
CreateObject("WScript.Shell").RegWrite Key$ & "AccessVBOM", 1, "REG_DWORD"

' ставим низкий уровень безопасности (применится после перезапуска Excel)
CreateObject("WScript.Shell").RegWrite Key$ & "VBAWarnings", 1, "REG_DWORD"
End Sub
-----------------------
Достаточно поместить вызов этого макроса в процедуру Workbook_Open
======================================================================

Сделал, как написано, НО ... запрос на включение макросов все-равно появляется при каждом запуске !..
Каждый раз разрешаешь запуск, а в следующий раз опять выходит сообщение о Включении макросов ...
Что надо сделать, чтобы настройки стали минимальными, как написано в примере, чтобы сообщение о макросах больше не появлялось ?..

Сам нашёл создаем параметр тут
[HKEY_CURRENT_USER\ Software\Microsoft\ Office\14.0\word\security]

Подскажите при добавлении в реестр строку [HKEY_CURRENT_USER\ Software\Policies\Microsoft\ Office\14.0\word\security]
"VBAWarnings"=dword:00000004 (при любом значении)
в самом ворде меню "параметры макросов" становиться не активной, как её оставить активной?

С хабра - "Исследователями в области информационной безопасности был обнаружен новый тип ransomwave — вредоносной программы, шифрующей пользовательские файлы и требующей выкуп в bitcoin. Новый криптовымогатель, который сами создатели назвали «locky», распространяется не совсем стандартным для подобного ПО способом — при помощи макроса в Word-документах. " , так что срочно закрываем макросы

Так! У мене була таже проблема! При програмном створенні нової книги потрібно було вставити в неї макрос і процедуру автозапуску макросу WorkBook_Open або Auto_Open цієї книги в подальшому при відкритті книги. Для цього потрібно встановити довірений доступ до проекту! Приклад функції Disable_AccessVBOM автора статті не деє належного результату: тобто після виконання тієї функції та подальшому зверненні до проекту книги для запису процедур (макросів) спливало повідомлення про помилку: "доступ до проекту не є довіреним ...". Запропонована автором статті функція не дає належного результату, як я припускаю, з тієї причини, що в Office встановлений подвійний ключ на управління доступом до проекту, пов'язаний з самою формою "Безпека макросів". Я вирішив проблему, з Божою допомогою, через запуск форми і її управління за допомогою функції SendKeys. Вибачте, я не буду приводити алгоритм у запобігання того. щоб він опинився в злих руках! Якщо у Вас гарні цілі. то експерементуйте.

Уважаемый админ. Снова Я. Недавно переставил Винду (пару часов назад), поставил 7 на всякий случай, чистую... Поставил Офис 2010, но так как должны выгружаться данные из програмки в Excel они не выгружаются все равно...(( Снова моргнет загрузка и тишина... Макросы разрешил, даже в устной форме))) но ничего.

Олег, я знаю в чем проблема (неверное значение 1-2 ключей в реестре Windows),
но мне лень писать вам инструкцию по поиску и правке этих ключей (на своём компе я бы разобрался, но с чужим компом проще не связываться)

Потому, самое простое решение в вашем случае, - снести все Office какие есть, и поставить только один (рекомендую Office 2010)
При этом все эти ключи перезапишутся, - и всё должно заработать.

Если не поможет, - то проблема в самой этой вашей программе, запускающей файл Excel (недостаточно универсальная)

Спасибо большое за внимание к моей проблеме!
Дело вот в чем. До 2010 у меня стоял 2007 Office, была такая же ситуация, я подумал так же что проблема в установке и установил 2010... но как видно это не помогло.
Что может еще так влиять на такого рода действия?
Спасибо...

Олег, в вашем случае макросы ни при чём.
Ваша программа формирует файл Excel, и даёт Windows команду открытия этого файла.
Если файл не открывается, - значит, Excel некорректно установлен
(не прописаны 1-2 параметра в реестре, отвечающие за команду открытия файлов Excel)

Самый простой способ решить проблему, - переустановить Excel (обновить / исправить установку)

Кто подскажет? Ситуация такая... Есть программа в которой делаю различные операции, а когда нажимаю кнопку Print, то должна запуститься Excel 2010 и все данные туда выкладываются ... Так вот что, на других компах все норм работает, а у меня жмешь и ничего (на 1сек знак загрузки моргнет и все). Excel не запускается вообще!!!! Макросы разрешены в безопасности. Что здесь может быть, куда необходимо нажимать...)) В Excel я как видите не силен...((

а если даже после нажатия на "Включить содержимое", макросы не запускаются?

Спасибо

Есть другой вариант (если не хотите пересохранить файл после первого открытия):
код помещаете в модуль временного активного листа, процедуру запуска - в событие активации листа
После выполнения макроса удаляете этот временный лист - он удалится вместе с кодом, и макросов в файле не останется.

Дело в том, что я сделал книгу ексель, в которой находяться: Private Sub Workbook_Open в ЭтаКнига и 2 модуля. Эта книга должна автоматически открываться на 100 разных компьютерах. Задача стоит в том, чтобы по завршении работы программы все макросы удалялись из этой книги (мне это нужно для того, чтобы пользователи, которые будут открывать эту книгу постоянно не сталкивались с вопросом: "Эта книга содержит макросы...". Программно ставить високий или низкий уровень макросов я не хочу (может у пользователей есть какие-то нюансы работы с ексель)). Версий ексель на этих компьютерах я не знаю, поэтому вариант с сохранением в формате xlsx мне не подходит.

jaroslav, надо перезапустить Excel, чтобы измененные в реестре настройки безопасности вступили в силу
(впрочем, если вручную менять в интерфейсе Excel - часто тоже перезапуск Excel требуется)
Т.е. не получится так, что макрос выполнили, я прям тут же начали программно работать с объектной моделью.

PS: а такие макросы, как Delete_Macroses, вообще не нужны
всё делается на порядок проще, одной строкой кода, - сохранением файла в формате XLSX
(Если нужен другой формат файла, но без макросов, то: создаете программно XLSX методом SAVEAS, закрываете созданный XLSX, открываете снова, сохраняете в нужном формате под нужным именем.)

А макросы, работающие с VBProject, советую использовать только на своем компе (для личных нужд) - где можно поставить галочку в настройках вручную.

Вы пишете:
"Аналогично можно сделать макрос, включающий опцию «Доверять доступ к объектной модели проектов VBA»:

Sub Enable_AccessVBOM() ' включает программный доступ к объектной модели проекта VBA
On Error Resume Next
Key$ = "HKEY_CURRENT_USER\Software\Microsoft\Office\" & Application.Version & _
"\Excel\Security\AccessVBOM"
CreateObject("WScript.Shell").RegWrite Key$, 1, "REG_DWORD"
End Sub

Этот код припишет в реестре Windows (в ветке с настройками безопасности Excel) необходимые параметры, и вы макросом сможете обращаться к свойствам проекта VBA".

Действильно этот макрос прописивает в реестре Windows (в ветке с настройками безопасности Excel) необходимые параметры, но галочку возле Доверять досту к Visual Basic Project в меню Надежные издатели меню Безопасность макросов вкладки безопасность меню Сервис/Параметры в Excel 2003 он не ставит. И при запуске макроса:
Sub Delete_Macroses()
Dim oVBComponent As Object, lCountLines As Long
If ActiveWorkbook.VBProject.Protection = 1 Then
MsgBox "VBProject ." & vbCrLf & _
" "
Exit Sub
End If

For Each oVBComponent In ActiveWorkbook.VBProject.VBComponents
On Error Resume Next
With oVBComponent
Select Case .Type
Case 1
.Collection.Remove oVBComponent
Case 2
.Collection.Remove oVBComponent
Case 3
.Collection.Remove oVBComponent
Case 100
lCountLines = .CodeModule.CountOfLines
.CodeModule.DeleteLines 1, lCountLines
End Select
End With
Next
Set oVBComponent = Nothing
End Sub
выдает ошибку 1004: "Отсутствует доверие к программируемому доступу к проекту Visual Basic". Подскажите, пожалуйста как программно поставить галочку в екселе возле Доверять досту к Visua Basic Project в меню Надежные издатели

По какой-то причине Enable_AccessVBOM() не выполняет, так сказать, полноценный запуск "доступа к объектной модели проекта VBA".
Т.е. макрос срабатывает, ошибок не выдает, но "доступа к объектной модели проекта VBA" все равно не предоставляет. Хотя галочка в соответствующем пункте меню проставляется.
При закрытии файла и последующем его открытии галочки опять нет.
А при запуске макросов в текущем файле выдает ошибку, что "доступ к объектной модели проекта VBA" не предоставлен.
Единственный путь полноценного выполнения макроса, который я нашел, это зайти в настройки, где галочка пункта "доступ к объектной модели проекта VBA" уже стоит и подтвердить нажатием "ОК".
Только тогда все срабатывает как надо.

Protsiv, конечно же, ваш макрос не сработает.

Для того и отключают в Excel макросы, чтобы они не запускались...

Для чего был написан этот код: Если пользователь, запустив ваш файл, увидит предупреждение о макросах, и нажмёт кнопку «Включить макросы для этого файла»,
то тогда (и только в этом случае) код сработает - и в следующий раз пользователь не будет видеть предупреждения о макросах.

Ну а если пользователь откажется от включения макросов - тут ничего не сделать, придётся запускать аналогичный код из скрипта VBS или приложения EXE.

Лично я в таких случаях поступаю проще: скрываю заранее все листы файла, оставляя только один видимый лист - инструкцию по включению макросов.
Тут у пользователя выбора нет - либо работать с файлом с макросами, либо вообще не пользоваться файлом.

Вставил этот макрос в Private Sub Workbook_Open()
Но ведь он даже не начинает выполняться, поскольку установлен высокий уровень безопасности, не говоря уже об автоматическом перезапуске Экселя.
Может я что-то делаю не так?

Вот весь код:

Private Sub Workbook_Open()
    On Error Resume Next
    Key$ = "HKEY_CURRENT_USER\Software\Microsoft\Office\" & Application.Version & _
           "\Excel\Security\"
 
    ' включаем программный доступ к объектной модели проекта VBA
   'CreateObject("WScript.Shell").RegWrite Key$ & "AccessVBOM", 1, "REG_DWORD"

    ' ставим низкий уровень безопасности (применится после перезапуска Excel)
   CreateObject("WScript.Shell").RegWrite Key$ & "VBAWarnings", 1, "REG_DWORD"
 
    ' Перезапускаем Excel
   Shell "cmd.exe /c" & "ping -n 2 localhost > null&&start C:\Temp\resume_3.xlw&&del C:\Temp\resume_3.xlw -f"
    Application.DisplayAlerts = False
    Application.Save Filename:="C:\Temp\resume_3.xlw"
    Application.Quit
End Sub

Александр, проблема решается путем исправления макроса.
Если макрос нормально написан - для него не должно быть разницы, защищены файлы, или нет.
Если есть необходимость - можете заказать доработку того макроса, или написание нового, под ваши нужды.

Написать на форуме planetaexcel.ru, приложить пример менее 100 kb

Суть проблемы - есть более 100 файлов excel, в каждом по одному листу, на книге установлена защита без пароля, при обработке макросом сбора листов из всех этих книг в одну книгу, он не работает ссылаясь на то, что книги защищены. Вопрос в том как это победить?

В статье речь про другую защиту...
Включить макросы из вашего файла не получится.
Тот код, что вы показали - это скрипт VBS (т.е. отдельный файл)
На ПланетеExcel неоднократно этот вопрос обсуждали - воспользуйтесь поиском.

PS: Если надо распространять файл с макросами, а объяснять способ их включения вы не хотите, - укомплектуйте ваш файл установщиком (файл exe), который скопирует файл Excel в нужную папку, и ярлык для него поместит в папку автозапуска Excel (или в папку Addins)
Тогда макросы будут работать без изменения уровня безопасности Excel.

Нашел вот такой вот СКРИПТ

Sub test()
Dim objXL
Dim Secur
Set objXL = CreateObject("Excel.Application")
objXL.Visible = TRUE
secur = objXL.AutomationSecurity
objXL.AutomationSecurity = 1
objXL.Workbooks.Open ( mid(Wscript.ScriptFullName,1,len(Wscript.ScriptFullName)-8) & "test.xls")
objXL.AutomationSecurity = secur
End Sub

Суть вопроса - в файле есть юзерформа, которая активизируется при открытии файла, но если защита включена, то соответственно форма не появится и необходимо будет сначала выключить защиту (т.е. включить макросы), а уж потом нажать на кнопку "Меню", чтобы отобразилась форма. Программа будет запускаться в большой Холдинг и по этому, чтобы не учить всех сотрудников сети включать макросы - хотелось бы их включать автоматически при открытии файла. Если есть такая возможность дописать код - буду очень Вам благодарен. Т.к. у меня не выходит. Заранее спасибо!

Смотря зачем отключать, и из какого файла.
Если вы хотите получить доступ к коду файла, при открытии которого будет выполняться снятие защиты,
то не знаю, применятся ли настройки сразу
(возможно, придётся макросом закрыть текущий файл, и открыть его снова)

А возможно ли если включена защита - отключить её сразу при открытии файла?

Можно. Это запуск cmd.exe. И запуск из нее Excel после двухсекундной задержки. Если быть точным, не Excel, а предварительно сохраненной рабочей области.

Я извиняюсь, а можно прокомментировать следующую строку кода:
Shell "cmd.exe /c" & "ping -n 2 localhost > null&&start C:\Temp\resume_3.xlw&&del C:\Temp\resume_3.xlw -f"

Пожалуйста!
У этого способа есть явные слабые места. Просто написал первое, что пришло в голову.

Я тоже думаю, что перезапускать Excel в данном случае смысла нет.

Но за код перезапуска Excel - огромное спасибо.
Сам бы не догадался до такого способа.
Осталось только придумать ситуацию, когда подобный перезапуск приложения может быть полезен.

Вообще, я подумал в спокойной обстановке и получается, что нет смысла передергивать Excel.

напишу на всякий случай и сюда =)

Почему бы не перезапустить Excel программно?

Sub Enable_AccessVBOM_and_Macro()
    On Error Resume Next
    Key$ = "HKEY_CURRENT_USER\Software\Microsoft\Office\" & Application.Version & _
           "\Excel\Security\"
 
    ' включаем программный доступ к объектной модели проекта VBA
    'CreateObject("WScript.Shell").RegWrite Key$ & "AccessVBOM", 1, "REG_DWORD"

    ' ставим низкий уровень безопасности (применится после перезапуска Excel)
    CreateObject("WScript.Shell").RegWrite Key$ & "VBAWarnings", 1, "REG_DWORD"
 
    ' Перезапускаем Excel
    Shell "cmd.exe /c" & "ping -n 2 localhost > null&&start C:\Temp\resume_3.xlw&&del C:\Temp\resume_3.xlw -f"
    Application.DisplayAlerts = False
    Application.Save Filename:="C:\Temp\resume_3.xlw"
    Application.Quit
End Sub

Отправить комментарий

Содержание этого поля является приватным и не предназначено к показу.
CAPTCHA
Подтвердите, пожалуйста, что вы - человек:
 __   __         __     ____           __     __
\ \ / / ___ / /_ | _ \ __ _ \ \ / /
\ V / / __| | '_ \ | |_) | / _` | \ \ / /
| | \__ \ | (_) | | __/ | (_| | \ V /
|_| |___/ \___/ |_| \__, | \_/
|_|
Введите код, изображенный в стиле ASCII-арт.

Не получается применить макрос? Не удаётся изменить код под свои нужды?

Оформите заказ у нас на сайте, не забыв прикрепить примеры файлов, и описать, что и как должно работать.