Используйте VBA, чтобы открыть несколько файлов, которые запускают VBA при открытии в то же время - PullRequest
0 голосов
/ 27 марта 2019

У меня есть один файл Excel, который открывает другие файлы Excel с помощью VBA.Все эти другие файлы Excel запускают код при открытом - в настоящее время, когда основной файл открывает файл, он ожидает запуска кода при открытом в только что открытом файле и затем открывает следующий файл.Я хотел бы, чтобы он просто открыл файлы, а затем перешел к открытию следующего файла, не дожидаясь завершения открытого кода - (я планирую ограничить количество файлов, которые он открывает за один раз, используя идентификаторы процессов) - какие-либо советы?

1 Ответ

0 голосов
/ 28 марта 2019

Сначала вы отключаете запуск макросов, открываете книги по мере необходимости, а затем снова запускаете запуск макросов. (как предлагается здесь: Получение файла .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. ; -)

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...