it-swarm.com.de

Führen Sie das Excel-Makro von außerhalb von Excel mit VBScript über die Befehlszeile aus

Ich versuche, ein Excel-Makro außerhalb der Excel-Datei auszuführen. Ich verwende derzeit eine ".vbs" -Datei, die von der Befehlszeile aus ausgeführt wird, aber es wird immer wieder angezeigt, dass das Makro nicht gefunden werden kann. Hier ist das Skript, das ich verwenden möchte

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

Und hier ist das Makro, auf das ich zugreifen möchte:

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

Ich habe die Lösungen ausprobiert, die sich unter befinden. Kann ein Makro in Excel von einem externen Befehl ausgeführt werden? so weit zu kommen (und natürlich modifiziert), aber es schien nicht zu funktionieren. Ich erhalte ständig die Fehlermeldung `Microsoft Office Excel: Das Makro 'Macro.TestMacro' kann nicht gefunden werden.

BEARBEITEN: Excel 2003.

27
muttley91

Ok, es ist eigentlich ganz einfach. Angenommen, Ihr Makro befindet sich in einem Modul und nicht in einem der Blätter, verwenden Sie:

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

Um einen Dateinamen mit Leerzeichen zu versehen, müssen Sie den Dateinamen in Anführungszeichen setzen.

Wenn Sie das Makro unter einem Blatt platziert haben, z. B. sheet1, nehmen Sie einfach an, dass sheet1 die Funktion besitzt.

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

Hinweis: Sie benötigen nicht die von Ihnen verwendete Makro-Testnotation.

27
Wolf-Kun

Ich denke du versuchst das zu tun? ( AUSPROBIERT UND GETESTET )

Dieser Code öffnet die Datei Test.xls und führt das Makro TestMacro aus, das wiederum in die Textdatei TestResult.txt schreibt.

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
21
Siddharth Rout

Ich habe versucht, @ Siddharts Code an einen relativen Pfad anzupassen, um mein open_form-Makro auszuführen, aber es schien nicht zu funktionieren. Hier war mein erster Versuch. Meine Arbeitslösung ist unten.

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

Ich habe es tatsächlich ausgearbeitet, nur für den Fall, dass jemand eine Userform "alike" einer eigenständigen Anwendung ausführen möchte:

Probleme, mit denen ich zu tun hatte:

1 - Ich wollte das Workbook_Open-Ereignis nicht verwenden, da Excel schreibgeschützt ist. 2 - Der Batch-Befehl ist auf die Tatsache beschränkt, dass er (meines Wissens) das Makro nicht aufrufen kann. 

Ich habe zuerst ein Makro geschrieben, um mein Benutzerformular zu starten, während die Anwendung ausgeblendet wird:

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

Ich habe dann eine VBS erstellt, um dieses Makro zu starten (es war schwierig, dies mit einem relativen Pfad zu tun):

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"

Und ich habe endlich eine Batchdatei gemacht, um die VBS auszuführen ...

@echo off
pushd %~dp0
cscript Add_Client.vbs

Beachten Sie, dass ich auch das "Zurücksetzen auf sichtbares" in meinen Userform_QueryClose aufgenommen habe:

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

Trotzdem vielen Dank für Ihre Hilfe und ich hoffe, dass dies helfen wird, wenn jemand es braucht

4
Axn40

Da meine verwandte Frage von einer rechtschaffenen Hand entfernt wurde, nachdem ich den ganzen Tag auf der Suche nach dem Fehler "Makro nicht gefunden oder deaktiviert" getötet hatte, postete ich hier die einzige Syntax, die für mich funktionierte (application.run funktionierte nicht, egal was ich versucht habe

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

3
access_granted

Ich habe die oben genannten Methoden ausprobiert, aber ich habe den Fehler "Makro kann nicht gefunden werden" .. _. Dies ist der endgültige Code, der funktioniert hat!

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

In meinem Fall befindet sich MyMacro unter Sheet1, also Sheet1.MyMacro.

2

Wenn Sie versuchen, das Makro von Ihrer persönlichen Arbeitsmappe aus auszuführen, funktioniert es möglicherweise nicht, da das Öffnen einer Excel-Datei mit einem VBScript Ihre PERSONAL.XLSB nicht automatisch öffnet. Sie müssen so etwas tun:

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

Am Anfang der Schleife wird also personals.xlsb geöffnet und das Makro von dort aus für alle anderen Arbeitsmappen ausgeführt. Ich dachte nur, ich sollte hier posten, falls jemand so darüber stolpert wie ich, aber ich kann nicht herausfinden, warum das Makro immer noch nicht läuft.

0
Eduardo Dennis

Hallo, ich habe diesen Thread benutzt, um die Lösung zu bekommen. Dann würde ich gerne teilen, was ich getan habe, falls jemand sie verwenden könnte.

Was ich wollte, war ein Makro aufzurufen, das einige Zellen ändert und einige Zeilen löscht, aber ich brauchte mehr als 1500 Excels (ungefähr 3 Minuten für jede Datei).

Hauptsächlich Problem: - Beim Aufruf des Makros aus vbe hatte ich das gleiche Problem. Es war unmöglich, das Makro aus PERSONAL.XLSB aufzurufen Fenster 

Ich habe dies gelöst, indem ich eine Excel-Datei mit dem geladenen Makro (a.xlsm) geöffnet hielt (bevor das Skript ausgeführt wird).

Dann rufe ich das Makro aus dem Excel auf, das vom Skript abgelehnt wird

    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
0
xarokk