Discussion:
Calc Finanzmathematik
(zu alt für eine Antwort)
Werner Holtfreter
2013-02-16 01:59:01 UTC
Permalink
Hallo,

die Funktion IKV(Werte;Schätzwert) ermittelt die Interne
KapitalVerzinsung, auch interner Zinsfuß oder Rendite genannt.

"Werte" ist eine Matrix mit den Werten. "Schätzwert" kann man weglassen.

Ich möchte damit in jeder Periode die Zwischenrendite eines Wertpapiers
auf Basis seines Kurses berechnen:

A B C
1 E/A Kurs Rendite
2 -1000 1000
3 0 1030 3,00%
4 10 1060 3,44%
5 0 1080 2,92%
6 1100 0 2,66%

Spalte A zeigt den Kauf, eine Ausschüttung und den Verkauf.

Die Rendite bei Verkauf in Zeile 6 ist simpel mit =IKV(A2:A6) zu
berechnen, aber bei den vorhergehenden Zeilen ist statt des
Verkaufserlöses ggf. die Ausschüttung plus der jeweilige Kurs zu
berücksichtigen. Die Rendite der Zeile 4 errechnet sich beispielsweise
aus der Zahlenfolge

-1000
0
(10+1060)

Die Werte bilden immer eine L-Anordnung. Kann mir jemand einen Ansatz
nennen? Matrixformel oder Zusatzspalte wären akzeptabel.
--
Gruß Werner
Klaus Reiser
2013-02-16 22:58:34 UTC
Permalink
Post by Werner Holtfreter
Hallo,
die Funktion IKV(Werte;Schätzwert) ermittelt die Interne
KapitalVerzinsung, auch interner Zinsfuß oder Rendite genannt.
"Werte" ist eine Matrix mit den Werten. "Schätzwert" kann man weglassen.
Ich möchte damit in jeder Periode die Zwischenrendite eines Wertpapiers
A B C
1 E/A Kurs Rendite
2 -1000 1000
3 0 1030 3,00%
4 10 1060 3,44%
5 0 1080 2,92%
6 1100 0 2,66%
Spalte A zeigt den Kauf, eine Ausschüttung und den Verkauf.
Die Rendite bei Verkauf in Zeile 6 ist simpel mit =IKV(A2:A6) zu
berechnen, aber bei den vorhergehenden Zeilen ist statt des
Verkaufserlöses ggf. die Ausschüttung plus der jeweilige Kurs zu
berücksichtigen. Die Rendite der Zeile 4 errechnet sich beispielsweise
aus der Zahlenfolge
-1000
0
(10+1060)
Die Werte bilden immer eine L-Anordnung. Kann mir jemand einen Ansatz
nennen? Matrixformel oder Zusatzspalte wären akzeptabel.
Falls es so aussehen darf und die Ergebnisse deiner Überprüfung standhalten.
http://imagebin.org/247007

Gruß Klaus
Werner Holtfreter
2013-02-16 23:23:48 UTC
Permalink
Post by Klaus Reiser
Post by Werner Holtfreter
Hallo,
die Funktion IKV(Werte;Schätzwert) ermittelt die Interne
KapitalVerzinsung, auch interner Zinsfuß oder Rendite genannt.
"Werte" ist eine Matrix mit den Werten. "Schätzwert" kann man weglassen.
Ich möchte damit in jeder Periode die Zwischenrendite eines Wertpapiers
A B C
1 E/A Kurs Rendite
2 -1000 1000
3 0 1030 3,00%
4 10 1060 3,44%
5 0 1080 2,92%
6 1100 0 2,66%
Spalte A zeigt den Kauf, eine Ausschüttung und den Verkauf.
Die Rendite bei Verkauf in Zeile 6 ist simpel mit =IKV(A2:A6) zu
berechnen, aber bei den vorhergehenden Zeilen ist statt des
Verkaufserlöses ggf. die Ausschüttung plus der jeweilige Kurs zu
berücksichtigen. Die Rendite der Zeile 4 errechnet sich beispielsweise
aus der Zahlenfolge
-1000
0
(10+1060)
Die Werte bilden immer eine L-Anordnung. Kann mir jemand einen Ansatz
nennen? Matrixformel oder Zusatzspalte wären akzeptabel.
Falls es so aussehen darf und die Ergebnisse deiner Überprüfung standhalten.
http://imagebin.org/247007
Eine Lösung ist das schon, nur keine praktikable, weil die reale Tabelle
bereits viele Zeilen und Spalten hat, und mit dieser Lösung "explodieren"
würde. Zudem müsste bei der beabsichtigten Fortschreibung der Zeilen auch
die Spalten fortgeschrieben werden.

Aber vielleicht hilft dein Ansatz, das Problem deutlicher zu machen und
gibt Anregung zum weiter denken. Daher vielen Dank.
--
Gruß Werner
Klaus Reiser
2013-02-17 10:41:41 UTC
Permalink
Post by Werner Holtfreter
Post by Klaus Reiser
Falls es so aussehen darf und die Ergebnisse deiner Überprüfung standhalten.
http://imagebin.org/247007
Eine Lösung ist das schon, nur keine praktikable, weil die reale Tabelle
bereits viele Zeilen und Spalten hat, und mit dieser Lösung "explodieren"
würde. Zudem müsste bei der beabsichtigten Fortschreibung der Zeilen auch
die Spalten fortgeschrieben werden.
Ja das war zu erwarten:-(
Wie findest Du dieses Ergebnis: http://imagebin.org/247047

Natürlich gibt es Abweichungen zu der IKV Formel. Aber ob es deshalb
falsch ist?
Verglichen wird Startkapital mit Endkapital (Dividenden +
Verkaufserlös). Die Zugewinnprozente dann geteilt durch Anzahl Jahre.

Beispiel nach 14 Jahren Start 1000€ End 1950€ Wertsteigerung 95% geteilt
durch 14 Jahre =6,79%/Jahr.

Gruß Klaus
Klaus Reiser
2013-02-17 11:09:00 UTC
Permalink
Post by Klaus Reiser
Beispiel nach 14 Jahren Start 1000€ End 1950€ Wertsteigerung 95% geteilt
durch 14 Jahre =6,79%/Jahr.
Diese Reihe ist noch näher am IKV Ergebnis: http://imagebin.org/247052

In Spalte K werden die %tualen Veränderungen zum Vorjahr errechnet.
Diese dann summiert und auf Jahresdurchschnitt umgelegt.

Gruß Klaus
Werner Holtfreter
2013-02-17 12:38:09 UTC
Permalink
Post by Klaus Reiser
Diese Reihe ist noch näher am IKV Ergebnis: http://imagebin.org/247052
In Spalte K werden die %tualen Veränderungen zum Vorjahr errechnet.
Diese dann summiert und auf Jahresdurchschnitt umgelegt.
Auf diese Weise werden wir immer nur Näherungen finden, denn der interne
Zinsfuß bei unregelmäßigen Zahlungen lässt sich nur iterativ berechnen.
Daher kann man der Funktion IKV einen Schätzwert vorgeben.

Da im Zeitablauf Investition und Entnahme häufiger auftreten, möchte ich
exakt rechnen und suche nach einer Möglichkeit, der Funktion IKV die
Werte zu übergeben.
--
Gruß Werner
Werner Holtfreter
2013-02-17 12:38:07 UTC
Permalink
Post by Klaus Reiser
Wie findest Du dieses Ergebnis: http://imagebin.org/247047
Natürlich gibt es Abweichungen zu der IKV Formel. Aber ob es deshalb
falsch ist?
Verglichen wird Startkapital mit Endkapital (Dividenden +
Verkaufserlös).
So mache ich es bisher. Die Näherung ist nur brauchbar, sofern die
Dividenden (oder umgekehrt: Nachkauf der Position) unbedeutend gegenüber
der Wertsteigerung sind. Der Grund liegt darin, dass diese Vereinfachung
den Zeitfaktor der Zwischenzahlungen ignoriert.
Post by Klaus Reiser
Die Zugewinnprozente dann geteilt durch Anzahl Jahre.
Durchschnitt ist zu grob. Man muss aus dem Zinsfaktor die n-te Wurzel
ziehen, wobei n die Zahl der Zinsperioden (Jahre) ist. Beispiel:

4 Jahre je 3 % ergibt: (1,03)^4 = 1,1255 Steigerung

Zurückgerechnet auf das Jahr: (1,1255)^(1/4) = 1,03
--
Gruß Werner
Klaus Reiser
2013-02-17 22:19:21 UTC
Permalink
Post by Werner Holtfreter
So mache ich es bisher. Die Näherung ist nur brauchbar, sofern die
Dividenden (oder umgekehrt: Nachkauf der Position) unbedeutend gegenüber
der Wertsteigerung sind. Der Grund liegt darin, dass diese Vereinfachung
den Zeitfaktor der Zwischenzahlungen ignoriert.
Post by Klaus Reiser
Die Zugewinnprozente dann geteilt durch Anzahl Jahre.
Durchschnitt ist zu grob. Man muss aus dem Zinsfaktor die n-te Wurzel
4 Jahre je 3 % ergibt: (1,03)^4 = 1,1255 Steigerung
Zurückgerechnet auf das Jahr: (1,1255)^(1/4) = 1,03
Ok ok :-)
Wie gut kennst Du Dich mit Makroprogrammierung aus? Ich habe das
Grundgerüst für eine Makrolösung ausgetüftelt. Es läuft so ab, dass das
Makro zunächst die L-Form begradigt und dann auswertet.
aus
A B C
1 E/A Kurs Rendite
2 -1000 1000
3 0 1030 3,00%
4 10 1060 3,44%
5 0 1080 2,92%
6 1100 0 2,66%

