Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel VBA关闭工作簿并触发新宏_Excel_Vba - Fatal编程技术网

Excel VBA关闭工作簿并触发新宏

Excel VBA关闭工作簿并触发新宏,excel,vba,Excel,Vba,我已经修补了好几个小时了,我想不出来。我有一个主工作簿,可以启动其他启用宏的模板(生成并保存输出),然后将输出附加到电子邮件。(我无法将它们全部合并到一个工作簿中,因为选项卡、宏和大小的数量将变得过于繁琐)。由于我正在处理的某些事情的机密性,我无法共享我的确切代码-但我已经删减/替换了值,并提供了我在下面尝试过的代码的“示例” 我面临的问题是如何实现以下目标: MainWB打开SubWB1并调用(Application.Run)宏 SubWB1中的宏生成并保存excel输出文件 SubWB1关闭

我已经修补了好几个小时了,我想不出来。我有一个主工作簿,可以启动其他启用宏的模板(生成并保存输出),然后将输出附加到电子邮件。(我无法将它们全部合并到一个工作簿中,因为选项卡、宏和大小的数量将变得过于繁琐)。由于我正在处理的某些事情的机密性,我无法共享我的确切代码-但我已经删减/替换了值,并提供了我在下面尝试过的代码的“示例”

我面临的问题是如何实现以下目标:

  • MainWB打开SubWB1并调用(Application.Run)宏
  • SubWB1中的宏生成并保存excel输出文件
  • SubWB1关闭,MainWB继续下一个报告
  • 我的问题是,一旦我关闭SubWB1,MainWB中的宏就会停止运行。。。我试过:

    1。尝试1:在MIWWB宏的中间调用子WBB1宏,并在后续步骤之后:>/P>
        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
    
        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
    
        '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
    
    2。尝试2:在子WB中宏的末尾调用主WB中的延续子WB:

        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
    
        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
    
        '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
    
    3。尝试3:与上面的示例相同,但将子WB分配给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
    
        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
    
        '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:从子WB中的BeforeClose事件调用continuation宏

        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之外,我没有收到任何错误-因此代码没有中断,它只是在“.Close”函数的MainWB中退出宏,因此不会继续执行任何其他代码


    如有任何建议,将不胜感激!我已经尝试了我能想到的一切,我只能盯着同一行代码看这么长时间

    停止宏的部分是子WB中的
    .Close
    语句。从子WB中删除该行并从主窗口关闭该工作簿:

    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
    

    谢谢PeterT,但是subWB中唯一有
    .Close
    语句的实例是example#4,在那里我正在测试是否可以在关闭之前从
    工作簿调用mainWB宏。我尝试过从主工作簿(示例3)关闭子工作簿,与您的建议类似,但一旦该行代码运行:
    subWBobj.Close SaveChanges:=False
    mainWB停止执行任何其他代码,这就是我遇到的问题。在子WB关闭后,我需要继续执行mainWB中的代码。然后可能是子WB中的宏正在执行的某个操作停止了代码的运行。我的示例中的代码将在子WB关闭后继续执行任何操作。因此,我相信罪魁祸首就在这个宏的某个地方。再次感谢彼得-我首先尝试了这个,并且多次尝试了,但都没有成功(我还有其他以相同格式运行的书籍)。我将不得不把这归咎于一个奇怪的小故障或恶意隐藏的代码行-因为我在主工作簿和子工作簿中逐行重新编写了宏(但没有删除或添加任何代码行…),现在它运行得非常好。。。。但它是有效的,这才是真正重要的——感谢您的快速回复,并帮助我回到原点,找到答案!