Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Variable aus Makro an Batch übergeben

Variable aus Makro an Batch übergeben
08.11.2015 18:10:09
Saskia
Guten Abend,
ich habe folgendes Problem.
Ich möchte mit einem Makro eine Batch-Datei öffnen lassen und eine Variable mit geben. Die Batch-Datei funktioniert einwandfrei und das Makro öffnet diese auch. Nur die Variable kommt einfach nicht mit. Ich habe die Variable so definiert:
Dim variable
variable = Range("A2").Value
da sie den Wert aus Zelle A2 übernehmen soll. Der Befehl zum aufrufen der Batch-Datei ist:
batch = Shell("C:\Users\Saskia\Desktop\Test.bat variable", 1)
Wenn sich die Datei dann öffnet kommt aber nicht der Wert aus A2 an sondern variable.
Kann mir da jemand weiter helfen?
Liebe Grüße
Saskia

Anzeige

10
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Variable aus Makro an Batch übergeben
08.11.2015 18:16:52
Nepumuk
Hallo,
so besser?
batch = Shell("C:\Users\Saskia\Desktop\Test.bat " & variable, 1)
Gruß
Nepumuk

AW: Variable aus Makro an Batch übergeben
08.11.2015 18:23:57
Saskia
Danke du bist mein Held :)
Ich habe jetzt den halben Morgen damit verbracht und nichts gefunden obwohl es doch scheinbar so leicht und offensichtlich ist.
Vielen Dank.

Anzeige
Variable aus Batch an Makro übergeben
08.11.2015 19:22:30
Saskia
Jetzt hab ich aber noch eine Frage.
Geht das ganze auch anders herum? Also das ich eine Variable die in der Batch-Datei entstanden ist an Excel übertragen kann?
MfG
Saskia

AW: Variable aus Batch an Makro übergeben
08.11.2015 19:47:09
Nepumuk
Hallo,
erstell eine Textdatei mit dem Inhalt der Variablen die kannst du dann in Excel auslesen.
Gruß
Nepumuk

Anzeige
Variante
09.11.2015 17:30:39
Michael
Hi zusammen,
Shell kann nur Programme aufrufen, mit einem Umweg über WScript kann man auch in STDOUT geschriebene Ausgaben von Programmen auslesen.
Teste mal:
Option Explicit
Sub BatchLesen()
Dim oData As Variant
Dim objShell As Object, objExec As Object
Dim ausgabe As String
ausgabe = "Parameter1"
Set objShell = CreateObject("WScript.Shell")
' batchtest.bat sieht so aus:
' @echo wert=bla
' @echo %1
' Ende batchtest.bat
Set objExec = objShell.Exec("C:\A_Herber\batchtest.Bat " & ausgabe)
Do While Not objExec.StdOut.AtEndOfStream
ausgabe = Trim(LTrim(objExec.StdOut.ReadLine))
'If Mid(ausgabe, 1, 4) = "wert" Then
MsgBox ausgabe
Loop
Set objShell = Nothing
End Sub
Schöne Grüße,
Michael

Anzeige
AW: Variante
10.11.2015 20:40:58
Saskia
Also das mit dem txt File hat eigentlich gut funktioniert. Mein Batch läuft auch einwandfrei. Nur das Makro macht mir weiterhin Probleme. Wenn ich die Batch Datei aufrufe, wird diese ausgeführt und erstellt die ergebnis.txt wie sie das sollte. Wenn ich dann einen Schritt weiter aus diesem txt File lese, kommt allerdings, dass die Datei nicht exisitert obwohl sie ja da ist. Wenn ich das Makro dann noch mal ausführe funktioniert es dann. Allerdings nimmt es dann nicht die aktuell erstellte Version der ergebnis.txt sondern die davorige, obwohl der Inhalt im ergebnis.txt überschrieben wird beim erneuten ausführen. Ich hoffe das ist irgendwie verständlich. Hier mal der Code:
variable = Range("A2").Value
batchPfad = "C:\Users\Saskia\Desktop\Test.bat"
ergebnisPfad = "C:\Users\Saskia\Desktop\Ergebnis.txt"
zaehler = 0
'Batch starten mit Variable aus Feld A2
batch = Shell(batchPfad & " " & variable, 1)
'Zeilen aus txt lesen
Open ergebnisPfad For Input As #1
Do While Not EOF(1)
Line Input #1, temp
Sheets(1).Cells(2 + zaehler, 2) = Replace(temp, vbTab, " ")
zaehler = zaehler + 1
Loop
Close #1
variable = Null
temp = Null