wird also zunächst (in einer unbenutzten Tabellenecke) z.B.
XY
1
2 -1000
3 0
4 1070
5

Dieses wird dann ausgewertet und das Ergebnis kann an beliebige Stelle
z.B. nach "C4" zurückgeschrieben werden. Dann kommen die nächsten Werte
dran.
XY
1
2 -1000
3 0
4 10
5 1080 Ergebnis dann in "C5"

Für jede Berechnung werden dieselben Hilfszellen verwendet. Es gibt also
keinen nennenswerten Zusatzplatzbedarf.

Interesse? und benötigst Du nur das Grundgerüst oder fertige Lösung?

Gruß Klaus
Werner Holtfreter
2013-02-18 01:15:18 UTC
Permalink
Post by Klaus Reiser
Wie gut kennst Du Dich mit Makroprogrammierung aus?
Gar nicht. Wir sollten zunächst 2 Wochen warten, ob jemand eine
einfachere Lösung einfällt.
--
Gruß Werner
Klaus Reiser
2013-02-18 21:49:00 UTC
Permalink
Post by Werner Holtfreter
Post by Klaus Reiser
Wie gut kennst Du Dich mit Makroprogrammierung aus?
Gar nicht. Wir sollten zunächst 2 Wochen warten, ob jemand eine
einfachere Lösung einfällt.
Funktionieren würde es. Es wirft dieselben Ergebnisse aus wie die
frühere Tabellenlösung von mir (die Ergebnisse sind doch wie erwartet oder).
http://imagebin.org/247205

C ist vom Makro errechnet
D sind die Ergebnisse der anderen Tabelle zur Kontrolle
E ist die momentane Hilfsspalte (die problemlos woanders hin könnte)

Wichtig ist nur, dass deine Tabelle auch wirklich wie die ursprünglich
von Dir angegebene Tabelle aufgebaut ist.

Gruß Klaus
Werner Holtfreter
2013-02-22 20:57:14 UTC
Permalink
Post by Klaus Reiser
Post by Werner Holtfreter
Post by Klaus Reiser
Wie gut kennst Du Dich mit Makroprogrammierung aus?
Gar nicht. Wir sollten zunächst 2 Wochen warten, ob jemand eine
einfachere Lösung einfällt.
Funktionieren würde es. Es wirft dieselben Ergebnisse aus wie die
frühere Tabellenlösung von mir (die Ergebnisse sind doch wie erwartet oder).
http://imagebin.org/247205
C ist vom Makro errechnet D sind die Ergebnisse der anderen Tabelle zur
Kontrolle E ist die momentane Hilfsspalte (die problemlos woanders hin
könnte)
Wichtig ist nur, dass deine Tabelle auch wirklich wie die ursprünglich
von Dir angegebene Tabelle aufgebaut ist.
Ich war unterwegs, daher erst jetzt die Reaktion auf deine dankenswerten
Versuche:

Was man schrittweise manuell lösen kann, kann man auch mit einem Makro
lösen, kein Zweifel. Ein Makro muss aber ggf. angepasst werden, wenn die
Tabelle geändert wird. Es widerspricht dem Prinzip einer rechnenden
Tabelle und kommt erst ganz am Schluss in Frage.
--
Gruß Werner
Klaus Reiser
2013-02-22 22:58:40 UTC
Permalink
Post by Werner Holtfreter
Ich war unterwegs, daher erst jetzt die Reaktion auf deine dankenswerten
Was man schrittweise manuell lösen kann, kann man auch mit einem Makro
lösen, kein Zweifel. Ein Makro muss aber ggf. angepasst werden, wenn die
Tabelle geändert wird. Es widerspricht dem Prinzip einer rechnenden
Tabelle und kommt erst ganz am Schluss in Frage.
Ein einigermaßen intelligentes Makro fragt gewisse Parameter ab und ist
deshalb nicht so unflexibel wie Du evtl. meinst.

Das Makro in der jetzigen Form verarbeitet eine Datenreihe beliebiger
Länge mit beliebigem Startpunkt.

Es kann aber durchaus sein, dass ich von falschen Voraussetzungen
ausgegangen bin. Falls die wirklichen Datenreihen von Deinem Beispiel
abweichen müsste ich eine solche Datenreihe mal sehen.

Da mich das Thema inzwischen selbst sehr interessiert (s. mein anderes
Schreiben) werde ich das Makro so oder so weiter verbessern.

Gruß Klaus
Marc Santhoff
2013-02-23 00:01:51 UTC
Permalink
Am 22 Feb 2013 20:57:14 GMT
Post by Werner Holtfreter
Was man schrittweise manuell lösen kann, kann man auch mit einem
Makro lösen, kein Zweifel. Ein Makro muss aber ggf. angepasst werden,
wenn die Tabelle geändert wird. Es widerspricht dem Prinzip einer
rechnenden Tabelle und kommt erst ganz am Schluss in Frage.
Das ist nur zum Teil richtig.

Man kann in Calc Makros als Funktionen schreiben, die dann wie die
eingebauten Funktionen zu benutzen sind. Bei Iterationen dürfen die
natürlich nur einen Schritt vollziehen, also ggf. nicht trivial zu
schreiben.

Steht (bzw. stand früher) in der mitgelieferten Hilfe, wie z.B. der
Zellinhalt als Parameter übernommen wird ...

Beispiel:

function DATEFROMSERIAL(v)
DATEFROMSERIAL = CDate(v)
end function

kann als "=DATEFROMSERIAL(123456789)" aufgerufen werden. Oder eben auch
als "=DATEFROMSERIAL(A4)".


Marc
Klaus Reiser
2013-02-22 22:36:43 UTC
Permalink
Post by Werner Holtfreter
Ich möchte damit in jeder Periode die Zwischenrendite eines Wertpapiers
A B C
1 E/A Kurs Rendite
2 -1000 1000
3 0 1030 3,00%
4 10 1060 3,44%
5 0 1080 2,92%
6 1100 0 2,66%
Spalte A zeigt den Kauf, eine Ausschüttung und den Verkauf.
Die Rendite bei Verkauf in Zeile 6 ist simpel mit =IKV(A2:A6) zu
berechnen, aber bei den vorhergehenden Zeilen ist statt des
Verkaufserlöses ggf. die Ausschüttung plus der jeweilige Kurs zu
berücksichtigen. Die Rendite der Zeile 4 errechnet sich beispielsweise
aus der Zahlenfolge
Durch Deine Anfrage wurde meine Neugierde geweckt und ich möchte die
Auswertung selbst einsetzen.
Du beschäftigst Dich sicher schon länger mit dem Thema deshalb meine
Frage an Dich.
Ist die IKV (IRR) Formel die Richtige ist oder sollte man besser die
XIRR (XINTZINSFUSS) Formel einsetzen.
Wenn man voraussetzt, dass zu unregelmäßigen Zeiten Nachkauf oder
Verkauf stattfindet muss man doch die XIRR Formel anwenden oder?

