[VBA][BATCH] in Excel abfragen ob in Batch 7z erfolgreich komprimiert hat

Rappi789

Lt. Junior Grade
Registriert
Mai 2010
Beiträge
398
Hallo zusammen,

mit meinem Basis VBA Wissen und Google habe ich in Excel ein Makro geschrieben, in dem eine Batch Datei erstellt und gestartet wird.
In dieser Batch Datei wird mit 7z der Ordner "SW_Manager" mit 7z komprimiert:
Code:
7z x "C:\#_Daten\Datei.7z"  -o"C:\#_Daten\SW_Manager"

Das funkioniert soweit auch.


Kann ich aber nun irgendwie abfragen, ob das Komprimieren auch erfolgreich war?
In der Console steht zum Schluss:
Code:
Compressing  Datei.txt

Everything is Ok

C:\#_Daten\SW_Manager>

Momentan habe ich einfach eine msgbox mit einer JA, NEIN Abfrage gemacht, wo der Bediner selbst bestätigt ob die Aktion erfolgreich wa oder nicht. Aber geht das auch automatisch?
Also kurzgesagt, ist es mir möglich irgendwie zwischen der Console und meinem Excel Makro zu komunizieren?

Ich bin jeder Hilfe dankbar!
MFG
Rappi
 
Zuletzt bearbeitet:
Hallo,
meiner Ansicht nach funktioniert das so nicht, da dein Excel nur das Batchfile kennen kann dass du per VBA aufrufst. Woher soll es wissen, was innerhalb des Batches gestartet wird?

Bin jetzt nicht so der große VBA Crack, aber entweder der Batch gibt einen Ergebniswert zurück, oder du musst per VBA 7Zip direkt starten. Dann solltest du von 7Zip einen Ergebniswert zurück bekommen.

greetz
​hroessler
 
Exit Codes from 7-Zip

7-Zip returns the following exit codes:
Code Meaning
0 No error
1 Warning (Non fatal error(s)). For example, one or more files were locked by some other application, so they were not compressed.
2 Fatal error
7 Command line error
8 Not enough memory for operation
255 User stopped the process

Google ist Dein Freund!
 
@alxtraxxx: Das sind zwar die korrekten Rückgabewerte, aber die Lösen sein Problem nicht. Sein Problem ist doch, dass sein VBA den Aufruf von 7Zip nicht mitbekommt, da der Aufruf über ein "Zwischenprogramm" (das Batchfile) erfolgt.

Das Batchfile kann den Returncode aber an das VBA zurückgeben. Alternativ kann der Programmaufruf direkt per VBA erfolgen. Dann kann VBA den Returncode direkt auslesen.

greetz
hroessler
 
Auch in Batchfiles kann man Return-Codes verarbeiten, nur so nebenbei
 
hallo ihr,

danke für die Antworten...


Ich habe mir das mit den Error Codes jetzt einmal genauer angeschaut, kapiere aber nicht ganz, wie ich die auslesen soll / kann.
Ich habe die Möglichkeit gefunden mit von 7Zip ein Log.txt File ausgeben zu lassen:
Code:
>Log.txt 2>&1
aber damit wird mir in der Console der fortschritt nicht mehr angezeigt und in dem Log wird der gesamte Text (was normalerweise in der Console durch läuft) eingetragen und nicht die Rückgabewerte.

@hroessler
VBA kann Codes von externen Programmen ausführen?
Wie geht das, hab absolut keinen Plan...

Oder wenn jemand ein Bsp. von etwas ähnlichen hat, wäre echt supa.

THX


edit:
Ich habe nun folgende Seite gefunden:
http://steve-jansen.github.io/guides/windows-batch-scripting/part-3-return-codes.html
wäre ich damit auf dem richtigen Weg?
 
Zuletzt bearbeitet:
Im Batch

@echo off
my_nify_exe.exe
if errorlevel 1 (
echo Failure Reason Given is %errorlevel%
exit /b %errorlevel%
)

In VBA gibt es verschiedene Möglichkeiten
Ausführliches Beispiel
http://www.cpearson.com/excel/ShellAndWait.aspx

Einfacheres Beispiel per Windows-Scripting-Host
http://www.programmersheaven.com/discussion/167592/return-value-of-shell

Weiteres einfaches Beispiel
http://www.vb-tec.de/xshell.htm
Weitere Beispiele findet man per Google mit Suchbegriffen Shell Exceute VBA oder in der Online Hilfe von VBA
wenn man nach Shell sucht (dieser Befehl alleine gibt allerdings nicht den ExitCode zurück).

Natürlich kann man mit VBA auch den ExitCode einer Batch auslesen.
 
@ alxtraxxx

Vielen Dank für die Tipps!

Ich werde mir das einmal anschauen, bin mal gespannt, ob ich das überhaupt hinbekomme...
 
Hallo wieder...

Ich habe die letzten Tage wieder weiter an meinem Programm gefeilt und es soweit zum funktionieren gebracht.

@alxtraxxx
Der Code im Batch File hat sofort funktioniert :D

Im VBA habe ich nun folgendes gemacht:
Code:
    Dim objShell As Object
    Dim objWshScriptExec As Object
    Dim objStdOut As Object
    Dim rline As String
    Dim strline As String

    Set objShell = CreateObject("WScript.Shell")
    Set objWshScriptExec = objShell.Exec("dateipfad")
    Set objStdOut = objWshScriptExec.stdout

    While Not objStdOut.AtEndOfStream
        rline = objStdOut.ReadLine                                                                     
        If rline <> "" Then strline = strline & vbCrLf & CStr(Now) & ":" & Chr(9) & rline               
    Wend

    If objWshScriptExec.exitcode = 0 Then       'OK Auswertung


Eine Sache würde es noch geben, um das ganze etwas zu verschönern...
Kann ich auch mit dieser Methode die Console im Hintergrund starten, also dass sich das Fenster nicht sichtbar / minimiert öffnet?

Ich weiß, bei der Shell Funktion gibt es vbHide, aber das geht hier ja nicht...
Wenn nicht, ist es auch nicht schlimm. Es funktioniert und das ist mal das wichtigste! ;)

Dementsprechend vielen Dank euch zwei!!!
 
Zurück
Oben