2012-04-19 196 views
23

我試圖從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

回答

22

好吧,它其實很簡單。假設你的宏模塊中,而不是在片之一,你可以使用:

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

20

我認爲你正在嘗試這樣做? (久經考驗

此代碼將打開文件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 
0

如果你想運行宏宏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並從那裏運行宏對所有其他工作簿。只是想我應該在這裏張貼,以防萬一有人跑過這個像我一樣,但無法弄清楚爲什麼宏仍然沒有運行。

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 - 批處理命令是有限的,(據我所知)它不能調用宏的事實。

我第一次寫一個宏來啓動我的用戶窗體,而隱藏應用程序:

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

0

喜用這個主題,以獲得這將幫助解決方案,那麼我想分享我所做的,以防萬一有人可以使用它。

我想什麼來調用改變一些細胞並清除某些行的宏,但我需要爲超過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 
2

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

1

由於我的相關問題在我整天搜索如何擊敗「未發現或禁用的宏」錯誤後被一個正義的手去除,在這裏發佈了唯一適用於我的語法(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的