Gruß Klaus
Werner Holtfreter
2013-02-23 01:25:25 UTC
Permalink
Post by Klaus Reiser
Du beschäftigst Dich sicher schon länger mit dem Thema
Ja, ich habe die Iterationsrechnung des internen Zinses schon vor vielen
Jahren auf dem Sharp PC 1403 Pocketcomputer programmiert.
Post by Klaus Reiser
Ist die IKV (IRR) Formel die Richtige oder sollte man besser die
XIRR (XINTZINSFUSS) Formel einsetzen.
Wenn man voraussetzt, dass zu unregelmäßigen Zeiten Nachkauf oder
Verkauf stattfindet muss man doch die XIRR Formel anwenden oder?
Beide Formeln sind geeignet.

IKV bestimmt den relativen Zeitpunkt der Zahlung (nur auf den relativen
kommt es an) durch seine Position in der Liste der Zahlungsvorgänge. Aus
diesem Grunde sind die Null-Werte wichtig. Leere Zellen liefern ein
anderes Ergebnis.

Dabei werden die Zahlungen innerhalb einer Periode auf ein Datum
konzentriert.

XINTZINSFUSS verlangt zu jeder Zahlung jeweils ein Datum, das
unregelmäßig verteilt sein kann. Da man es tagesgenau angeben kann,
erhöht sich die Genauigkeit.

Mir persönlich reicht es völlig, alle Zahlungen des Monats
zusammenzufassen und monatsweise mit IKV zu rechnen. Man erhält auf diese
Weise allerdings den Monatszins und muss auf den Jahrezins umrechnen,
aber das ist einfach.
--
Gruß Werner
Die Kinder den Müttern schon im Kleinkindalter wegzunehmen
(Kinderkrippen), damit die Frau wieder für fremde Personen
als Arbeitskraft dient, ist eine Perversion ohne Gleichen.
Werner Holtfreter
2013-02-27 10:24:05 UTC
Permalink
Kommt folgendes jetzt doppelt? Mein XPost sehe ich seltsamer Weise hier
nicht, daher noch mal ein Dialog zur Sache aus
de.comp.office-pakete.ms-office.excel
Hallo Werner,
Unter Excel kann man Dein Problem mit eine Hilfsspalte (z.B. in Spalte
D) und ein Namen lösen.
in d3 schreibst du die Formel =summe(A3;B3)
du markierst jetzt eine Zelle in der Zeile 3 und def. Dann den Namen
EAKurs mit der Formel =$A$2:$A2;$D3
In die Zelle C3 kommt die Formel =IKV(EAKurs)
Die Formeln in den Zellen C3 und D3 kann man einfach nach unten ziehen.
mfG Detlev
Hallo Detlev,

eine sehr gute Idee, aber anscheinend lässt LibreOffice nur eine
Benennung geschlossener rechteckiger Bereiche zu.

Menü Einfügen - Namen - Festlegen... mit
$A$2:$A2;$D3
führt zu "Ungultiger Ausdruck".

Zwei rechteckige Namensbereiche zu verknüpfen gelang mir auch nicht.

XPost *ohne* FollowUp zur Sammlung weiterer Ideen.

Gruß Werner
ich komme von nebenan, von Star/Open/Libre-Office, aber da bisher
niemand eine gute Antwort weiß und die Funktionen ähnlich sind, nun
Die Funktion
IKV(Werte;Schätzwert)
ermittelt die Interne KapitalVerzinsung, auch interner Zinsfuß oder
Rendite genannt. "Werte" ist eine Matrix mit den Werten. "Schätzwert"
kann man weglassen.
Ich möchte damit in jeder Periode die Zwischenrendite eines Wertpapiers
| A B C
--+---------------------
1 | E/A Kurs Rendite
2 | -1000 1000
3 | 0 1030 3,00%
4 | 10 1060 3,44%
5 | 0 1080 2,92%
6 | 1100 0 2,66%
Spalte A zeigt den Kauf für 1000 €, eine Ausschüttung von 10 € und den
Verkauf für 1100. Spalte B den Kurs zum Zeitpunkt, in dem die Zeile
fortgeschrieben wird.
Die Rendite bei Verkauf in Zeile 6 ist simpel mit =IKV(A2:A6) zu
berechnen, aber bei den vorhergehenden Zeilen ist statt des
Verkaufserlöses der jeweilige Kurs plus die Ausschüttung zu
berücksichtigen. Die Rendite der Zeile 4 errechnet sich beispielsweise
aus der Zahlenfolge
-1000
0
(10+1060)
Die Werte bilden immer eine L-Anordnung.
Ich suche eine Lösung, mit der IKV andere, als nur in einer Reihe
liegende Werte übergeben werden können. Matrixformeln, indirekte
Adressierung und auch eine beschränkte Anzahl von Zwischenspalten sind
akzeptabel.
Zwischenspalten für jede Zeile möchte ich nicht, auch Makro scheidet
aus.
--
Gruß Werner
Klaus Reiser
2013-02-28 20:55:40 UTC
Permalink
Post by Werner Holtfreter
Kommt folgendes jetzt doppelt? Mein XPost sehe ich seltsamer Weise hier
nicht, daher noch mal ein Dialog zur Sache aus
de.comp.office-pakete.ms-office.excel
ich komme von nebenan, von Star/Open/Libre-Office, aber da bisher
niemand eine gute Antwort weiß und die Funktionen ähnlich sind, nun
Aha keiner weiss hier eine gute Antwort soso... ;-) wenn sich jemand so
bei den Excel Leuten einschleimt sollte man Ihm eigentlich nicht mehr
helfen. Aber wir wollen mal nicht so sein ;-)

Mein schon vorgeschlagenes Makro hat sich dank Marcs Hinweis in eine
Funktion gewandelt und hier ist das vorläufige (noch nicht vollständige)
Ergebnis.
Die Formel für "C2" lautet =IRRKR(A$1:A2;B2) und lässt sich ziehen

http://www.file-upload.net/download-7269178/IRR_KR.ods.html

Die Makrosicherheit muss natürlich passen.

Kommen bei Dir auch leere Zellen vor? Im Beispiel gab es keine. Diese
werden nämlich noch nicht richtig behandelt. Ob weitere Fehler auftreten
musst Du selbst testen. Für Risiken und Nebenwirkungen fragen Sie ihren
Arzt oder die Excel Leute;-)
Post by Werner Holtfreter
Zwischenspalten für jede Zeile möchte ich nicht, auch Makro scheidet
aus.
Ganz wie Du meinst.

Gruß Klaus
Siegfried Höfner
2013-03-01 08:42:46 UTC
Permalink
"Klaus Reiser" <***@optikreiser.de> schrieb
[....]
Kommen bei Dir auch leere Zellen vor? Im Beispiel gab es keine. Diese werden nämlich noch nicht richtig behandelt. Ob weitere
Fehler auftreten
Hallo Klaus, in der "alten" Basic-Version bei SO war es nicht möglich bei
Übergabe eines Arrays an eine Function, leere Zellen von Zellen mit Wert 0
zu unterscheiden. Gibt es jetzt tatsächlich diese Möglicheit. Ich warte mal
auf deinen Test.

