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

时间:2012-04-19 16:04:43

标签: excel vba command-line vbscript

我正在尝试从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?的解决方案来实现这一目标(当然也进行了修改),但似乎没有用。我一直收到错误`Microsoft Office Excel:无法找到宏'Macro.TestMacro'。

编辑:Excel 2003。

8 个答案:

答案 0 :(得分:31)

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

  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表示法。

答案 1 :(得分:22)

我认为你是想这么做的? (已审判并已经过测试

此代码将打开文件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

答案 2 :(得分: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."

修改

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

我面临的问题:

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

请注意,我还在Userform_QueryClose

中添加了“设置回可见”
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

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

答案 3 :(得分:3)

因为在我杀了一整天之后,我的相关问题被一个正义的手移除了,寻找如何击败没有找到或禁用的宏观#34;错误,在这里发布唯一适合我的语法(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

答案 4 :(得分:2)

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

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。

答案 5 :(得分:0)

如果您尝试从个人工作簿运行宏,则可能无效,因为打开带有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并从那里为所有其他工作簿运行宏。只是觉得我应该在这里发帖,以防万一有人像我一样遇到这个但是无法弄清楚为什么宏还没有运行。

答案 6 :(得分:0)

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

我想要的是调用一个宏来更改一些单元格并删除一些行,但我需要超过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

答案 7 :(得分:0)

我通常将宏与工作簿分开存储在xlam加载项中,因此我想打开工作簿,然后运行单独存储的宏。

因为这需要VBS脚本,所以我想使其成为“可移植的”,以便可以通过传递参数来使用它。这是最终的脚本,它包含3个参数。

  • 工作簿的完整路径
  • 宏观名称
  • [OPTIONAL]使用宏分隔工作簿的路径

我像这样测试它:

"C:\Temp\runmacro.vbs" "C:\Temp\Book1.xlam" "Hello"

"C:\Temp\runmacro.vbs" "C:\Temp\Book1.xlsx" "Hello" "%AppData%\Microsoft\Excel\XLSTART\Book1.xlam"

runmacro.vbs:

Set args = Wscript.Arguments

ws = WScript.Arguments.Item(0)
macro = WScript.Arguments.Item(1)
If wscript.arguments.count > 2 Then
 macrowb= WScript.Arguments.Item(2)
End If

LaunchMacro

Sub LaunchMacro() 
  Dim xl
  Dim xlBook  

  Set xl = CreateObject("Excel.application")
  Set xlBook = xl.Workbooks.Open(ws, 0, True)
  If wscript.arguments.count > 2 Then
   Set macrowb= xl.Workbooks.Open(macrowb, 0, True)
  End If
  'xl.Application.Visible = True ' Show Excel Window
  xl.Application.run macro
  'xl.DisplayAlerts = False  ' suppress prompts and alert messages while a macro is running
  'xlBook.saved = True ' suppresses the Save Changes prompt when you close a workbook
  'xl.activewindow.close
  xl.Quit

End Sub