2012-04-19 10 views
23

Próbuję uruchomić makro programu Excel spoza pliku programu Excel. Obecnie używam pliku ".vbs" uruchamianego z wiersza poleceń, ale wciąż mówi mi, że makro nie może zostać znalezione. Oto skrypt Próbuję użyćUruchamianie makra programu Excel z zewnątrz programu Excel za pomocą skryptu VBScript z wiersza polecenia

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 

A oto Makro Próbuję dostępu:

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 

Próbowałem rozwiązania znajdujące się Is it possible to run a macro in Excel from external command? aby zajść tak daleko (i modyfikowane oczywiście), ale wydawało się, że nie działa. Ciągle pojawia się błąd "Microsoft Office Excel: Nie można znaleźć makra" Macro.TestMacro ".

EDIT: Excel 2003.

+1

próbowałeś usuwania "makro". i/lub nawias i po prostu wywołać to tak: objExcel.Application.Run "TestMacro"? – deusxmach1na

+0

objExcel.Application.Run "test.xls! Macro.TestMacro" –

+0

Oba te elementy również nie działają :( – muttley91

Odpowiedz

22

Ok, to rzeczywiście proste. Zakładając, że makro jest w module, a nie w jednym z arkuszy, należy użyć:

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

o nazwę pliku ze spacjami, obudować nazwę pliku z cytatami.

Jeśli umieściłeś makro pod arkuszem, powiedz arkusz1, po prostu przyjmij, że arkusz 1 jest właścicielem funkcji, którą robi.

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

Uwaga: Nie jest wymagana notacja funkcji macro.testfunction, z której korzystasz.

+0

Nie zdawałem sobie sprawy, że to musi być w module, miałem go w zeszycie (mogłem też wypróbowałem drugą część, jeśli zostawiłem ją w jednym z arkuszy). Dzięki! – muttley91

20

Myślę, że próbujesz to zrobić? (SPRAWDZONA)

Ten kod otworzy Test.xls plik i uruchom makro TestMacro który z kolei zapisać do pliku tekstowego 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

Jeśli próbujesz uruchomić makro z osobistego skoroszytu może nie działać, ponieważ otwarcie pliku Excel z VBScript nie powoduje automatycznego otwarcia pliku PERSONAL.XLSB. trzeba będzie zrobić coś takiego:

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 

Więc na początku pętli jest otwarcie personals.xlsb i uruchomieniu makra stamtąd do wszystkich innych skoroszytach. Pomyślałem tylko, że powinienem opublikować tutaj, na wypadek, gdyby ktoś przeszedł to tak jak ja, ale nie mogę zrozumieć, dlaczego makro nadal nie działa.

4

Próbowałem dostosować kod @ Siddharta do ścieżki względnej, aby uruchomić moje makro open_form, ale nie działało. Oto moja pierwsza próba. Moje działające rozwiązanie znajduje się poniżej.

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

I rzeczywiście pracował go, tylko w przypadku, gdy ktoś chce uruchomić userform "alike" samodzielna aplikacja:

Problemy byłem zachodu:

1 - Nie chcę używać zdarzenia Workbook_Open, ponieważ program Excel jest zablokowany tylko do odczytu. 2 - Polecenie wsadowe jest ograniczone tym, że (według mojej wiedzy) nie może wywołać makra.

raz pierwszy napisał makro uruchomić mój userform podczas ukrywania aplikacji:

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

Potem stworzył VBS do uruchomienia tego makra (robi to ze względnym ścieżka została trudne):

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" 

I wreszcie zrobił plik wsadowy do wykonania VBS ...

@echo off 
pushd %~dp0 
cscript Add_Client.vbs 

Należy pamiętać, że Mam również „Ustaw z powrotem widoczne” w moim 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 

W każdym razie, dzięki za pomoc i mam nadzieję, że to pomoże, jeśli ktoś potrzebuje to

+0

To świetnie, że w końcu znalazłeś rozwiązanie, ale powinieneś wiedzieć, że twoja pierwsza wersja tej odpowiedzi nie była odpowiedzią, to było pytanie. W przyszłości zadawaj pytania jako pytania, a nie jako odpowiedzi. Możesz ponownie przejść przez wprowadzenie do witryny (http://stackoverflow.com/tour). – Charles

0

Hi stosować ten wątek, aby uzyskać rozwiązanie, a następnie chciałbym podzielić się tym, co zrobiłem na wypadek, gdyby ktoś mógł z niego skorzystać.

co chciałem było nazwać makro, które zmienia niektóre komórki i usunąć kilka wierszy, ale potrzebne do ponad 1500 wyróżnia (około 3 minut tylko spędzonych dla każdego pliku)

Głównie problem: -Gdy wywołaniem makro z VBE, mam ten sam problem, to imposible wywołać makro z pERSONAL.XLSB, gdy skrypt oppened Excel zrobił wykonać personal.xlsb i nie było żadnej opcji w makro okna

Rozwiązałem to przez utrzymywanie otwórz jeden plik Excela z załadowanym makrem (a.xlsm) (przed wykonaniem skryptu)

potem wywołać makro z Excela oppened przez skrypt

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

Próbowałem powyższych metod ale mam „makro nie można znaleźć” błąd. To jest ostatni kod, który działał!

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 

W moim przypadku MyMacro znajduje się pod Sheet1, a więc Sheet1.MyMacro.

+0

dzięki! kiedy potrzebna jest sekcja "Importuj dodatki"? – DAE

1

Ponieważ moje pokrewne pytanie zostało usunięte przez prawą rękę po tym, jak zabiłem przez cały dzień, szukając sposobu na pokonanie błędu "nie znaleziono lub wyłączono makro", zamieszczając tutaj jedyną składnię, która działała dla mnie (application.run didn ' t, bez względu na to, co starałem)

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