Gruß Siegfried
Klaus Reiser
2013-03-01 19:56:43 UTC
Permalink
Post by Siegfried Höfner
[....]
Post by Klaus Reiser
Kommen bei Dir auch leere Zellen vor? Im Beispiel gab es keine. Diese
werden nämlich noch nicht richtig behandelt. Ob weitere Fehler auftreten
Hallo Klaus, in der "alten" Basic-Version bei SO war es nicht möglich bei
Übergabe eines Arrays an eine Function, leere Zellen von Zellen mit Wert 0
zu unterscheiden. Gibt es jetzt tatsächlich diese Möglicheit. Ich warte mal
auf deinen Test.
Tja schade wenn das nicht geht. Die Formel war so elegant. Hab in einer
früheren Version =IRRKR(ZEILE(A$1);SPALTE(A1);B2) verwendet. Hat mir
aber nicht so gefallen.
Bei diesem Aufruf werden die Zellinhalte einzeln geholt und vermutlich
ist der Test auf "leer" dann möglich.

Oder gibt es andere Ideen?

Gruß Klaus
Siegfried Höfner
2013-03-01 20:36:19 UTC
Permalink
Post by Siegfried Höfner
[....]
Post by Klaus Reiser
Kommen bei Dir auch leere Zellen vor? Im Beispiel gab es keine. Diese
werden nämlich noch nicht richtig behandelt. Ob weitere Fehler auftreten
Hallo Klaus, in der "alten" Basic-Version bei SO war es nicht möglich bei
Übergabe eines Arrays an eine Function, leere Zellen von Zellen mit Wert 0
zu unterscheiden. Gibt es jetzt tatsächlich diese Möglicheit. Ich warte mal
auf deinen Test.
Tja schade wenn das nicht geht. Die Formel war so elegant. Hab in einer früheren Version =IRRKR(ZEILE(A$1);SPALTE(A1);B2)
verwendet. Hat mir aber nicht so gefallen.
Bei diesem Aufruf werden die Zellinhalte einzeln geholt und vermutlich ist der Test auf "leer" dann möglich.
Oder gibt es andere Ideen?
Ich kenne die neue API noch nicht aber evtl. kann man damit bei entsprechender
Namensübergabe direkt auf die Zellen zugreifen.

Gruß Siegfried
Kallu Wiegand
2013-03-03 12:55:16 UTC
Permalink
Post by Klaus Reiser
Bei diesem Aufruf werden die Zellinhalte einzeln geholt und vermutlich
ist der Test auf "leer" dann möglich.
Test auf "Leer" kann Probleme bringen!
Ich hatte vor Jahren, damals OOo, das Problem (auch von anderen
nachvollzogen), dass der Inhaltstest einer Speicherzelle
unterschiedliche Ergebnisse brachte, je nach dem, ob sie leer oder "ganz
leer" war.
leer = gelöscht
ganz leer = noch nie benutzt

Ich hatte meine Formel erstellt, in die indizierte Zelle Testwerte
geschrieben, auch gelöscht, alles OK. Dann die Formel an die gewünschte
Position kopiert, dort wurde dann eine völlig unbenutzte Zelle
referenziert und ich machte ein langes Gesicht, die Formel zeigte
Fehler, bis erstmalig ein Wert in der Zelle stand/gestanden hatte.

Der Zustand "nie benutzt" konnte damals auch durch Formatierung nicht
wieder hergestellt werden, also musste ich alles anders und neu machen.

Ob es heute anders ist, muss man ausgiebig probieren, aber "Nichts" ist
nur schwer zu testen ;-)

Gruß, Kallu
--
Schönen Rest vom Tag <
Werner Holtfreter
2013-03-02 00:06:25 UTC
Permalink
Post by Klaus Reiser
Mein schon vorgeschlagenes Makro hat sich dank Marcs Hinweis in eine
Funktion gewandelt und hier ist das vorläufige (noch nicht
vollständige) Ergebnis.
Die Formel für "C2" lautet =IRRKR(A$1:A2;B2) und lässt sich ziehen
http://www.file-upload.net/download-7269178/IRR_KR.ods.html
Ausgezeichnet, eine passende Funktion ist ideal.

Sie funktioniert so weit, bis auf ein kleines Manko. Du stoppst
anscheinend bei einer Null in der Kurs-Spalte, so dass sich die Rendite
bei Rückfluss der Investition in Zeile 6 nicht mehr berechnen lässt:

| A B C
--+---------------------
1 | E/A Kurs Rendite
2 | -1000 1000
3 | 0 1030 3,00%
4 | 10 1060 3,44%
5 | 0 1080 2,92%
6 | 1100 0 2,66%

In Zeile 6 zeigt =IRRKR eine leere Zelle. Ein Workaround ist ein sehr
kleiner Wert in B6, aber ich bin sicher, dass du das noch bereinigen
kannst.

Wie verhält sich deine Funktion, wenn in Spalte A und B noch Werte
folgen, ohne dass in den korrespondierenden Zellen der Spalte C die
Formel eingetragen ist? Wird dann Zwischenspeicherplatz verbraten?
Post by Klaus Reiser
Kommen bei Dir auch leere Zellen vor? Im Beispiel gab es keine. Diese
werden nämlich noch nicht richtig behandelt.
Eine Unterscheidung von Leerzellen und Nullzellen, wie in der
Originalfunktion =IKV ist kontraproduktiv. Eine Zeile ist stets auch ein
Zeitschritt, der berücksichtigt werden soll. *Das* sicherzustellen, wäre
ideal. Im Moment scheint es aber wie gewünscht zu funktionieren, denn das
löschen der Nullwerte verändert das Ergebnis nicht.

Du rufst im Basic "IRR" auf. Ist das die englische Schreibweise von IKV?

Leider verstehe ich den verwendeten Basic-Dialekt nicht richtig. Gibt es
irgendwo einen lesbaren Schnelleinstieg?


Übrigens: Mit nur einem weiteren optionalen Parameter für =IRRKR ließen
sich auch ganz leicht gleitende Renditen über beliebige Zeiträume
ermitteln. Die optionale Zelle müsste dann vom ersten Wert des Bereiches
*abgezogen* werden.

Der Aufruf für 2 Perioden könnte dann lauten: =IRRKR(A3:A5;B5;B3)

Das Feld zur Berechnung des Ergebnisses in C5 enthält folglich:

A3-B3
A4
A5+B5
--
Gruß Werner
Klaus Reiser
2013-03-02 16:34:29 UTC
Permalink
Post by Werner Holtfreter
Post by Klaus Reiser
Mein schon vorgeschlagenes Makro hat sich dank Marcs Hinweis in eine
Funktion gewandelt und hier ist das vorläufige (noch nicht
vollständige) Ergebnis.
Die Formel für "C2" lautet =IRRKR(A$1:A2;B2) und lässt sich ziehen
http://www.file-upload.net/download-7269178/IRR_KR.ods.html
Ausgezeichnet, eine passende Funktion ist ideal.
Sie funktioniert so weit, bis auf ein kleines Manko. Du stoppst
anscheinend bei einer Null in der Kurs-Spalte, so dass sich die Rendite
Wenn man die Formel weiter runter zieht, als Werte eingegeben sind
würden irgendwelche Sachen angezeigt (Fehlermeldungen oder so ;-) ).
Das vermeide ich indem die Funktion nur durchlaufen wird solange in der
Kursspalte auch Werte stehen.

Wäre es machbar (und sogar logischer) wenn auch bei Verkauf der Betrag
in der Kurszeile stehen würde (denn das ist ja an dem Tag der Kurs)

Im Beispiel müsste die 1100 also einfach nach "B". Oder wird dann eine
falsche Rendite berechnet?

Wenn man diese Zeilen entfernt bzw. vor jede REM schreibt dann stoppt es
nicht.

REM if VerkWert = 0 then
REM IRRKR = ""
REM exit function
REM end if

