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

问题描述:

我试图从Excel文件以外运行Excel宏。我目前使用从命令行运行的“.vbs”文件,但它一直告诉我无法找到宏。下面是我尝试使用从外部Excel使用VBScript从命令行运行Excel宏

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.

+1

你有没有尝试删除 “宏”。和/或括号,只是把它叫做这个objExcel.Application.Run“TestMacro”? – deusxmach1na 2012-04-19 16:10:40

+0

objExcel.Application.Run“test.xls!Macro.TestMacro” – 2012-04-19 16:15:55

+0

这两个都不工作:( – muttley91 2012-04-19 16:19:58

好吧,它其实很简单。假设你的宏模块中,而不是在片之一,你可以使用:

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

+0

我没有意识到它必须在一个模块中,我已经在工作簿中了(我也可以已经尝试过第二部分,如果我把它放在其中一张纸上)。谢谢! – muttley91 2012-04-19 16:53:43

我认为你正在尝试这样做? (久经考验

此代码将打开文件TEST.XLS并运行,这将反过来写文本文件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 

如果你想运行宏宏TestMacro从您的个人工作簿可能无法使用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并从那里运行宏对所有其他工作簿。只是想我应该在这里张贴,以防万一有人跑过这个像我一样,但无法弄清楚为什么宏仍然没有运行。

我试着去适应@ 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 - 批处理命令是有限的,(据我所知)它不能调用宏的事实。

我第一次写一个宏来启动我的用户窗体,而隐藏应用程序:

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 

无论如何,感谢您的帮助,我也希望如果有人需要它

+0

你最终找到了一个解决方案真是太好了,但是你应该知道你的第一个答案不是答案,而是一个问题。将来,请将问题发布为问题,而不是回答。你可能想[再次通过网站介绍](http://stackoverflow.com/tour)。 – Charles 2014-01-06 00:14:34

喜用这个主题,以获得这将帮助解决方案,那么我想分享我所做的,以防万一有人可以使用它。

我想什么来调用改变一些细胞并清除某些行的宏,但我需要为超过1500款车型(大约花了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 

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

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

谢谢!何时需要“导入加载项”部分? – DAE 2017-11-09 08:14:24

由于我的相关问题在我整天搜索如何击败“未发现或禁用的宏”错误后被一个正义的手去除,在这里发布了唯一适用于我的语法(application.run didn' T,不管我试过)

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的