AW: Parameterübergabe mit shell.excute an Python scheitert
07.07.2024 13:46:17
Zwenn
Hallo Marc,
Du hast nach meinem Kenntnisstand 2 bzw. 3 Möglichkeiten an die Ergebnisse des Python Scripts zu gelangen. Wie es dafür über WSH.run gestartet wird hat Thorsten bereits gezeigt und Du wusstest wohl auch schon, dass es mit run geht. Im Standard wird das Ergebnis auf dem Bildschirm ausgegeben. Hier ergeben sich die ersten beiden Möglichkeiten.
1. Umleiten der Standardausgabe in die Zwischenablage
Du leitest die Ausgabe in die Zwischenablage um und liest diese dann mit VBA aus. Diese Methode habe ich selber vor Jahren verwendet, um an Hashwerte eines Konsolenprogramms zu kommen, die für Bilddateien berechnet wurden. Deshalb poste ich nur die Kommentare und die WSH.run Zeile im Original sozusagen. Du kannst die Zeile einfach auf Dein Problem umschreiben.
'Ermittelte Datei hashen und das Ergebnis in die Zwischenablage schreiben
'Der Parameter /c hinter cmd, sorgt dafür, dass die Konsole (cmd) geschlossen wird, wenn reHash beendet wurde
'(Es gibt alternativ den Parameter /k, der die Konsole offen lässt. Achtung: Hier nicht verwenden. Das Makro bleibt dann stehen)
'Durch den vorletzten Parameter 0, führt der Windows Scripting Host die Konsole unsichtbar aus
'(1 macht sie sichtbar, aber dann zuckt der Bildschirm während des Makrolaufs sehr unruhig)
'Durch den letzten Parameter True, wartet das Makro, bis der Windows Scripting Host die Konsole wieder beendet hat
'(Achtung: Bei False würde das Makro weiterlaufen und nicht warten, bis der aktuelle Hash-Wert berechnet wurde)
'Die Angabe | clip leitet die Ausgabe der Konsole von der Standardausgabe (Bildschirm) in die Zwischenablage um
WshShell.Run "cmd /c " & ReHashPfad & " " & ReHashParameter & " " & Chr(34) & GrundPfadZuDateienBestand & VariablerPfadRest & DateiNameBearbeit & Chr(34) & " | clip", 0, True
2. Umleiten der Standardausgabe in eine Textdatei
Genau das gleiche, nur dass Du nicht | clip verwendest, sondern das Ergebnis mit >pfad\dateiname.txt in eine Textdatei schreibst, die Du ebenfalls mit VBA weiterverarbeiten kannst. So eine Umleitung mit > überschreibt eine bestehende Datei ohne Rückfrage.
3. Anpassen des Python Scripts
Du kannst alternativ auch das Python Script so anpassen, dass es sein Ergebnis nicht auf dem Bildschirm ausgibt, sondern es in eine Textdatei schreibt. Das Ergebnis ist das Gleiche wie unter 2. genannt.
Ich habe mich damals für die Zwischenablage entschieden, weil ich die Werte nur für die Weiterverarbeitung brauchte und annahm, der Weg über das Schreiben vieler kleiner Textdateien summiere sich zeitlich auch auf. Es waren millionen von Bildern, die so gehasht wurden.
Für den Zugriff auf die Zwischenablage aus VBA heraus habe ich diese Funktion von Peter Haserodt verwendet:
Public Function HoleTextVonZwischenablage() As String
' ************************************************************
' Benötigt einen Verweis auf die Microsoft Forms 2.0 Objektlibrary
' (Sollten Sie diese nicht so einfach finden, einfach eine Userform
' einfügen und dann wieder entfernen)
' Peter Haserodt 2004
' ************************************************************
'Quelle: http://www.online-excel.de/excel/singsel_vba.php?f=28
Dim oData As New DataObject
Dim strZwischenSpeicher As String 'Eingesetzt zum Test von Zwenn
'Fehlerbehandlung für meinen Anwendungsfall nicht notwendig
'On Error Resume Next ' Brutal um falsche Formate abzuwürgen, gibt dann einen Leerstring
oData.GetFromClipboard
strZwischenSpeicher = oData.GetText 'String zwischenspeichern, damit das Data Objekt freigegeben werden kann
'Test, weil nach 65.527 Zugriffen auf diese Funktion ein Speicherfehler kommt, der sich immer auf den Zugriff auf das Clipboard bezieht
Set oData = Nothing
'Übergabe des Funktionswertes aus der Zwischenspeicher-Variable an die aufrufende Routine
HoleTextVonZwischenablage = strZwischenSpeicher
End Function
Es gibt auch aus Python heraus die Möglichkeit direkt in Excel Dateien zu schreiben. Aber ich nehme an, dass funktioniert nicht mit einer geöffneten Datei und wäre für Deine Problemstellung auch unpraktikabel.
Viele Grüße,
Zwenn