Oder man müsste prüfen ob Spalte A und Spalte B leer sind und dann die
Funktion stoppen.
Post by Werner Holtfreter
| A B C
--+---------------------
1 | E/A Kurs Rendite
2 | -1000 1000
3 | 0 1030 3,00%
4 | 10 1060 3,44%
5 | 0 1080 2,92%
6 | 1100 0 2,66%
In Zeile 6 zeigt =IRRKR eine leere Zelle. Ein Workaround ist ein sehr
kleiner Wert in B6, aber ich bin sicher, dass du das noch bereinigen
kannst.
s. Oben
Post by Werner Holtfreter
Wie verhält sich deine Funktion, wenn in Spalte A und B noch Werte
folgen, ohne dass in den korrespondierenden Zellen der Spalte C die
Formel eingetragen ist? Wird dann Zwischenspeicherplatz verbraten?
Nö davon merkt ja die Funktion nichts.
Post by Werner Holtfreter
Post by Klaus Reiser
Kommen bei Dir auch leere Zellen vor? Im Beispiel gab es keine. Diese
werden nämlich noch nicht richtig behandelt.
Eine Unterscheidung von Leerzellen und Nullzellen, wie in der
Originalfunktion =IKV ist kontraproduktiv. Eine Zeile ist stets auch ein
Zeitschritt, der berücksichtigt werden soll. *Das* sicherzustellen, wäre
ideal. Im Moment scheint es aber wie gewünscht zu funktionieren, denn das
löschen der Nullwerte verändert das Ergebnis nicht.
Na super!! Endlich ist mal eine "Fehlfunktion" vorteilhaft. Wie Du
bemerkt hast wird "leer" und "0" gleich behandelt, also wie gewünscht.
Post by Werner Holtfreter
Du rufst im Basic "IRR" auf. Ist das die englische Schreibweise von IKV?
Genau so ist es.
Post by Werner Holtfreter
Leider verstehe ich den verwendeten Basic-Dialekt nicht richtig. Gibt es
irgendwo einen lesbaren Schnelleinstieg?
http://www.ooowiki.de/StarBasic und die Links dort
sehr gut ist:

http://www.dannenhoefer.de/faqstarbasic/index.html
Post by Werner Holtfreter
Übrigens: Mit nur einem weiteren optionalen Parameter für =IRRKR ließen
sich auch ganz leicht gleitende Renditen über beliebige Zeiträume
ermitteln. Die optionale Zelle müsste dann vom ersten Wert des Bereiches
*abgezogen* werden.
Immer diese Sonderwünsche ;-)
Post by Werner Holtfreter
Der Aufruf für 2 Perioden könnte dann lauten: =IRRKR(A3:A5;B5;B3)
A3-B3
A4
A5+B5
Ganz durchschaut hab ich deinen Wunsch noch nicht. Ist diese
Zusatzberechnung auch in allen Zeilen nötig oder nur in der letzten
Zeile und in welchen Zellen soll die Ausgabe erfolgen?

Gruß Klaus
Werner Holtfreter
2013-03-02 21:47:36 UTC
Permalink
Post by Klaus Reiser
Post by Werner Holtfreter
Ausgezeichnet, eine passende Funktion ist ideal.
Sie funktioniert so weit, bis auf ein kleines Manko. Du stoppst
anscheinend bei einer Null in der Kurs-Spalte, so dass sich die Rendite
bei Rückfluss der Investition in Zeile 6 nicht mehr berechnen lässt
Wenn man die Formel weiter runter zieht, als Werte eingegeben sind
würden irgendwelche Sachen angezeigt (Fehlermeldungen oder so ;-) ).
Das vermeide ich indem die Funktion nur durchlaufen wird solange in der
Kursspalte auch Werte stehen.
Wäre es machbar (und sogar logischer) wenn auch bei Verkauf der Betrag
in der Kurszeile stehen würde (denn das ist ja an dem Tag der Kurs)
Im Beispiel müsste die 1100 also einfach nach "B". Oder wird dann eine
falsche Rendite berechnet?
Dadurch wird die gleiche Rendite berechnet, denn A und B wird ja addiert.
Es widerspricht aber dem logischen Aufbau der Tabelle. Dazu mehr ganz
unten.
Post by Klaus Reiser
Wenn man diese Zeilen entfernt bzw. vor jede REM schreibt dann stoppt
es nicht.
REM if VerkWert = 0 then
REM IRRKR = ""
REM exit function
REM end if
Oder man müsste prüfen ob Spalte A und Spalte B leer sind und dann die
Funktion stoppen.
Entweder das oder aber allgemeingültiger, weil ja auch Datensätze
vorhanden sein können, die keine gültige Rendite ergeben: Die Funktion
liefert Error in die Zelle, wie jede andere Funktion auch. Ein
Makrofehler oder ein Programmabsturz, wie mehrfach erlebt, sollte
möglichst nicht erfolgen.
Post by Klaus Reiser
http://www.ooowiki.de/StarBasic und die Links dort
http://www.dannenhoefer.de/faqstarbasic/index.html
Danke, sobald ich Zeit finde, werde ich lesen.
Post by Klaus Reiser
Post by Werner Holtfreter
Übrigens: Mit nur einem weiteren optionalen Parameter für =IRRKR ließen
sich auch ganz leicht gleitende Renditen über beliebige Zeiträume
ermitteln. Die optionale Zelle müsste dann vom ersten Wert des
Bereiches *abgezogen* werden.
Immer diese Sonderwünsche ;-)
Ganz durchschaut hab ich deinen Wunsch noch nicht. Ist diese
Zusatzberechnung auch in allen Zeilen nötig oder nur in der letzten
Zeile und in welchen Zellen soll die Ausgabe erfolgen?
In jeder Zelle, die Funktion soll ja gleich bleiben, damit man sie
herunterkopieren kann.

Ich hole mal weiter aus.

Du kennst sicher den Begriff des gleitenden Durchschnitts. Es wird z.B.
immer über die letzten 10 Werte der Durchschnitt ermittelt.

Man muss aber nicht zwangsläufig die *letzten* 10 Werte nehmen, sondern
kann über jede 10er-Sequenz den Durchschnitt ermitteln. Denke dir für
Durchschnitt nun Rendite.

=IRRKR(A$1:A2;B2)
-^-
Diese Funktion rufen wir bisher mit einer festen Startzelle auf, so dass
die Zeit, über die die Rendite berechnet wird, immer länger wird. Das ist
oft sinnvoll, insbesondere weil dadurch der Basiseffekt entfällt.

Will man aber einen gleitenden Durchschnitt mit fester Zeitdauer, also
z.B. 12 Perioden, also ein Jahr, dann muss Start und Endwert wandern.


Was berechnen wir eigentlich?

Die Funktion =IRR bzw. deutsch =IKV zinst jeden Einzelwert der Reihe mit
einem Schätzwert des Zinses zum Endtermin auf und addiert sie dort
vorzeichenbehaftet.

Die Rechnung wird iterativ wiederholt, bis ein Zins gefunden ist, bei dem
die Summe aller aufgezinsten Einzelbeträge Null ergibt. (Übrigens kann
=IRR auch zum Starttermin abzinsen oder zu einem beliebigen Termin
innerhalb oder außerhalb der Zeitreihe hochrechnen - das Ergebnis bleibt
immer gleich.)

Praktische Anwendung ist eine Investition, in was auch immer, die im
Laufe der Zeit wechselnde Erträge und/oder weitere Kosten verursacht. Am
Ende wird das Investitionsgut verkauft oder verschrottet. Im letzteren
Fall gibt es keinen Verkaufserlös, statt dessen muss die Summe der
verzinsten Erträge die Investition rechtfertigen.

Wenn man jedes Vorzeichen der Zahlungsreihe ändert, erfolgt die Rechnung
aus der Perspektive des Darlehensnehmers, z.B. des Häuslebauers. Durch
diesen Vorzeichen- und Perspektivwechsel muss der errechnete Zins
natürlich unverändert bleiben.

Es sollte nun klar sein, dass mindestens ein Wert der Reihe ein vom Rest
abweichendes Vorzeichen haben muss, andernfalls gäbe es keinen Rückfluss
des Geldes und der Zins geht gegen plus oder minus unendlich. So etwas
geht nur in *Staats*haushalten - naja, zumindest bis zur nächsten
Währungsreform.


