Сначала вы отключаете запуск макросов, открываете книги по мере необходимости, а затем снова запускаете запуск макросов. (как предлагается здесь: Получение файла .xlsm, чтобы не выполнять код при открытии с VBA )
Private Sub OpenWorkBookMacroDisabled(wbPath As String)
Application.AutomationSecurity = msoAutomationSecurityForceDisable
Workbooks.Open (wbPath)
Application.AutomationSecurity = msoAutomationSecurityByUI
'or
'Application.AutomationSecurity = msoAutomationSecurityLow
End Sub
Но на самом деле это не решает вашу проблему. Чтобы запустить макросы, необходимо повторно открыть рабочие книги, которые затем снова автоматически запустят отдельные макросы.
Обходной путь 1
Возможное решение упоминается здесь: https://www.ozgrid.com/forum/forum/help-forums/excel-general/47477-enabling-macros-without-re-opening-worksheet:
СОЗДАТЬ ВКЛЮЧЕННУЮ / ОТКЛЮЧЕННУЮ КЛЕТКУ ВАЛИДАЦИИ
Единственным обходным решением, если это было проблемой, может быть что-то вроде ячейки проверки на вашей домашней странице / главной странице с надписью «включено» / «отключено».
Затем при открытии рабочей книги всегда включайте макросы, затем при открытии рабочей книги автоматически установите для этого параметра значение отключено.
тогда все макросы будут смотреть на эту ссылку, и если она отключена, она не будет запущена, и вам нужно будет активировать дозвон, чтобы запустить любой макрос.
Может быть не то, что вы хотите, а мысль.
Обходной путь 2
Другой обходной путь может быть:
(1) Откройте рабочие книги с кодом, указанным выше.
(2) Измените Sub Workbook_Open
на Sub Workbook_Open_OLD
программно
(3) Сохранить рабочие книги
(4) Измените AutomationSecurity
до желаемого уровня
(5) снова откройте ваши рабочие книги
Довольно много работы!
Подробнее см .: http://www.cpearson.com/excel/vbe.aspx
Обходной путь 3
Вариант включения / выключения ячейки проверки - использование центрального свойства
например Application.Username
**This Macro calls the 'other excel files':**
Sub Main0()
'TEST 1:
'Open workbook and DON'T run macros
'Call "YourCode" manually
Application.UserName = "NoMacroRun"
Debug.Print "Test 1:"
Debug.Print Application.UserName
Workbooks.Open ThisWorkbook.Path & "\macro_010.xlsb"
Debug.Print "Open finished"
Debug.Print "Call YourCode"
Run "macro_010.xlsb!YourCode"
Workbooks("macro_010.xlsb").Close SaveChanges:=False
Debug.Print "Test 1: FINISHED successfully"
Debug.Print ""
'TEST 2:
'Open workbook and run macros
Application.UserName = "SomeThingElse"
Debug.Print "Test 2:"
Debug.Print Application.UserName
Workbooks.Open ThisWorkbook.Path & "\macro_010.xlsb"
Debug.Print "Test 2: FINISHED successfully"
Debug.Print ""
Workbooks("macro_010.xlsb").Close SaveChanges:=False
Debug.Print ""
End Sub
Другие файлы выглядят так:
В «других файлах» вы отделяете «YourCode» от «Workbook_Open» и делаете его доступным извне:
'doubleclick "ThisWorkbook" in the IDE and insert this code there
Public Sub Workbook_Open()
If Application.UserName <> "NoMacroRun" Then
Debug.Print "---> " & ThisWorkbook.Name & ": Workbook_Open is part of ThisWorkbook in the IDE"
'your code
Call YourCode
End If
End Sub
Этот код вы вставляете в модуль:
'doubleclick "module" in the IDE and insert this code there
'OR click in the menu --> Insert --> Module
Sub YourCode()
Debug.Print "---> " & ThisWorkbook.Name & ": ""Sub YourCode"" is part of a module in the IDE!"
End Sub
И, наконец, Немедленное окно доказывает, что оно работает как положено:
Test 1:
NoMacroRun
Open finished
Call YourCode
---> macro_010.xlsb: "Sub YourCode" is part of a module in the IDE!
Test 1: finished successfully
Test 2:
SomeThingElse
---> macro_010.xlsb: Workbook_Open is part of ThisWorkbook in the IDE
---> macro_010.xlsb: "Sub YourCode" is part of a module in the IDE!
Test 2: finished successfully
Q.E.D. ; -)
