首页 文章

从命令行使用VBScript从Excel外部运行Excel宏

提问于
浏览
27

我正在尝试从Excel文件外部运行Excel宏 . 我目前正在使用从命令行运行的“.vbs”文件,但它一直告诉我无法找到宏 . 这是我正在尝试使用的脚本

Set objExcel = CreateObject("Excel.Application")
Set objWorkbook = objExcel.Workbooks.Open("test.xls")

objExcel.Application.Visible = True
objExcel.Workbooks.Add
objExcel.Cells(1, 1).Value = "Test value"

objExcel.Application.Run "Macro.TestMacro()"
objExcel.ActiveWorkbook.Close


objExcel.Application.Quit
WScript.Echo "Finished."
WScript.Quit

这是我正在尝试访问的宏:

Sub TestMacro()
'first set a string which contains the path to the file you want to create.
'this example creates one and stores it in the root directory
MyFile = "C:\Users\username\Desktop\" & "TestResult.txt"
'set and open file for output
fnum = FreeFile()
Open MyFile For Output As fnum
'write project info and then a blank line. Note the comma is required
Write #fnum, "I wrote this"
Write #fnum,
'use Print when you want the string without quotation marks
Print #fnum, "I printed this"
Close #fnum
End Sub

我尝试了位于Is it possible to run a macro in Excel from external command?的解决方案来实现这一点(并且当然已经修改)但是它找不到't seem to work. I keep getting the error `Microsoft Office Excel: The macro ' Macro.TestMacro' .

编辑:Excel 2003 .

