2016-04-30 166 views
0

例如像这样在一个新的实例,打开工作簿,然后启动宏:Excel的VBA:能否程序中运行工作簿中的一个宏在另一个Excel实例

壳牌(EXCEL.EXE workbook.xlsm!宏1)

或者,如果工作簿已经然后打开:

壳牌(xlObject宏1)

最重要的事情就是用壳牌,以便允许代码分别继续,而在宏运行。如果不可能,那么也许我可以将Shell(file.bat)转换为一个批处理文件,它将执行相同的操作。批处理文件的样子是什么?

谢谢。

+0

为什么您只是不打算在工作簿中使用“Open”事件来打开?做你在做什么的好处是什么? – 2016-04-30 07:06:40

+0

每个'Shell'或'Open'都会创建一个新的Windows会话ID。您应该一次创建一个会话,并在创建另一个'Shell'或'Open'之前将其关闭。 Excel会话能否在另一个Excel会话中运行?没有。 – Sparky256

回答

0

您不能从命令行(包括Shell)在宿主应用程序内执行VBA代码。 有两个备选方案,但(与Excel的#1为当前打开的文件和Excel的#2作为一个要运行的代码):

  1. 将要运行的代码在Excel#2工作簿的Workbook_Open事件处理程序中,因此它会在您每次打开该文件时执行 - 独立的它如何被打开。
  2. 让Excel#1在VBA中创建一个新的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的应用程序对象的生存期。

+0

是的,这是答案!谢谢。使用option1,workbook_open事件是好的,但它不允许运行我想要选择的任何宏的灵活性。但是选项2,使用ontime独立地从第二个Excel实例中重新调用宏将完成我所需要的。再次感谢。 – Cameron

相关问题