Excel VBA Закрыть книгу и запустить новый макрос - PullRequest
2 голосов
/ 25 марта 2020

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

Проблема, с которой я столкнулся при попытке выполнить sh следующее:

  1. MainWB открывает SubWB1 и вызывает (Application.Run) макрос
  2. Макрос в SubWB1 создает и сохраняет выходной файл Excel
  3. SubWB1 закрывается, и MainWB продолжает работу со следующим отчетом

Моя проблема заключается в том, что после закрытия SubWB1 макросы в остановке MainWB работает ... Я пробовал:

1. Попробуйте 1: Вызов макроса SubWB1 в середине макроса MainWB с продолжением шагов после:

    Sub AfternoonReport () 'macro in MainWB
        'do stuff
        Workbooks.Open FileName:="C:\Users\me\Documents\DailyReport\submacro1.xlsm"
        Application.Run "'submacro1.xslm'!triggerFromMain" 'macro ends with .close, save changes false
      '************STOPS HERE***********
        Application.Wait Now + TimeValue("00:00:03")
        generateEmail 'macro within MainWB
    End Sub

2. Попробуйте 2: Вызов продолжения sub в MainWB в конце макроса в subWB:

    Sub AfternoonReport () 'macro in MainWB
        'do stuff
        Workbooks.Open FileName:="C:\Users\me\Documents\DailyReport\submacro1.xlsm"
        Application.Run "'submacro1.xslm'!triggerFromMain"
    End Sub

    Sub triggerFromMain () 'macro in subWB
        'do stuff
        Application.Run "'mainWB.xslm'!continueFromSub1"
    End Sub

    Sub continueFromSub1 () 'macro in MainWB
        'do stuff
        Workbooks("submacro1.xlsm").Close SaveChanges:=False
      '************STOPS HERE***********
        Application.Wait Now + TimeValue("00:00:03")
        generateEmail 'macro within MainWB
    End Sub

3. Попробуйте 3: тот же пример, что и выше, но назначение subWB для объекта рабочей книги publi c в mainWB:

    'Declarations in mainWB
    Public subWBobj As Workbook

    Sub AfternoonReport () 'macro in MainWB
        'do stuff
        Set subWBobj = Workbooks.Open FileName:="C:\Users\me\Documents\DailyReport\submacro1.xlsm"
        Application.Run "'submacro1.xslm'!triggerFromMain"
    End Sub

    Sub triggerFromMain () 'macro in subWB
        'do stuff
        Application.Run "'mainWB.xslm'!continueFromSub1"
    End Sub

    Sub continueFromSub1 () 'macro in MainWB
        'do stuff
        subWBobj.Close SaveChanges:=False
      '************STOPS HERE***********
        Application.Wait Now + TimeValue("00:00:03")
        generateEmail 'macro within MainWB
    End Sub

4. Попробуйте 4: Вызов макроса продолжения из события BeforeClose в subWB

    Sub AfternoonReport () 'macro in MainWB
        'do stuff
        Workbooks.Open FileName:="C:\Users\me\Documents\DailyReport\submacro1.xlsm"
        Application.Run "'submacro1.xslm'!triggerFromMain"
    End Sub

    Sub triggerFromMain () 'macro in subWB
        'do stuff
        ThisWorkbook.Close SaveChanges:=False
    End Sub

    Sub Workbook_BeforeClose () 'macro in subWB
        Application.Run "'mainWB.xslm'!continueFromSub1"
      '********Doesnt allow the workbook to close and just fires macros in the mainWB - causing other issues*******
    End Sub

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

Любые предложения будут с благодарностью! Я перепробовал все, что только мог придумать, и я так долго смотрю на одни и те же строки кода! :)

1 Ответ

1 голос
/ 25 марта 2020

Часть, которая останавливает ваш макрос - это оператор .Close в subWB. Удалите эту строку из subWB и закройте эту книгу из основного:

Option Explicit

Sub AfternoonReport()
    Dim msg As String
    msg = "Macro executed at " & Format(Now(), "dd-mmm-yyyy hh:mm")
    Debug.Print "from mainWB: " & msg

    Dim otherWB As Workbook
    Set otherWB = Workbooks.Open(Filename:="C:\Temp\submacro1.xlsm")
    Application.Run "'submacro1.xlsm'!triggerFromMain" 'macro ends with .close, save changes false

    Debug.Print "back from the sub macro and we're done."

    otherWB.Close SaveChanges:=False
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...