das folgende Skript zum Abruf von CVS Dateien läuft auf meinem Rechner reibungslos im Zusammenspiel mit einem VBA Tool. Nun wollte ich die Kombi bei einem Bekannten auf dem Rechner zum Laufen bringen aber es klappt nicht so richtig. Meine Fehlersuche hat folgendes gezeigt:
Starte ich das VBA Tool und lasse ich die übergebenen Parameter mittels Print in Python ausgeben dann übernimmt VBA diese wieder nach dem der Python Code durchgelaufen ist. Die Parameterübergabe klappt also in beide Richtungen. Ich habe auch sichergestellt, dass der http-Request funktioniert indem ich den Python Code alleine habe laufen lassen mit festen Werten für die Variablen. Python gibt die gewünschten CSV Dateien ohne Probleme aus. Das heißt der Python Code funktioniert "eigentlich" astrein.
Starte ich dann aber das VBA Tool in der Erwartung nun, wie gewohnt, mittels Print Ausgabe die CSV Dateien in VBA zu übernehmen dann geht zwar kurz die Python Shell auf aber sie schließt sich sofort wieder und von Daten keine Spur. Auf meinem heimischen Rechner bleibt die Shell in der Regel ein paar Sekunden offen, so lange bis die CSV Dateien ausgegeben wurden. In VBA ist bereits eine Warteschleife integriert, damit der Code wartet bis die CSV Dateien vorhanden sind aber hochsetzen der Wartezeit hat ebenfalls nichts gebracht.
Im folgenden der Python Code:
Code: Alles auswählen
#Get CSV-Files
import sys
#
arglist = sys.argv # Übergebene Werte aus VBA
#
txt = len(sys.argv)
#print (sys.argv[0])
#print (sys.argv[1])
#print (sys.argv[2])
#print (sys.argv[3])
#print (sys.argv[4])
symbol = sys.argv[1]
spoint = sys.argv[2]
epoint = sys.argv[3]
value = sys.argv[4]
import requests
session = requests.session()
if str(value) == ("Div"):
url = "https://de.finance.yahoo.com/quote/" + symbol + "/history?period1=" + spoint + "&period2=" + epoint + "&interval=div%7Csplit&filter=div&frequency=1d"
else:
url = "https://de.finance.yahoo.com/quote/" + symbol + "/history?period1=" + spoint + "&period2=" + epoint + "&interval=1d&filter=history&frequency=1d"
page = session.get(url)
cookiecrumb = page.cookies.get
while True:
if str(value) == ("Div"):
link = "https://query1.finance.yahoo.com/v7/finance/download/" + symbol + "?period1=" + spoint + "&period2=" + epoint + "&interval=1d&events=div&crumb=%s/" % (cookiecrumb)
else:
link = "https://query1.finance.yahoo.com/v7/finance/download/" + symbol + "?period1=" + spoint + "&period2=" + epoint + "&interval=1d&events=history&crumb=%s/" % (cookiecrumb)
csvfile = session.post(link)
substring = "Method Not Allowed"
string = csvfile.text
if not substring in string:
break
print(csvfile.text)
session.close
Code: Alles auswählen
' Der folgende Code übernimmt alles aus Python was dort mit "print" ausgegeben wird
Dim DivSheet As Worksheet
Set DivSheet = Workbooks(Projektname).Worksheets("Dividenden")
With DivSheet
.Activate
.Range("A1:B10000").ClearContents
.Range("A1:B10000").ClearFormats
End With
Dim output As Object, sLine As String, Zeile As Long
Zeile = 0
Set output = oExec.StdOut
While Not output.AtEndOfStream
Zeile = Zeile + 1
sLine = output.ReadLine
If sLine <> "" Then ActiveWorkbook.Worksheets("Dividenden").Cells(Zeile, 1).Value = (sLine)
Wend
' CSV Format umwandlen (Text to Columns)
With DivSheet
.Activate
.Columns(1).Select
.Range("A1:A10000").TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
Semicolon:=False, Comma:=True, Space:=False, Other:=False, FieldInfo _
:=Array(Array(1, 4), Array(2, 1), Array(3, 1), Array(4, 1), Array(5, 1), Array(6, 1), _
Array(7, 1)), DecimalSeparator:=".", ThousandsSeparator:=" ", _
TrailingMinusNumbers:=True
End With
VG,
Marc