Zurück zum gleitenden Durchschnitt bzw. zur gleitenden Rendite. Dabei
steigt man mittendrin in die Tabelle ein. Stellvertretend für die
Anfangsinvestition muss man dann den aktuellen Kurswert der Investition
nehmen. Daher die Berücksichtigung des Kurses zusätzlich ersten Wert der
Reihe. Hierbei hatte ich aber noch einen Denkfehler:

In der Zeile des Kaufs erscheint der Kaufpreis und der daraus
resultierende Kurs in der gleichen Zeile. Damit der Kaufpreis nicht
doppelt gewertet wird, muss die Zelle der Kurszelle *darüber*
berücksichtigt werden. Das ist aber keine Frage des Makros sondern des
Aufrufs der Funktion. Beim Anfangs- und beim Endwert soll einheitlich
addiert werden. Der Anwender der Formel muss dann die Vorzeichen im
Aufruf setzen, um die Perspektive des Investors oder des Kreditnehmers
abzubilden.

Bisher hatten wir ein L-Feld berücksichtigt, neu wäre nun ein
aufgebogenes, liegendes U:

| A B C
--+---------------------
1 | E/A Kurs Rendite
2 |
3 |
4 | #
5 | #
6 | #
8 | #
9 | # # =IRRKR(A5:A9;B9;-B4)
10 |
11 |
12 |

In allgemeiner Schreibweise: =IRRKR(Feldanfang:Feldende;X;Y)
wobei X zum letzten und Y zum ersten Wert des Feldes addiert werden soll,
bevor das Feld an =IRR übergeben wird. Y ist optional und steht an
letzter Stelle, damit es einfach weggelassen werden kann.

Den umgekehrten Fall haben wir ja schon berücksichtigt: Da die Berechnung
erfolgt, *bevor* der Verkauf des Investionsguts erfolgt ist, muss der
negative Kurswert als Verkaufswert berücksichtigt werden.

Vielleicht wird nun auch klar, dass man die Spalte "Einnahmen/Ausgaben"
und die Spalte "Kurs" nicht vermischen sollte. Erstere enthält
tatsächliche Zahlungen, letztere nur Kurse, die für die Renditeberechnung
nur hilfsweise berücksichtigt werden.

Wenn die neue Funktion getestet und bewährt ist, sollte man die
optionalen Parameter zur Ergänzung der vorhandenen Funktion =IRR den
Entwicklern vorschlagen. Dann hat Libre/OpenOffice mal die Nase vorn.
--
Gruß Werner
Klaus Reiser
2013-03-03 10:43:47 UTC
Permalink
Post by Werner Holtfreter
Post by Klaus Reiser
Wenn man diese Zeilen entfernt bzw. vor jede REM schreibt dann stoppt
es nicht.
REM if VerkWert = 0 then
REM IRRKR = ""
REM exit function
REM end if
Oder man müsste prüfen ob Spalte A und Spalte B leer sind und dann die
Funktion stoppen.
Nein war keine gute Idee. Gehr so nicht.
Post by Werner Holtfreter
Entweder das oder aber allgemeingültiger, weil ja auch Datensätze
vorhanden sein können, die keine gültige Rendite ergeben: Die Funktion
liefert Error in die Zelle, wie jede andere Funktion auch.
Vermutlich machbar übersteigt aber meine Fähigkeiten und vor allem
meinen Zeitrahmen herauszufinden wie das geht. Bin ja kein
Programmierprofi :-(

Überhaupt.. wenn ich mir den Ablauf innerhalb der Funktion im
Einzelschrittmodus ansehe passieren da Sachen die ich mir nicht erklären
kann.
Mitlesende mit Programmiererfahrung könnten dies mal ansehen und
kommentieren (Wert in A2 eingeben und 10-20 Einzelschritte ansehen)
Post by Werner Holtfreter
Makrofehler oder ein Programmabsturz, wie mehrfach erlebt, sollte
möglichst nicht erfolgen.
Bei dieser Funktion? und unter welchen Bedingungen?
Post by Werner Holtfreter
=IRRKR(A$1:A2;B2)
-^-
Diese Funktion rufen wir bisher mit einer festen Startzelle auf, so dass
die Zeit, über die die Rendite berechnet wird, immer länger wird. Das ist
oft sinnvoll, insbesondere weil dadurch der Basiseffekt entfällt.
Will man aber einen gleitenden Durchschnitt mit fester Zeitdauer, also
z.B. 12 Perioden, also ein Jahr, dann muss Start und Endwert wandern.
Ok soweit klar
Post by Werner Holtfreter
In der Zeile des Kaufs erscheint der Kaufpreis und der daraus
resultierende Kurs in der gleichen Zeile. Damit der Kaufpreis nicht
doppelt gewertet wird, muss die Zelle der Kurszelle *darüber*
berücksichtigt werden. Das ist aber keine Frage des Makros sondern des
Aufrufs der Funktion. Beim Anfangs- und beim Endwert soll einheitlich
addiert werden. Der Anwender der Formel muss dann die Vorzeichen im
Aufruf setzen, um die Perspektive des Investors oder des Kreditnehmers
abzubilden.
Ok.
Post by Werner Holtfreter
Bisher hatten wir ein L-Feld berücksichtigt, neu wäre nun ein
Aha ja jetzt ist alles klar.
Post by Werner Holtfreter
| A B C
--+---------------------
1 | E/A Kurs Rendite
2 |
3 |
4 | #
5 | #
6 | #
8 | #
9 | # # =IRRKR(A5:A9;B9;-B4)
10 |
11 |
12 |
In allgemeiner Schreibweise: =IRRKR(Feldanfang:Feldende;X;Y)
wobei X zum letzten und Y zum ersten Wert des Feldes addiert werden soll,
bevor das Feld an =IRR übergeben wird. Y ist optional und steht an
letzter Stelle, damit es einfach weggelassen werden kann.
Den umgekehrten Fall haben wir ja schon berücksichtigt: Da die Berechnung
erfolgt, *bevor* der Verkauf des Investionsguts erfolgt ist, muss der
negative Kurswert als Verkaufswert berücksichtigt werden.
Vielleicht wird nun auch klar, dass man die Spalte "Einnahmen/Ausgaben"
und die Spalte "Kurs" nicht vermischen sollte. Erstere enthält
tatsächliche Zahlungen, letztere nur Kurse, die für die Renditeberechnung
nur hilfsweise berücksichtigt werden.
Ja das macht es klar. Also eine solche Funktion zu entwickeln
(allerdings eben auch auf Hobbyprogrammierbasis) ist möglich.
Post by Werner Holtfreter
Wenn die neue Funktion getestet und bewährt ist, sollte man die
optionalen Parameter zur Ergänzung der vorhandenen Funktion =IRR den
Entwicklern vorschlagen. Dann hat Libre/OpenOffice mal die Nase vorn.
Den Wunsch nach einer solchen Funktion kannst Du doch auch so mitteilen.
Die Entwickler werden hoffentlich wesentlich mehr draufhaben als ich und
sind somit sicher nicht auf meine Vorlage angewiesen.
Gruß Klaus
Siegfried Höfner
2013-03-03 11:40:37 UTC
Permalink
"Klaus Reiser" <***@optikreiser.de> schrieb
[...]
Überhaupt.. wenn ich mir den Ablauf innerhalb der Funktion im Einzelschrittmodus ansehe passieren da Sachen die ich mir nicht
erklären kann.
Und welche wären das ?
Mitlesende mit Programmiererfahrung könnten dies mal ansehen und kommentieren (Wert in A2 eingeben und 10-20 Einzelschritte
ansehen)
Und worauf dann achten ?

Gruß Siegfried
Klaus Reiser
2013-03-03 20:54:16 UTC
Permalink
Post by Siegfried Höfner
[...]
Post by Klaus Reiser
Überhaupt.. wenn ich mir den Ablauf innerhalb der Funktion im
Einzelschrittmodus ansehe passieren da Sachen die ich mir nicht
erklären kann.
Und welche wären das ?
Naja, ich habe erwartet, dass der Programmcode für jede zu berechnende
Zelle Schritt für Schritt (durch die ganze Function) durchlaufen wird.

Oft (aber nicht immer) läuft es jedoch nur bis zur Schleife und springt
dann wieder zum Anfang. Manchmal gehts auch in die Schleife rein und
springt aus der Schleife (also ohne Next i zu erreichen) wieder zum
Functionsanfang.

Kommt mir so vor als ob das Programm zunächst gewisse Daten sammelt und
dann erst verarbeitet.

Dann gibt es noch einen Fehler den ich mir beim besten Willen nicht
erklären kann. Dazu aber später mehr.
Post by Siegfried Höfner
Post by Klaus Reiser
Mitlesende mit Programmiererfahrung könnten dies mal ansehen und
kommentieren (Wert in A2 eingeben und 10-20 Einzelschritte ansehen)
Und worauf dann achten ?
s. oben.

Gruß Klaus
Siegfried Höfner
2013-03-07 10:29:55 UTC
Permalink
Post by Siegfried Höfner
[...]
Post by Klaus Reiser
Überhaupt.. wenn ich mir den Ablauf innerhalb der Funktion im
Einzelschrittmodus ansehe passieren da Sachen die ich mir nicht
erklären kann.
Und welche wären das ?
Hallo Klaus, ich habe das mir jetzt einmal im Einzelschritt angesehen.
Ich habe das aber nur ablauftechnisch betrachtet, für eine logische
Auswertung fehlen mir die entsprechenden Kenntnisse.
Naja, ich habe erwartet, dass der Programmcode für jede zu berechnende Zelle Schritt für Schritt (durch die ganze Function)
durchlaufen wird.
Bei mir wird die Function korrekterweise genau sooft aufgerufen, wie sie in
der Tabelle vorhanden ist.
Oft (aber nicht immer) läuft es jedoch nur bis zur Schleife und springt dann wieder zum Anfang. Manchmal gehts auch in die
Schleife rein und springt aus der Schleife (also ohne Next i zu erreichen) wieder zum Functionsanfang.
Funktioniert ebenfalls korrekt, wobei bei jedem ersten Aufruf der Schleife
der "zähler" immer um 1 verringert ist (entsprechend Funktionsaufruf-Parameter).

Evtl. liegt es bei dir an einem ungünstig gesetzten Haltepunkt.

Gruß Siegfried
Kommt mir so vor als ob das Programm zunächst gewisse Daten sammelt und dann erst verarbeitet.
Dann gibt es noch einen Fehler den ich mir beim besten Willen nicht erklären kann. Dazu aber später mehr.
Post by Siegfried Höfner
Post by Klaus Reiser
Mitlesende mit Programmiererfahrung könnten dies mal ansehen und
kommentieren (Wert in A2 eingeben und 10-20 Einzelschritte ansehen)
Und worauf dann achten ?
s. oben.
Gruß Klaus
Werner Holtfreter
2013-03-03 12:51:48 UTC
Permalink
Post by Klaus Reiser
Post by Werner Holtfreter
Makrofehler oder ein Programmabsturz, wie mehrfach erlebt, sollte
möglichst nicht erfolgen.
Bei dieser Funktion? und unter welchen Bedingungen?
Programmabsturz kann ich nicht mehr reproduzieren, aber ein "Basic-
Laufzeitfehler" wird gemeldet, wenn in IRR_KR.ods in A1 das Minuszeichen
entfernt wird. (In diesem Fall sind alle Zahlungen positiv und ein
gültiges Ergebnis ist nicht berechenbar.)
Post by Klaus Reiser
Den Wunsch nach einer solchen Funktion kannst Du doch auch so mitteilen.
Die Entwickler werden hoffentlich wesentlich mehr draufhaben als ich und
sind somit sicher nicht auf meine Vorlage angewiesen.
Freilich, aber erstens sehen wir so vorab, ob sich die Funktion im
praktischen Einsatz bewährt und zweitens bin ich nicht sicher, ob der
Quelltext des Office-Paketes noch in meinem jetzigen Leben ergänzt wird.
--
Gruß Werner
Klaus Reiser
2013-03-03 20:40:18 UTC
Permalink
Post by Werner Holtfreter
Post by Klaus Reiser
Post by Werner Holtfreter
Makrofehler oder ein Programmabsturz, wie mehrfach erlebt, sollte
möglichst nicht erfolgen.
Bei dieser Funktion? und unter welchen Bedingungen?
Programmabsturz kann ich nicht mehr reproduzieren, aber ein "Basic-
Laufzeitfehler" wird gemeldet, wenn in IRR_KR.ods in A1 das Minuszeichen
entfernt wird. (In diesem Fall sind alle Zahlungen positiv und ein
gültiges Ergebnis ist nicht berechenbar.)
Ok hab jetzt eine einfache Fehlerbehandlung eingebaut und es wird im
oben genannten Fall einfach "Fehler" ausgibt. Dies wäre noch ausbaufähig
indem die Fehlerart mitgeteilt wird.

Aus diesem Grund hab ich auch diese Passage gelöscht:
if VerkWert = 0 then
IRRKR = ""
exit function
end if

somit kann die Formel auch über den Datenbereich hinaus nach unten
gezogen werden ohne dass Schlimmes passiert.



option explicit
Function IRRKR ( vArgument as Variant,VerkWert as variant )
on error goto Fehlerbehandlung

Dim i, j, zaehler as Integer
Dim oDoc, oHilfstabelle, oFunktion, oBereich, oZielzelle,
oBereichAdresse as Object
Dim HTvonZelle, HTbisZelle, Ergebnis, zurkontrolle as Variant

oHilfstabelle = ThisComponent.sheets().getByName("HT")
zaehler =(UBound(vArgument,1))
Dim wert(zaehler)
oZielzelle = oHilfstabelle.getCellByPosition(0,0)
oZielzelle.value = vArgument(1,1)

j=1
for i=1 to zaehler -1
wert(i) = vArgument(i,j)
rem hier noch test auf leer einfügen
oZielzelle = oHilfstabelle.getCellByPosition(0,i-1) rem
Zwischenspeicher (a,i)
oZielzelle.value = wert(i)
rem bis hier nur ausführen wenn nicht leer
next i

oZielzelle = oHilfstabelle.getCellByPosition(0,i-1)
oZielzelle.value = vArgument(i,j)+ VerkWert

rem nun auswerten
------------------------------------------------------------
HTvonZelle = "A1"
HTbisZelle = "A"&i
oFunktion =
GetProcessServiceManager().createInstance("com.sun.star.sheet.FunctionAccess")
oBereich = oHilfstabelle.getcellrangebyname(HTvonZelle &":"& HTbisZelle)
IRRKR = oFunktion.callFunction("IRR", Array(oBereich))

oBereich = oHilfstabelle.getCellRangeByName(HTvonZelle & ":" & HTbisZelle)
oBereichAdresse = oBereich.getRangeAddress
oHilfstabelle.removeRange( oBereichAdresse,
com.sun.star.sheet.CellDeleteMode.UP)

Exit Function
Fehlerbehandlung:
IRRKR = "Fehler"

End Function

Ich nehme an Du weißt wie man obiges als Programm reinkopiert.

Gruß Klaus
Werner Holtfreter
2013-03-03 23:53:01 UTC
Permalink
Post by Klaus Reiser
Ich nehme an Du weißt wie man obiges als Programm reinkopiert.
Nein, bin absoluter Makro-Dummy. (Bei MS-Works war das noch einfach:
Einfach tun und aufzeichnen lassen.)--
--
Gruß Werner
Klaus Reiser
2013-03-04 12:03:32 UTC
Permalink
Post by Werner Holtfreter
Post by Klaus Reiser
Ich nehme an Du weißt wie man obiges als Programm reinkopiert.
Einfach tun und aufzeichnen lassen.)--
Schnellster Weg: verursache den +1000 Fehler ;-)
In dem aufgehenden Fenster neuen Code reinkopieren. Alten Code löschen
oder Funktionsname "Function IRRKR" umbenennen z.B. in "Function IRRKR_Alt"

Richtiger Weg:
Extras/Makros/Makros verwalten/Libre Office Basic (*) und dann ganz
unten Standard/Modul1 dann müsste IRRKR sichtbar sein. Dann Bearbeiten
und wie oben beschrieben. Dokument speichern denn dann wird auch der
neue Programmcode gespeichert.

*)Je nach Programmversion kann der Pfad auch leicht abweichen sollte
aber zu finden sein.

Gruß Klaus
Werner Holtfreter
2013-03-17 19:07:44 UTC
Permalink
Post by Klaus Reiser
option explicit
Function IRRKR ( vArgument as Variant,VerkWert as variant )
on error goto Fehlerbehandlung
Dim i, j, zaehler as Integer
Dim oDoc, oHilfstabelle, oFunktion, oBereich, oZielzelle,
oBereichAdresse as Object
Dim HTvonZelle, HTbisZelle, Ergebnis, zurkontrolle as Variant
Hallo Klaus,

dein Newsreader hat ein paar Zeilenumbrüche dazugedichtet. Soweit diese
einen Syntaxfehler verursacht haben, konnte ich die entfernen. Die
Funktion liefert aber immer noch regelmäßig "Fehler".

Könntest du deine aktuelle Version ohne Verfälschungen bereit stellen?
--
Gruß Werner
Klaus Reiser
2013-03-17 20:16:55 UTC
Permalink
Post by Siegfried Höfner
Hallo Klaus,
dein Newsreader hat ein paar Zeilenumbrüche dazugedichtet. Soweit diese
einen Syntaxfehler verursacht haben, konnte ich die entfernen. Die
Funktion liefert aber immer noch regelmäßig "Fehler".
Könntest du deine aktuelle Version ohne Verfälschungen bereit stellen?
Hallo Werner, woher die Zeilenumbrüche kommen weiß ich nicht. Wenn ich
bei mir selbst die Zeilen kopiere und einfüge läuft es normal.

Aber egal, ich kann gerne eine Datei hochladen aber, dass in manchen
Zellen das Wort "Fehler" ausgeworfen wird ist erwünscht. Es passiert
dann wenn in der Funktion ein Fehler auftritt.
Du hast selbst ein Beispiel genannt wann ein Fehler auftreten kann z.B.
wenn keine negative Zahl vorkommt. Und damit das Programm nicht abstürzt
wird in so einem Fall jetzt einfach nur "Fehler" ausgegeben.

Um nun zu ergründen warum es bei deinen Zahlenreihen zu Fehlern kommt
wäre es sinnvoll eine Musterreihe von Dir zu erhalten. Nur so kann ich
ergründen woran es liegen könnte.

Gruß Klaus
Werner Holtfreter
2013-03-17 20:31:44 UTC
Permalink
Post by Klaus Reiser
Um nun zu ergründen warum es bei deinen Zahlenreihen zu Fehlern kommt
wäre es sinnvoll eine Musterreihe von Dir zu erhalten. Nur so kann ich
ergründen woran es liegen könnte.
Es ist immer noch die gleiche Musterreihe, bei der *überall* Fehler
gemeldet werden. Aber ich bin davon überzeugt, dass ich noch irgendwo
einen unerwünschten Zeilenumbruch übersehen habe, daher der Wunsch nach
einer gültigen Makro-Datei.
--
Gruß Werner
Klaus Reiser
2013-03-18 20:36:24 UTC
Permalink
Post by Werner Holtfreter
Post by Klaus Reiser
Um nun zu ergründen warum es bei deinen Zahlenreihen zu Fehlern kommt
wäre es sinnvoll eine Musterreihe von Dir zu erhalten. Nur so kann ich
ergründen woran es liegen könnte.
Es ist immer noch die gleiche Musterreihe, bei der *überall* Fehler
gemeldet werden. Aber ich bin davon überzeugt, dass ich noch irgendwo
einen unerwünschten Zeilenumbruch übersehen habe, daher der Wunsch nach
einer gültigen Makro-Datei.
Ok alles klar also hier die neueste nochmals leicht geänderte Version
http://www.file-upload.net/download-7346586/IRR_KR_On_Error.ods.html

Bin gespannt ob jetzt alles klappt.

Gruß Klaus
Werner Holtfreter
2013-07-06 22:12:26 UTC
Permalink
Post by Klaus Reiser
Post by Werner Holtfreter
Post by Klaus Reiser
Um nun zu ergründen warum es bei deinen Zahlenreihen zu Fehlern
kommt wäre es sinnvoll eine Musterreihe von Dir zu erhalten. Nur
so kann ich ergründen woran es liegen könnte.
Es ist immer noch die gleiche Musterreihe, bei der *überall*
Fehler gemeldet werden. Aber ich bin davon überzeugt, dass ich
noch irgendwo einen unerwünschten Zeilenumbruch übersehen habe,
daher der Wunsch nach einer gültigen Makro-Datei.
Ok alles klar also hier die neueste nochmals leicht geänderte
Version
http://www.file-upload.net/download-7346586/IRR_KR_On_Error.ods.html
Post by Klaus Reiser
Bin gespannt ob jetzt alles klappt.
Hallo Klaus,

auf den ersten Blick sieht es gut aus.

Inzwischen habe ich viel über Macros gelesen und auch wieder
vergessen, da ich anderes zu tun hatte. Nun wird es Zeit, das
Finanz-Macro wieder hervorzuholen, zu testen und zu erweitern.

Leider verstehe ich dein Macro immer noch nicht ganz. Wäre es dir
möglich, sehr ausführliche Kommentare hinzuzufügen?
--
Viele Grüße
Werner
Marc Santhoff
2013-03-02 00:18:37 UTC
Permalink
Am Thu, 28 Feb 2013 21:55:40 +0100
Post by Klaus Reiser
Kommen bei Dir auch leere Zellen vor? Im Beispiel gab es keine. Diese
werden nämlich noch nicht richtig behandelt. Ob weitere Fehler
auftreten musst Du selbst testen. Für Risiken und Nebenwirkungen
fragen Sie ihren Arzt oder die Excel Leute;-)
Ohne das Makro gelesen zu haben, hier mein Snippet für die Erkennung
leerer Zellen:

' Zellwert holen, je nachdem ob er numerisch, berechnet oder eine
' Zeichenkette ist
function getDisplayedCellContent(aCell as Object)
cType = aCell.getType()
select case cType
case com.sun.star.table.CellContentType.EMPTY
res = NULL
case com.sun.star.table.CellContentType.VALUE
res = aCell.getValue()
case com.sun.star.table.CellContentType.TEXT
res = aCell.getString()
case com.sun.star.table.CellContentType.FORMULA
res = aCell.getValue() ' ???
end select
if (res = NULL) then res = ""
getDisplayedCellContent = res
end function

Viel Spaß,
Marc
Klaus Reiser
2013-03-02 16:39:55 UTC
Permalink
Am 02.03.2013 01:18, schrieb Marc Santhoff:

Hallo Marc,
Post by Marc Santhoff
Ohne das Makro gelesen zu haben, hier mein Snippet für die Erkennung
' Zellwert holen, je nachdem ob er numerisch, berechnet oder eine
' Zeichenkette ist
function getDisplayedCellContent(aCell as Object)
cType = aCell.getType()
select case cType
case com.sun.star.table.CellContentType.EMPTY
res = NULL
case com.sun.star.table.CellContentType.VALUE
res = aCell.getValue()
case com.sun.star.table.CellContentType.TEXT
res = aCell.getString()
case com.sun.star.table.CellContentType.FORMULA
res = aCell.getValue() ' ???
end select
if (res = NULL) then res = ""
getDisplayedCellContent = res
end function
Viel Spaß,
Marc
danke für den Code. Schau ich mir mal an aber wie sich zeigte will
Werner genau die "0" und "leer" Unterscheidung nicht! Problem hat sich
also erledigt ;-)

Gruß Klaus
Loading...