Konsolenanwendungen und deren Aufruf von VBA aus

Fragt man Menschen mit unterschiedlichem Background (kaufmännisch vs. informationstechnisch), was sie von Konsolenanwendungen halten, so gibt es in der Regel vollkommen gegenläufige Meinungen. Auf der einen Seite kommen Aussagen wie „das ist ja doch total veraltet, ich möchte lieber eine schicke Bedienoberfläche haben“. Auf der anderen Seite lautet die Meinung „hey, die sind absolut genial, einfach bedienbar und wirklich aufs Wesentliche fokussiert“.

Beide Meinungen sind nachvollziehbar, denn in vielen Einsatzgebieten sind Konsolenanwendungen wirklich nicht mehr zeitgemäß. Dennoch gibt es, vor allem in der IT, zahlreiche Einsatzgebiete, in denen eine Konsolenanwendung auch in der heutigen Zeit immer noch voll ihre Stärken ausspielen kann. Und zwar immer dann, wenn es nicht um die Interaktion mit dem Nutzer, sondern um Automatisierung von Abläufen geht.

Konsolenanwendungen

Als Beispiel möchte ich meine Klassenbibliothek für die Erstellung von QR-Codes heranziehen, die ich in diesem Beitrag bereits erwähnt habe. Um diese Funktionalität für den sogenannten Batchbetrieb bereitzustellen, habe ich die Klassenbibliothek in eine Konsolenanwendung integriert. Konsolenanwendungen werden, wie der Name schon vermuten lässt, in der Regel von der Konsole aus aufgerufen und kommen gänzlich ohne grafische Oberfläche aus. Die Steuerung von Konsolenanwendungen findet ausschließlich über Parameter statt, die beim Start des Programms mitgegeben werden. Diese werden in der Regel durch ein Leerzeichen getrennt übergeben und dann vom Programm entsprechend interpretiert. Dabei ist auf die richtige Reihenfolge der Parameter zu achten.

Für meine Konsolenanwendung habe ich eine andere Vorgehensweise für die Parameterübergabe überlegt, die etwas aufwändiger ist, dafür aber mehr Komfort bei der Nutzung bietet. So werden dabei sogenannte benannte Parameter eingesetzt, die mit einem vorangegangenen – Zeichen eingeleitet werden. Die dazugehörige Ausprägung kommt mit einem Leerzeichen getrennt direkt danach. Diese Art und Weise der Parameterübergabe hat den Charme, dass der Aufruf sprechender zu lesen (siehe Screenshot) ist und die Reihenfolge der Parameter keine Rolle mehr spielt. Es ist nun lediglich auf die richtige Schreibweise der Parameternamen zu achten, sowie dass jeder Parameter auch mit einer Ausprägung versehen ist. Beides wird von der Konsolenanwendung geprüft, sodass man beim Start mit fehlerhaften Parametern gleich eine Rückmeldung vom Programm erhält. Und mit Hilfe von -HELP werden alle Parameter angezeigt und erklärt.

Aufruf der Konsolenanwendung mit benannten Parametern
Beispieleinsatz

Um zu zeigen, wie ein Aufruf so einer Konsolenanwendung von VBA aus funktioniert, habe ich mir ein fiktives Einsatzszenario überlegt. Nehmen wir an, wir sind Webshopbetreiber und haben täglich eine große Menge von QR-Codes für die Webshop-Artikel anhand einer Exceltabelle zu erstellen. Wie würde sich diese Batchverarbeitung mit Hilfe von VBA-Mitteln bewerkstelligen lassen?

Aufruf der Konsolenanwendung
Erstellte Dateien mit den QR-Codes
Erstellte Dateien mit den QR-Code
Parameter für die QRCode-Erstellung
Parameter für die QRCode-Erstellung

Hier in diesem Screenshot sieht man ein einfaches Excelsheet mit 3 Spalten, in denen die Fehlerkorrekturlevel, die zu verschlüsselnden Texte (hier Einfachheit halber nur fortlaufende Nummern – in einem wirklichen Einsatz würden da natürlich Inhalte stehen, die mehr Sinn ergeben), sowie Pfade für die zu erstellenden QR-Codes abgelegt sind. Das Ziel ist nun, die Parameter zeilenweise aus dieser Tabelle auszulesen und für jede Zeile eine Instanz der Konsolenanwendung zur QRCode-Erstellung automatisiert anzustoßen.

Werfen wir nun den Blick auf den weiter unten abgebildeten Quellcode, der beim Klick auf die Schaltfläche gestartet wird. Wie man unschwer erkennen kann, iteriert die For-Schleife alle 12 Tabellenzeilen. Innerhalb dieser wird in den Codezeilen 13-20 der Parameterstring anhand der Eingaben in der jeweiligen Tabellenzeile zusammengebaut, welcher dann in der Codezeile 22 für den Aufruf der Konsolenwendung verwendet wird. Mit Hilfe der Abfrage auf den ExitCode in der Codezeile 24 soll sichergestellt werden, dass schwerwiegende Fehler in diesem Fall rot hervorgehoben werden. In die 4. Tabellenspalte wird die Ausgabe der Konsolenanwendung übertragen. Nachdem die Schleife ihre Arbeit getan hat, werden die Shellobjekte zerstört und die erzeugten QRCodes sind im angegebenen Verzeichnis ersichtlich

Der Vollständigkeit halber sei hier noch erwähnt, dass es neben der Exec-Methode auch eine Run-Methode gibt. An sich tun die beiden Methoden das selbe, nämlich, die Konsolenanwendung mit den übergebenen Parametern zu starten. Der Unterschied liegt im Detail. Hier im Quellcode ist ersichtlich, dass die Exec-Methode ein Rückgabeobjekt zurückliefert, welches die ganzen Informationen zur Ausführung enthält, wie beispielsweise der Returncode oder die Textmeldung der Konsolenanwendung. Dieses Objekt wird bei der Run-Methode nicht zurückgeliefert. Die Run-Methoden hingegen kann durch zusätzliche Parameter das Konsolenfenster steuern, indem es beispielsweise maximiert, minimiert oder gar versteckt wird.

Dim pfad        As String
pfad = "C:\Users\PC\source\QRCodeGeneratorBatch\bin\Release\QRCodeGeneratorBatch.exe"

Dim zeilenIndex As Integer
Dim shellObj As Object
Set shellObj = CreateObject("WScript.Shell")

Dim shellResponceObj As Object

For zeilenIndex = 2 To 12
    
    Dim parameter As String
    parameter = Chr(34) & "-LEVEL" & Chr(34) & " " 
    parameter = parameter & Chr(34) & QRBeispiel.Cells(zeilenIndex, 1).Value & Chr(34) & " "

    parameter = parameter & Chr(34) & "-TEXT" & Chr(34) & " "
    parameter = parameter & Chr(34) & QRBeispiel.Cells(zeilenIndex, 2).Value &Chr(34) &" "

    parameter = parameter & Chr(34) & "-QRDATEIPFAD" & Chr(34) & " " 
    parameter = parameter & Chr(34) &QRBeispiel.Cells(zeilenIndex, 3).Value & Chr(34)

    Set shellResponceObj = shellObj.Exec(pfad & " " & parameter )

    If shellResponceObj.ExitCode > 10 Then
        QRBeispiel.Cells(zeilenIndex, 4).Font.Color = vbRed
    End If
    
    QRBeispiel.Cells(zeilenIndex, 4).Value = shellResponceObj.StdOut.readall

Next zeilenIndex

Set shellObj = Nothing
Set shellResponceObj = Nothing

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.