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
Pythonscript in Excel VBA einbinden
@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.
- cofi
- Python-Forum Veteran
- Beiträge: 4432
- Registriert: Sonntag 30. März 2008, 04:16
- Wohnort: RGFybXN0YWR0
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.
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.
Michael Markert ❖ PEP 8 Übersetzung ❖ Tutorial Übersetzung (3.x) ⇒ Online-Version (Python 3.3) ❖ Deutscher Python-Insider ❖ Projekte
@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.
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:
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
Da ich jetzt seit über einem Jahr fast täglich mit VBA arbeite kann ich dazu eindeutig sagen: Es hängt davon ab.PopOff hat geschrieben:Ist es schwierig ein Pythonscript in ein Vba-Code umzuprogrammieren?
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.
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.
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