Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
1700to1704
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Funktion mit Rückgabewert aus Python

Funktion mit Rückgabewert aus Python
16.07.2019 08:19:07
Marc
Guten Morgen,
ich habe eine Funktion erstellt, die einen Webscraper aufruft, der in Python geschrieben ist und einen String mit Informationen liefert. Dieser String soll ohne Zwischenspeicherung auf dem Laufwerk an VBA zurückgegeben werden.
Ich hatte es zunächst wie folgt versucht:

Function getsoup() As String
Dim x As String
x = "DAI.DE"
Dim wsh As Object
Set wsh = VBA.CreateObject("WScript.Shell")
Dim ReturnValue As String
ReturnValue = wsh.Run("C:\Users\Herbert_Meisel\AppData\Local\Programs\Python\Python37-32\python. _
_
_
_
_
exe C:\Users\Public\Geldanlage\Pivots\Dividendenbewertung\Scraper.py '" & x & "'")
End Function

Der Aufruf findet in der folgenden

Sub statt:


Sub Test()
Dim Dividends As String
Dividends = getsoup()
Debug.Print (Dividends)
End Sub

Der Python Code wird sauber aufgerufen und es erscheinen auch keine
Fehlermeldungen aber die Funktion gibt nichts zurück bzw. im Direktfenster erscheint
nichts.
Ist es grundsätzlich überhaupt möglich was ich da versuche oder ist VBA auf diese
Weise nicht in der Lage den String zu erhalten, der von Python erzeugt wird?
Welche Alternativen gäbe es noch wenn es so nicht geht? Ein Event Handler vielleicht,
der anspringt wenn der Python Code durchgelaufen ist und dann den Wert übernimmt?
Wäre super wenn jemand einen Tipp hätte.
Gruß,
Marc

13
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Ansätze
16.07.2019 08:41:56
Fennek
Hallo,
1. siehe http://snb-vba.eu/VBA_Python_en.html
2. Schreibe den String aus Python in eine TXT-Datei, die kann VBA auslesen
3. schreibe den String in Python ins Clipboard
4. ... ? ...
mfg
AW: Funktion mit Rückgabewert aus Python
16.07.2019 08:45:28
ede
Hallo Marc,
du musst schon in deiner Funktion den Wert zurück übergeben. Sollte Dein Ergebnis in der Variablen ReturnValue stehen, dann weise das am Ende der Funktion zu:

getsoup = ReturnValue

gruss
ede
AW: Funktion mit Rückgabewert aus Python
16.07.2019 09:03:45
Marc
Moin Ede,
erstmal herzlichen Dank an Dich. Ich habe das nun wie folgt umgesetzt:

Function getsoup() As String
Dim x As String
x = "DAI.DE"
Dim wsh As Object
Set wsh = VBA.CreateObject("WScript.Shell")
Dim ReturnValue As String
ReturnValue = wsh.Run("C:\Users\Herbert_Meisel\AppData\Local\Programs\Python\Python37-32\python. _
exe C:\Users\Public\Geldanlage\Pivots\Dividendenbewertung\Scraper.py '" & x & "'")
getsoup = ReturnValue
End Function

Im Direktfenster erscheint jetzt zwar eine Null aber nicht der String, den Python erzeugt. Irgendwas ist da noch nicht ganz korrekt. :)
Anzeige
AW: Funktion mit Rückgabewert aus Python
16.07.2019 09:08:10
ede
Dann liefert vermutlich dein Aufruf 'wsh.Run(...' das Ergebnis/String auch nicht ordnungsgemäß in die Variable ReturnValue zurück!
AW: Funktion mit Rückgabewert aus Python
16.07.2019 09:16:40
Marc
Ich habe eine Vermutung. Ich habe eben bemerkt, dass die Null im Direktfenster gedruckt wird bevor das Python Skript überhaupt die Dividenden gezogen hat. Ich sehe das im Python Interpreter.
Vermutlich muss ich eine Warteschleife einbauen.
AW: Funktion mit Rückgabewert aus Python
16.07.2019 09:25:48
Marc
Ok, Warteschleife hat nichts gebracht.
AW: Funktion mit Rückgabewert aus Python
16.07.2019 09:30:18
ede
wie Fennek schon geschrieben hat musst du das Ergebnis deines Aufrufes in eine temporäre Textdatei schreiben und in der vba-Funktion den Inhalt auslesen, um Ihn dann an die Funktion zurück zu übergeben.
gruss
ede
Anzeige
AW: Funktion mit Rückgabewert aus Python
16.07.2019 09:51:19
Marc
Ich hatte zunächst mal die Clipboard-Variante ausprobiert, die Fennek ebenfalls zur Auswahl gestellt hatte und bin auch weiter gekommen insofern, dass ich dem Clipboard schonmal Information entnehme, die von Python dort eingefügt wurde und diese erscheint dann auch im Direktfenster.
In Python füge ich durch folgende Information den String in die Zwischenablage ein:
pyperclip.copy(csvfile.text)
Allerdings kommt dann im Direktfenster bei VBA folgendes heraus:
csvfile.text
Das ist natürlich nicht das gewünschte Ergebnis. =)
AW: Funktion mit Rückgabewert aus Python
16.07.2019 09:58:13
ede
Hallo nochmal,
dann schau doch bitte in die Datei 'csvfile.text', da müssten doch die gewünschten Informationen als Inhalt stehen.
Gruss
Anzeige
AW: Funktion mit Rückgabewert aus Python
16.07.2019 10:08:02
Marc
Wie meinst Du das? Das ist eine csv Datei, die sich in Python in der variable csvfile ("csvfile = session.post(link)") befindet.
Ich möchte die Datei nicht zwischenspeichern auf der Festplatte sondern den inhalt direkt übergeben. Aber vermutlich habe ich auch gar nicht verstanden wie Du es meinst.
AW: Funktion mit Rückgabewert aus Python
16.07.2019 10:15:41
ede
leider kenne ich mich mit Python nicht aus und kann deinen Fall nicht nachstellen. Alternativ, falls Du das Ergebnis in der Zwischenablage hast, hole es dir doch von da! Sorry lasse die Frage mal für andere OFFEN.
AW: Funktion mit Rückgabewert aus Python
16.07.2019 10:24:31
Marc
Ich denke ich übergebe die Information in Python schon nicht korrekt an die Zwischenablage. Von daher würde ich sagen das ist nun eher ein Fall für´s Python Forum.
Trotzdem vielen Dank!
Anzeige
AW: Funktion mit Rückgabewert aus Python
16.07.2019 13:55:22
Marc
Nachdem die Clipboard Variante ums Verrecken nicht funktionieren wollte habe ich es mit einer anderen variante gelöst. Dabei übernimmt VBA alles, was in Python mit "print" ausgegeben wird:

Sub GetDataFromPython()
Dim x As String
x = "DAI.DE"
Dim wsh As Object
Set wsh = VBA.CreateObject("WScript.Shell")
Dim oExec As Object
Set oExec = wsh.Exec("C:\Users\Herbert_Meisel\AppData\Local\Programs\Python\Python37-32\python. _
exe C:\Users\Public\Geldanlage\Pivots\Dividendenbewertung\Scraper.py '" & x & "'")
' Warteschleife
Dim Ende As Single, i As Long
Ende = Timer + 2
Do While Timer  "" Then s = s & sLine & vbNewLine
Wend
Debug.Print s
End Sub

Sicher nicht die eleganteste Variante aber erstmal ausreichend.
Anzeige

134 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige