例如像这样在一个新的实例,打开工作簿,然后启动宏:Excel的VBA:能否程序中运行工作簿中的一个宏在另一个Excel实例
壳牌(EXCEL.EXE workbook.xlsm!宏1)
或者,如果工作簿已经然后打开:
壳牌(xlObject宏1)
最重要的事情就是用壳牌,以便允许代码分别继续,而在宏运行。如果不可能,那么也许我可以将Shell(file.bat)转换为一个批处理文件,它将执行相同的操作。批处理文件的样子是什么?
谢谢。
例如像这样在一个新的实例,打开工作簿,然后启动宏:Excel的VBA:能否程序中运行工作簿中的一个宏在另一个Excel实例
壳牌(EXCEL.EXE workbook.xlsm!宏1)
或者,如果工作簿已经然后打开:
壳牌(xlObject宏1)
最重要的事情就是用壳牌,以便允许代码分别继续,而在宏运行。如果不可能,那么也许我可以将Shell(file.bat)转换为一个批处理文件,它将执行相同的操作。批处理文件的样子是什么?
谢谢。
您不能从命令行(包括Shell)在宿主应用程序内执行VBA代码。 有两个备选方案,但(与Excel的#1为当前打开的文件和Excel的#2作为一个要运行的代码):
Workbook_Open
事件处理程序中,因此它会在您每次打开该文件时执行 - 独立的它如何被打开。Excel.Application
对象并在该应用程序中打开Excel#2。您现在可以在Excel#2的应用程序对象上调用Run()
方法来从Excel#2执行代码,但是这将与Excel#1的代码同步完成。尽管可以使用Excel#2应用程序的OnTime()
方法来延迟执行宏,在这种情况下,Excel#2的应用程序将在延迟过去并且代码在Excel#2的应用程序中异步运行时调用代码。选项2示例代码看起来是这样的:
Public Function RemoteRun(ByVal strFile As String) As Application
Dim app As Application
Dim wb As Workbook
Set app = New Application
Set wb = app.Workbooks.Open(strFile)
app.OnTime Now + 1/24/60/60, "RemoteMacro"
Set RemoteRun = app
End Function
确保存储返回值(在Excel的#2的应用对象)somehwere,所以它不会自动关闭(它仍然有异步运行RemoteMacro)。将Visible
属性设置为True
也适用,如果您不希望Excel#1的代码管理Excel#2的应用程序对象的生存期。
是的,这是答案!谢谢。使用option1,workbook_open事件是好的,但它不允许运行我想要选择的任何宏的灵活性。但是选项2,使用ontime独立地从第二个Excel实例中重新调用宏将完成我所需要的。再次感谢。 – Cameron
为什么您只是不打算在工作簿中使用“Open”事件来打开?做你在做什么的好处是什么? – 2016-04-30 07:06:40
每个'Shell'或'Open'都会创建一个新的Windows会话ID。您应该一次创建一个会话,并在创建另一个'Shell'或'Open'之前将其关闭。 Excel会话能否在另一个Excel会话中运行?没有。 – Sparky256