7 回答

  • 21

    好的,它实际上很简单 . 假设您的宏位于模块中,而不是在其中一个工作表中,则使用:

    objExcel.Application.Run "test.xls!dog" 
      'notice the format of 'workbook name'!macro
    

    对于带空格的文件名,请用引号括住文件名 .

    如果你把宏放在一张纸下,比如说sheet1,那么假设sheet1拥有它所具有的功能 .

    objExcel.Application.Run "'test 2.xls'!sheet1.dog"
    

    注意:您不需要您一直使用的macro.testfunction表示法 .

  • 2

    我想你是想这么做的? ( TRIED AND TESTED

    此代码将打开文件Test.xls并运行宏 TestMacro ,它将依次写入文本文件 TestResult.txt

    Option Explicit
    
    Dim xlApp, xlBook
    
    Set xlApp = CreateObject("Excel.Application")
    '~~> Change Path here
    Set xlBook = xlApp.Workbooks.Open("C:\Test.xls", 0, True)
    xlApp.Run "TestMacro"
    xlBook.Close
    xlApp.Quit
    
    Set xlBook = Nothing
    Set xlApp = Nothing
    
    WScript.Echo "Finished."
    WScript.Quit
    
  • 4

    我试图将@ Siddhart的代码改编为运行我的 open_form 宏的相对路径,但它似乎没有用 . 这是我的第一次尝试 . 我的工作解决方案如下 .

    Option Explicit
    
    Dim xlApp, xlBook
    dim fso
    dim curDir
    set fso = CreateObject("Scripting.FileSystemObject")
    curDir = fso.GetAbsolutePathName(".")
    set fso = nothing
    
    Set xlApp = CreateObject("Excel.Application")
    '~~> Change Path here
    Set xlBook = xlApp.Workbooks.Open(curDir & "Excels\CLIENTES.xlsb", 0, true)
    xlApp.Run "open_form"
    xlBook.Close
    xlApp.Quit
    
    Set xlBook = Nothing
    Set xlApp = Nothing
    
    WScript.Echo "Finished."
    

    EDIT

    我实际上已经解决了这个问题,以防万一有人想要运行一个“相似”的用户表单:一个独立的应用程序:

    我面临的问题:

    1 - 我不想使用Workbook_Open事件,因为excel被锁定为只读 . 2 - 批处理命令受限于(据我所知)它无法调用宏的事实 .

    我首先写了一个宏来启动我的userform同时隐藏应用程序:

    Sub open_form()
     Application.Visible = False
     frmAddClient.Show vbModeless
    End Sub
    

    然后我创建了一个vbs来启动这个宏(用相对路径做这件事很棘手):

    dim fso
    dim curDir
    dim WinScriptHost
    set fso = CreateObject("Scripting.FileSystemObject")
    curDir = fso.GetAbsolutePathName(".")
    set fso = nothing
    
    Set xlObj = CreateObject("Excel.application")
    xlObj.Workbooks.Open curDir & "\Excels\CLIENTES.xlsb"
    xlObj.Run "open_form"
    

    我终于做了一个批处理文件来执行VBS ......

    @echo off
    pushd %~dp0
    cscript Add_Client.vbs
    

    请注意,我还在_1061082中包含了"Set back to visible":

    Private Sub cmdClose_Click()
    Unload Me
    End Sub
    
    Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
        ThisWorkbook.Close SaveChanges:=True
        Application.Visible = True
        Application.Quit
    End Sub
    

    无论如何,感谢您的帮助,我希望如果有人需要,这将有所帮助

  • 0

    我尝试了上面的方法,但我得到了“无法找到宏”错误 . 这是有效的最终代码!

    Option Explicit
    
    Dim xlApp, xlBook
    
    Set xlApp = CreateObject("Excel.Application")
    xlApp.Visible = True
    
      ' Import Add-Ins
    xlApp.Workbooks.Open "C:\<pathOfXlaFile>\MyMacro.xla"
    xlApp.AddIns("MyMacro").Installed = True
    
    '
    Open Excel workbook
    Set xlBook = xlApp.Workbooks.Open("<pathOfXlsFile>\MyExcel.xls", 0, True)
    
    ' Run Macro
    xlApp.Run "Sheet1.MyMacro"
    
    xlBook.Close
    xlApp.Quit
    
    Set xlBook = Nothing
    Set xlApp = Nothing
    
    WScript.Quit
    

    在我的情况下,MyMacro碰巧在Sheet1下,因此Sheet1.MyMacro .

  • 0

    在我杀了一整天后,我的相关问题被一个正义的手移除,搜索如何击败“未找到或未发现的宏”错误,在这里发布唯一适用于我的语法(application.run没有,无论如何我试过的)

    Set objExcel = CreateObject("Excel.Application")
    
    ' Didn't run this way from the Modules
    'objExcel.Application.Run "c:\app\Book1.xlsm!Sub1"
    ' Didn't run this way either from the Sheet
    'objExcel.Application.Run "c:\app\Book1.xlsm!Sheet1.Sub1"
    ' Nor did it run from a named Sheet
    'objExcel.Application.Run "c:\app\Book1.xlsm!Named_Sheet.Sub1"
    
    ' Only ran like this (from the Module1)
    
    Set objWorkbook = objExcel.Workbooks.Open("c:\app\Book1.xlsm")
    objExcel.Run "Sub1"
    

    Excel 2010,Win 7

  • 27

    如果您尝试从个人工作簿运行宏,它可能无法正常工作,因为使用VBScript打开Excel文件不会自动打开您的PERSONAL.XLSB . 你需要做这样的事情:

    Dim oFSO
    Dim oShell, oExcel, oFile, oSheet
    Set oFSO = CreateObject("Scripting.FileSystemObject")
    Set oShell = CreateObject("WScript.Shell")
    Set oExcel = CreateObject("Excel.Application")
    Set wb2 = oExcel.Workbooks.Open("C:\..\PERSONAL.XLSB") 'Specify foldername here
    
    oExcel.DisplayAlerts = False
    
    
    For Each oFile In oFSO.GetFolder("C:\Location\").Files
        If LCase(oFSO.GetExtensionName(oFile)) = "xlsx" Then
            With oExcel.Workbooks.Open(oFile, 0, True, , , , True, , , , False, , False)
    
    
    
                oExcel.Run wb2.Name & "!modForm"
    
    
                For Each oSheet In .Worksheets
    
    
    
                    oSheet.SaveAs "C:\test\" & oFile.Name & "." & oSheet.Name & ".txt", 6
    
    
                Next
                .Close False, , False
            End With
        End If
    
    
    
    Next
    oExcel.Quit
    oShell.Popup "Conversion complete", 10
    

    因此,在循环开始时,它将打开personals.xlsb并从那里为所有其他工作簿运行宏 . 只是想我应该在这里发布,以防万一有人像我一样跑过这个但是无法弄清楚为什么宏还没有运行 .

  • 2

    您好使用此线程来获得解决方案,然后我想分享我做的以防万一有人可以使用它 .

    我想要的是调用一个宏来改变一些单元格并删除一些行,但我需要超过1500个excels(每个文件大约花费3分钟)

    主要问题: - 当从vbe调用宏时,我遇到了同样的问题,从PERSONAL.XLSB调用宏是不可能的,当脚本操作excel时没有执行personal.xlsb并且在宏窗口中没有任何选项

    我通过加载宏(a.xlsm)保持打开一个excel文件解决了这个问题(在执行脚本之前)

    然后我从脚本选择的excel中调用宏

    Option Explicit
        Dim xl
        Dim counter
    
       counter =10
    
    
    
      Do
    
      counter = counter + 1
    
      Set xl = GetObject(, "Excel.Application")
      xl.Application.Workbooks.open "C:\pruebas\macroxavi\IA_030-08-026" & counter & ".xlsx"
      xl.Application.Visible = True
      xl.Application.run "'a.xlsm'!eraserow" 
      Set xl = Nothing
    
    
      Loop Until counter = 517
    
      WScript.Echo "Finished."
      WScript.Quit
    

相关问题