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

Funktion mit Rückgabewert aus Python

Forumthread: 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
Anzeige

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
Anzeige
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.
Anzeige
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
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. =)
Anzeige
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
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.
Anzeige
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
;
Anzeige
Anzeige

Infobox / Tutorial

Rückgabewert aus Python in Excel nutzen


Schritt-für-Schritt-Anleitung

Um eine Python-Funktion mit Rückgabewert in Excel zu verwenden, musst Du sicherstellen, dass die Python-Funktion korrekt aufgerufen wird und der Rückgabewert an VBA übergeben wird. Hier ist eine einfache Schritt-für-Schritt-Anleitung:

  1. Python-Umgebung einrichten: Stelle sicher, dass Python auf Deinem Computer installiert ist und die benötigten Bibliotheken vorhanden sind (z.B. pyperclip für die Zwischenablage).

  2. VBA-Funktion erstellen:

    Function getsoup() As String
       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 & "'")
    
       Dim s As String
       Do While oExec.Status = 0
           DoEvents
       Loop
    
       Dim sLine As String
       Do While Not oExec.StdOut.AtEndOfStream
           sLine = oExec.StdOut.ReadLine
           s = s & sLine & vbNewLine
       Loop
    
       getsoup = s
    End Function
  3. Sub-Prozedur erstellen: Verwende die Funktion in einer Sub-Prozedur.

    Sub Test()
       Dim Dividends As String
       Dividends = getsoup()
       Debug.Print (Dividends)
    End Sub
  4. Python-Skript anpassen: Stelle sicher, dass das Python-Skript die gewünschten Informationen korrekt ausgibt.


Häufige Fehler und Lösungen

  • Fehler: Die Funktion gibt keinen Wert zurück oder gibt Null zurück.

    • Lösung: Stelle sicher, dass die Rückgabewerte richtig zugewiesen werden. In der Funktion getsoup sollte getsoup = s stehen, um den Wert zurückzugeben.
  • Fehler: Python-Skript wird nicht korrekt ausgeführt.

    • Lösung: Überprüfe den Dateipfad und die Berechtigungen für das Skript. Stelle sicher, dass das Skript keine Fehler hat und die Ausgabe korrekt ist.
  • Fehler: Die Variable oExec gibt keine Ausgabe zurück.

    • Lösung: Verwende die Exec-Methode anstelle von Run, um die Ausgabe von Python zu erfassen.

Alternative Methoden

Wenn die direkte Rückgabe über VBA nicht funktioniert, kannst Du folgende Alternativen in Betracht ziehen:

  1. Textdatei verwenden: Schreibe die Ausgabe des Python-Skripts in eine Textdatei und lese diese in VBA ein.

    with open('output.txt', 'w') as f:
       f.write('Dein Rückgabewert hier')
  2. Zwischenablage: Verwende pyperclip in Python, um den Rückgabewert in die Zwischenablage zu kopieren und in VBA auszulesen.

    import pyperclip
    pyperclip.copy('Dein Rückgabewert hier')

Praktische Beispiele

Hier ist ein einfaches Beispiel, wie Du eine Python-Funktion mit Rückgabewert in Excel nutzen kannst:

Python-Skript (Scraper.py):

import requests

def get_dividends(stock):
    # Beispiel für eine Webanfrage
    response = requests.get(f'https://api.example.com/dividends/{stock}')
    return response.text

if __name__ == '__main__':
    # Beispiel für den Aufruf
    stock = 'DAI.DE'
    print(get_dividends(stock))

VBA: Verwende die oben beschriebene getsoup-Funktion, um die Daten aus dem Python-Skript zu erhalten.


Tipps für Profis

  • Debugging: Nutze Debug.Print, um die Variablen während der Entwicklung zu überwachen und Probleme schneller zu identifizieren.
  • Performance: Bei häufigen Aufrufen von Python-Funktionen kann es sinnvoll sein, die Daten zwischenzuspeichern, um die Ausführungsgeschwindigkeit zu erhöhen.
  • Fehlerbehandlung: Implementiere Fehlerbehandlungsroutinen in VBA, um mit möglichen Fehlern im Python-Skript umzugehen.

FAQ: Häufige Fragen

1. Kann ich Python in Excel statt VBA verwenden? Ja, Du kannst Python in Excel einbinden und sogar viele Aufgaben mit Python-Funktionen durchführen, die normalerweise mit VBA erledigt werden.

2. Wie gebe ich einen Rückgabewert von Python an Excel zurück? Durch das Ausführen des Python-Skripts über wsh.Exec in VBA kannst Du die Ausgabe von Python direkt in eine VBA-Variable schreiben.

3. Was mache ich, wenn mein Python-Skript nicht korrekt ausgeführt wird? Überprüfe die Pfade und Berechtigungen, und stelle sicher, dass das Python-Skript keine Fehler hat und die gewünschte Ausgabe erzeugt.

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