如何从命令行启动Excel宏(不使用Worksheet_Open事件)?

11

如何从命令行启动Excel宏?

我不想使用Worksheet_Open事件,只是打开Excel文件。

我需要启动Excel工作簿中的特定宏。


3
我建议您使用 [tag:vbs] 代替。您可以通过脚本自动化 Excel。 - brettdj
我同意brettdj的观点。使用vbs。如果你想从命令行运行,那么你必须编写一个批处理文件并使用“Worksheet_Open”事件。 - Siddharth Rout
能否使用 VBS 制作类似批处理文件的东西?我从未使用过它,你能否给我一个示例来启动 MyExcelFile.xlsm 中的 MyMacro - Mehdi
希望这可以帮到你?https://dev59.com/fHI-5IYBdhLWcg3wBjhR - Siddharth Rout
1
请参见此示例 https://dev59.com/qmPVa4cB1Zd3GeqP76x8 - Siddharth Rout
显示剩余2条评论
4个回答

14

使用Windows PowerShell,它具有出色的COM互操作支持。

我有一个名为“Test”的宏的工作簿c:\TestBeep.xlsm。这是我的记录:

PS C:\> $app = New-Object -comobject Excel.Application
PS C:\> $wb = $app.Workbooks.Open("c:\TestBeep.xlsm")
PS C:\> $wb.Name
TestBeep.xlsm
PS C:\> $app.Run("Test")
PS C:\> $app.Quit()

可以选择加入$app.Visible = $True使窗口可见。


谢谢,但我不确定用户是否安装了PowerShell...最终我使用了VB脚本,并从命令行启动它。 - Mehdi

10

我最终创建了一个VB脚本,并从命令行启动它:

Option Explicit

    LaunchMacro

    Sub LaunchMacro() 
      Dim xl
      Dim xlBook      
      Dim sCurPath

      sCurPath = CreateObject("Scripting.FileSystemObject").GetAbsolutePathName(".")
      Set xl = CreateObject("Excel.application")
      Set xlBook = xl.Workbooks.Open(sCurPath & "\MyWorkBook.xlsm", 0, True)        
      xl.Application.Visible = True
      xl.Application.run "MyWorkBook.xlsm!MyModule.MyMacro"
      xl.DisplayAlerts = False      
      xlBook.saved = True
      xl.activewindow.close
      xl.Quit

      Set xlBook = Nothing
      Set xl = Nothing

    End Sub 

请注意,尽管您可以设置Saved属性,但它并不保存文件。请改用Save方法来保存文件。 - Rachel Hettinger
谢谢!Mehdi的答案对我也有用,只需要做出一点调整。xl.Application.Visible = True这行代码会留下一个僵尸/幽灵EXCEL.EXE进程占用内存(通过Windows任务管理器发现)。改为使用xl.Application.Visible = False似乎可以消除这个僵尸进程。 - Eats
你想到如何将其推广到任何代码了吗? - Lime
不,@Lime 我没有。 - Mehdi

0

AutoIt 还提供了出色的 COM 支持,并具有许多内置的控制 Excel 的功能。您可以将脚本编译为 .EXE 文件,然后从命令行运行它。


0
如果您更喜欢使用C#编码,请使用此模板。
void Main()
{
    var oExcelApp = (Microsoft.Office.Interop.Excel.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application");
    try{
        //oExcelApp.Visible = true;
        var WB = oExcelApp.ActiveWorkbook;
        var WS = (Worksheet)WB.ActiveSheet;
        ((string)((Range)WS.Cells[1,1]).Value).Dump("Cell Value");
        oExcelApp.Run("test").Dump("macro");
    }
    finally{
        if(oExcelApp != null)
            System.Runtime.InteropServices.Marshal.ReleaseComObject(oExcelApp);
        oExcelApp = null;
   }
}

很遗憾无法使用C#!唯一可能的选择是Shell脚本...不过还是谢谢您!但我不能测试您的解决方案... - Mehdi
没问题,我看到这个问题很旧了。我正在寻找这个功能,并且我想为其他可能在未来发现它有用的人提供一种在C#中实现它的方法。 - t3dodson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接