Seite 1 von 1
Pythonscript in Excel VBA einbinden
Verfasst: Donnerstag 7. August 2014, 18:17
von PopOff
Hi,
kann man ein Pythonscript in Excel benutzen?
Habe diese Website gefunden:
https://datanitro.com/
Hat jmd schon erfahrung mit so etwas? Kann man damit P.Scripte in Excel verwenden?
Oder kann man Sie komplett in einem VBA Code convertieren?
p.s Habe komplett keine Ahnung vom programmieren.
Grüße,
damian89
Re: Pythonscript in Excel VBA einbinden
Verfasst: Donnerstag 7. August 2014, 18:36
von BlackJack
@PopOff: Das verlinkte Produkt kenne ich nicht. Man kann mit Python Excel ”fernsteuern” und es gibt Module um Exceldateien, in bestimmten Grenzen, zu lesen und zu schreiben.
Re: Pythonscript in Excel VBA einbinden
Verfasst: Donnerstag 7. August 2014, 20:32
von PopOff
Danke für deine Antwort.
Ist es schwierig ein Pythonscript in ein Vba-Code umzuprogrammieren?
Ich selbst gabe leider keine Ahnung vom programmieren

Re: Pythonscript in Excel VBA einbinden
Verfasst: Donnerstag 7. August 2014, 20:40
von cofi
Ja oder Nein. Such dir eine Antwort aus.
Die Frage kann man ohne das entsprechende Skript gesehen zu haben nicht beantworten.
Je nachdem, ob das Pythonskript ein eigenstaendiges Programm ist, koenntest du es auch aus Excel aufrufen.
Re: Pythonscript in Excel VBA einbinden
Verfasst: Donnerstag 7. August 2014, 20:42
von BlackJack
@PopOff: Etwas zu machen von dem man keine Ahnung hat ist im allgemeinen schwierig, ja.

Auch wenn man Ahnung von Programmieren hat, lässt sich diese Frage aber nicht wirklich beantworten, denn es gibt sicher Python-Programme die man einfach nach VBA portieren kann, aber auch solche die man nur schwer portieren kann, bis hin zu solchen bei denen der Aufwand nicht zu rechtfertigen wäre, oder wo das Ergebnis nicht überzeugend ist.
Re: Pythonscript in Excel VBA einbinden
Verfasst: Donnerstag 7. August 2014, 20:53
von PopOff
Das Pythonskript ist lediglich eine erweiterung der XINTZINSFUSS Formel in Excel.
Ich stelle das Skript hier mal online damit man sich ein besseres Bild machen kann:
Code: Alles auswählen
def _barwert(zins, daten, zahlungen, basisdatum, enddatum, startzahlung, endzahlung):
if not len(daten) == len(zahlungen):
return "Unterschiedliche Anzahl an Daten und Zahlungen!"
if zins < -1.0:
return "Der Zins muss >= -1 sein; " + str(zins) + " ist ungültig."
if basisdatum > enddatum:
return "Das Enddatum darf nicht vor dem Startdatum liegen!"
discount = (1.0 / (1.0+zins))**(1.0/365.0)
sum = 0
for i, d in enumerate(daten):
if isinstance(d, float) and isinstance(zahlungen[i], float) and not (d > enddatum or d < basisdatum):
sum += zahlungen[i] * discount**(d-basisdatum)
sum += startzahlung
if endzahlung > 0:
sum += endzahlung * discount**(enddatum-basisdatum)
return sum
def barwert(zins, daten, zahlungen, basisdatum, enddatum, startzahlung, endzahlung):
if basisdatum > enddatum:
return "Das Enddatum darf nicht vor dem Startdatum liegen!"
if zins < -1.0:
return "Der Zins muss >= -1 sein; " + str(zins) + " ist ungültig."
daten = [d[0] for d in daten]
zahlungen = [z[0] for z in zahlungen]
return _barwert(zins, daten, zahlungen, basisdatum, enddatum, startzahlung, endzahlung)
def endwert(zins, daten, zahlungen, basisdatum, enddatum, startzahlung, endzahlung):
if basisdatum > enddatum:
return "Das Enddatum darf nicht vor dem Startdatum liegen!"
if zins < -1.0:
return "Der Zins muss >= -1 sein; " + str(zins) + " ist ungültig."
daten = [d[0] for d in daten]
zahlungen = [z[0] for z in zahlungen]
q = (1.0+zins)**(1.0/365.0)
return q**(enddatum-basisdatum) * _barwert(zins, daten, zahlungen, basisdatum, enddatum, startzahlung, endzahlung)
def zinsfuss(daten, zahlungen, basisdatum, enddatum, startzahlung, endzahlung):
basisdatum = basisdatum
daten = [d[0] for d in daten]
zahlungen = [z[0] for z in zahlungen]
pos = False
neg = False
for z in zahlungen:
if z > 0:
pos = True
if z < 0:
neg = True
if pos and neg:
break
if not (pos and neg):
return "Es müssen positive und negative Zahlungen enthalten sein!"
i0 = 0.05
i1 = 0.06
b0 = _barwert(i0, daten, zahlungen, basisdatum, enddatum, startzahlung, endzahlung)
if not isinstance(b0, float):
return b0
if b0 < 0:
i1 = 0.04
maxiter = 10000
epsilon = 0.0001
i = 0
while abs(i0-i1) > epsilon and i < maxiter:
b1 = _barwert(i1, daten, zahlungen, basisdatum, enddatum, startzahlung, endzahlung)
if b0 == b1:
return 0
if not isinstance(b1, float):
return b1
i2 = i0 - b0 / (b1-b0) * (i1-i0)
if i2 < -1.0:
return -1 #str((-1, i0, i1, i2, b0, b1))
if i2 > 1000000:
if b0 < 0:
return -1
return "∞"
b0 = b1
i0 = i1
i1 = i2
i += 1
if i == maxiter:
return "∞"
return i1
Re: Pythonscript in Excel VBA einbinden
Verfasst: Donnerstag 7. August 2014, 21:15
von karolus
Re: Pythonscript in Excel VBA einbinden
Verfasst: Donnerstag 7. August 2014, 21:29
von Sirius3
@PopOff: das Modul sieht so aus, als ob es direkt von VBA übersetzt worden ist