Anzeige
AW: Variante
11.11.2015 00:09:21
Michael
Hi Saskia,
Excel-Hilfe zu "Shell": arbeitet asynchron, d.h., wenn der Prozeß nach Excel zurückkehrt, bevor die Datei geschrieben ist, ist sie eben noch nicht da.
Nimm WSript.Shell wie im Beispiel, dann ist die Textdatei überflüssig, oder, wenn es Dir lieber ist, recherchiere die WScript-Optionen, da kannst Du explizit warten, bis der Prozeß fertig ist.
Schöne Grüße,
Michael

Anzeige
AW: Variante
11.11.2015 19:06:05
Saskia
Hallo Michael,
wenn ich das richtig verstanden habe, kann ich den Befehl nicht im Excel Makro ausführen lassen sondern über eine .vbs, oder? Ich hab ja versucht den WScript Befehl zu verstehen, tatsächlich entzieht sich das Thema aber scheinbar total meiner Auffassungsgabe.
Geht es nicht auch so, dass ich eine Pause nach der Batch-Ausführung einbauen kann, dass hier kurz gewartet wird, und die .txt dann da ist, wenn das Makro weiter arbeitet oder gibt es da wirklich keinerlei Chance?
Liebe Grüße
Saskia

Anzeige
nein, nein,
11.11.2015 20:21:45
Michael
Saskia,
ich hatte Dir doch das Beispiel oben gepostet, das ist ganz normaler VBA-Code in Excel, den Du auch zeilenweise zum Anschauen mal mit der F8-Taste durchgehen kannst.
Du mußt es nur ausprobieren (und halt Deine Pfade ändern).
Ich muß jetzt weg von der Kiste, aber evtl. wäre es ja auch ganz nett, wenn Du uns mal kurz schilderst, was die Batch-Datei eigentlich macht: vielleicht gibt es ja hier schon eine Möglichkeit, etwas zu vereinfachen.
Schöne Grüße,
Michael

Anzeige
AW: Variante
11.11.2015 20:18:22
Saskia
Ich habe es jetzt so lösen können:
'Warten bis txt erstellt ist
Set fs = CreateObject("Scripting.FileSystemObject")
Do While fs.Fileexists(ergebnisPfad) = False
newHour = Hour(Now())
newMinute = Minute(Now())
newSecond = Second(Now()) + 5
waitTime = TimeSerial(newHour, newMinute, newSecond)
Application.Wait waitTime
Loop
Trotzdem allen vielen Dank für die tollen Lösungen. Ohne eure Hilfe wäre das nichts mehr geworden.
Liebe Grüße
Saskia
Anzeige
;
Anzeige
Anzeige

Infobox / Tutorial

Variablen aus Excel-Makro an Batch-Datei übergeben


Schritt-für-Schritt-Anleitung

  1. Variable definieren: Zunächst musst du die Variable in deinem Excel-Makro definieren. Verwende dazu folgenden Code:

    Dim variable
    variable = Range("A2").Value
  2. Batch-Datei aufrufen: Um die Batch-Datei mit der Variable zu starten, benutze den Befehl Shell. Achte darauf, die Variable korrekt zu übergeben:

    Dim batch
    batch = Shell("C:\Users\Saskia\Desktop\Test.bat " & variable, 1)
  3. Warten auf die Batch-Ausführung: Wenn deine Batch-Datei eine Datei erstellt, kann es notwendig sein, dass du eine Pause einbaust, um sicherzustellen, dass die Datei auch wirklich vorhanden ist, bevor du mit dem nächsten Schritt fortfährst. Hier ist ein Beispiel, wie du dies umsetzen kannst:

    Dim fs As Object
    Set fs = CreateObject("Scripting.FileSystemObject")
    Do While fs.FileExists("C:\Users\Saskia\Desktop\Ergebnis.txt") = False
        Application.Wait Now + TimeValue("0:00:01") ' 1 Sekunde warten
    Loop

Häufige Fehler und Lösungen

  • Problem: Die Batch-Datei erhält nicht den Wert der Variable, sondern nur "variable".

    • Lösung: Stelle sicher, dass du die Variable mit & korrekt an den Shell-Befehl anhängst:

      batch = Shell("C:\Users\Saskia\Desktop\Test.bat " & variable, 1)
  • Problem: Die Datei wird nicht gefunden, obwohl sie existiert.

    • Lösung: Warte, bis die Datei tatsächlich vorhanden ist, bevor du sie weiterverarbeitest, wie im Schritt 3 beschrieben.

Alternative Methoden

Eine alternative Möglichkeit, um Variablen zwischen Excel und Batch-Dateien auszutauschen, ist die Verwendung von WScript. Hierbei kannst du die Ausgabe der Batch-Datei direkt in dein Makro einlesen:

Dim objShell As Object, objExec As Object
Set objShell = CreateObject("WScript.Shell")
Set objExec = objShell.Exec("C:\Users\Saskia\Desktop\Test.bat " & variable)

Do While Not objExec.StdOut.AtEndOfStream
    MsgBox objExec.StdOut.ReadLine
Loop

Diese Methode ermöglicht es dir, die Ausgabe der Batch-Datei direkt in dein Excel-Makro zu integrieren, ohne eine separate Datei erstellen zu müssen.


Praktische Beispiele

Hier ein einfaches Beispiel für die Verwendung von Excel VBA, um eine Batch-Datei mit einer Variablen zu starten und anschließend die Ergebnisse auszulesen:

Sub RunBatchAndReadOutput()
    Dim variable As String
    Dim batchPfad As String
    Dim ergebnisPfad As String
    Dim fs As Object

    variable = Range("A2").Value
    batchPfad = "C:\Users\Saskia\Desktop\Test.bat"
    ergebnisPfad = "C:\Users\Saskia\Desktop\Ergebnis.txt"

    Shell(batchPfad & " " & variable, 1)

    ' Warte, bis die Datei existiert
    Set fs = CreateObject("Scripting.FileSystemObject")
    Do While fs.FileExists(ergebnisPfad) = False
        Application.Wait Now + TimeValue("0:00:01")
    Loop

    ' Lese die Datei
    Dim temp As String
    Dim zaehler As Integer
    zaehler = 0
    Open ergebnisPfad For Input As #1
    Do While Not EOF(1)
        Line Input #1, temp
        Sheets(1).Cells(2 + zaehler, 2) = temp
        zaehler = zaehler + 1
    Loop
    Close #1
End Sub

Tipps für Profis

  • Batch-Parameter übergeben: Wenn du mehrere Parameter an die Batch-Datei übergeben möchtest, kannst du diese durch ein Leerzeichen trennen:

    batch = Shell("C:\Users\Saskia\Desktop\Test.bat " & variable & " " & anotherVariable, 1)
  • Warten mit WScript: Wenn du mit WScript arbeitest, kannst du die Exec-Methode verwenden, um den Status der Batch-Ausführung zu kontrollieren. So kannst du sicherstellen, dass alle Prozesse abgeschlossen sind, bevor du fortfährst.


FAQ: Häufige Fragen

1. Wie kann ich mehrere Variablen an die Batch-Datei übergeben?
Du kannst mehrere Variablen einfach durch ein Leerzeichen trennen, wie hier gezeigt:

batch = Shell("C:\Users\Saskia\Desktop\Test.bat " & variable1 & " " & variable2, 1)

2. Was tun, wenn die Batch-Datei nicht startet?
Überprüfe den Pfad der Batch-Datei und stelle sicher, dass er korrekt ist. Achte ebenfalls darauf, dass die Batch-Datei ausführbar ist und keine Syntaxfehler enthält.

3. Wie lese ich die Ausgabe der Batch-Datei in Excel?
Du kannst die Ausgabe mit der WScript.Shell.Exec-Methode direkt in dein Makro lesen, wie im Abschnitt "Alternative Methoden" beschrieben.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige