Excel VBA:Shell可以在另一个Excel实例的工作簿中运行宏

时间:2016-04-30 06:59:37

标签: excel vba shell

例如,在新实例中打开工作簿然后启动宏:

Shell(Excel.exe workbook.xlsm!macro1)

或者如果工作簿已经打开,那么:

Shell(xlObject macro1)

最重要的是使用Shell以便在宏单独运行时允许代码继续。如果不可能那么也许我可以Shell(file.bat)到一个批处理文件,它会做同样的事情。批处理文件会是什么样的?

谢谢。

1 个答案:

答案 0 :(得分: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的应用程序中异步运行。
  3. 选项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的应用程序对象),因此它不会自动关闭(它仍然必须异步运行RemoteMacro)。如果您不希望Excel#1的代码管理Excel#2的应用程序对象的生命周期,那么将其Visible属性设置为True也会有效。