Also einfach den Author fragen.
Re: Pythonscript in Excel VBA einbinden
Verfasst: Freitag 8. August 2014, 07:46
von /me
PopOff hat geschrieben:Ist es schwierig ein Pythonscript in ein Vba-Code umzuprogrammieren?
Da ich jetzt seit über einem Jahr fast täglich mit VBA arbeite kann ich dazu eindeutig sagen: Es hängt davon ab.
VBA fehlen für meinen Geschmack diverse sinnvolle Datenstrukturen und Funktionen. Ich habe hier 30 Zeilen Python-Code, deren Funktionalität in einem VBA-Makro auch gut aufgehoben wäre, aber auf die Umstellung habe ich aufgrund des zu erwartenden Aufwands absolut keine Lust.
Dein angegebener Code hingegen ist einigermaßen handlich. Da muss man sich nur überlegen, wie man
daten und
zahlungen in VBA modelliert. Auf den ersten Blick sieht das wie eine Collection aus.
Re: Pythonscript in Excel VBA einbinden
Verfasst: Samstag 9. August 2014, 11:08
von PopOff
Den Author des Skriptes kann ich leider nicht erreichen.
Könnte evtl jmd. der Lust hat das Skript in einem Vba-Code umprogrammieren?
Würde auch im Gegenzug dazu dem Programmierer eine kleines Taschengeld anbieten

Re: Pythonscript in Excel VBA einbinden
Verfasst: Donnerstag 4. Dezember 2014, 18:45
von PopOff
Hi,
möchte nur nochmals nachfragen ob mir jemand helfen könnte diesen Python Code in VBA zu programmieren.
Wäre für eine hilfe sher dankbar.
Code: Alles auswählen
def zinsfuss(daten, zahlungen, basisdatum, enddatum, startzahlung, endzahlung):
basisdatum = basisdatum
daten = [d[0] for d in daten]
zahlungen = [z[0] for z in zahlungen]
pos = False
neg = False
for z in zahlungen:
if z > 0:
pos = True
if z < 0:
neg = True
if pos and neg:
break
if not (pos and neg):
return "Es müssen positive und negative Zahlungen enthalten sein!"
i0 = 0.05
i1 = 0.06
b0 = _barwert(i0, daten, zahlungen, basisdatum, enddatum, startzahlung, endzahlung)
if not isinstance(b0, float):
return b0
if b0 < 0:
i1 = 0.04
maxiter = 10000
epsilon = 0.0001
i = 0
while abs(i0-i1) > epsilon and i < maxiter:
b1 = _barwert(i1, daten, zahlungen, basisdatum, enddatum, startzahlung, endzahlung)
if b0 == b1:
return 0
if not isinstance(b1, float):
return b1
i2 = i0 - b0 / (b1-b0) * (i1-i0)
if i2 < -1.0:
return -1 #str((-1, i0, i1, i2, b0, b1))
if i2 > 1000000:
if b0 < 0:
return -1
return "∞"
b0 = b1
i0 = i1
i1 = i2
i += 1
if i == maxiter:
return "∞"
return i1