Excel VBA关闭工作簿并触发新宏
我已经修补了好几个小时了,我想不出来。我有一个主工作簿,可以启动其他启用宏的模板(生成并保存输出),然后将输出附加到电子邮件。(我无法将它们全部合并到一个工作簿中,因为选项卡、宏和大小的数量将变得过于繁琐)。由于我正在处理的某些事情的机密性,我无法共享我的确切代码-但我已经删减/替换了值,并提供了我在下面尝试过的代码的“示例” 我面临的问题是如何实现以下目标:Excel VBA关闭工作簿并触发新宏,excel,vba,Excel,Vba,我已经修补了好几个小时了,我想不出来。我有一个主工作簿,可以启动其他启用宏的模板(生成并保存输出),然后将输出附加到电子邮件。(我无法将它们全部合并到一个工作簿中,因为选项卡、宏和大小的数量将变得过于繁琐)。由于我正在处理的某些事情的机密性,我无法共享我的确切代码-但我已经删减/替换了值,并提供了我在下面尝试过的代码的“示例” 我面临的问题是如何实现以下目标: MainWB打开SubWB1并调用(Application.Run)宏 SubWB1中的宏生成并保存excel输出文件 SubWB1关闭
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关闭后继续执行任何操作。因此,我相信罪魁祸首就在这个宏的某个地方。再次感谢彼得-我首先尝试了这个,并且多次尝试了,但都没有成功(我还有其他以相同格式运行的书籍)。我将不得不把这归咎于一个奇怪的小故障或恶意隐藏的代码行-因为我在主工作簿和子工作簿中逐行重新编写了宏(但没有删除或添加任何代码行…),现在它运行得非常好。。。。但它是有效的,这才是真正重要的——感谢您的快速回复,并帮助我回到原点,找到答案!