[VBA/Excel] Summenfunktion

Hi Leute,

fuer Excel braeuchte ich eine fortgeschrittene Summenfunktion,
die man in manch gutem Taschenrechner schon fertig findet.

Die Aufrufsyntax sollte sein:

AdvSum(Ausdruck, Laufvariablenname, Untergrenze, Obergrenze)

um dann z.B. AdvSum(„2*i“, „ì“, 1, 5) = 30 zu erhalten.

Dazu muesste die Funktion intern 2*1 + 2*2 + 2*3 + 2*4 + 2*5
berechen. Ich bekomme es als Neuling in VBA aber nicht hin,
das der Laufvariablenname „i“ als Zahlvariable in „2*i“
eingefuegt wird.

Wer weiss Rat und kann mir helfen?

Mit besten Gruessen,

-Andreas.

Hi Leute,

AdvSum(Ausdruck, Laufvariablenname, Untergrenze, Obergrenze)

um dann z.B. AdvSum(„2*i“, „ì“, 1, 5) = 30 zu erhalten.

Wer weiss Rat und kann mir helfen?

Wie komplex darf denn der Ausdruck sein ? (Schachtelungen etc.)
Am einfachsten ist es, den Ausdruck zunaechst in eine ander Darstellungsart zu bringen: Nennt die polnische Notation. Dabei wird erst der Operator ( bei dir das „*“) und dann die Operanden angegeben. Dein Beispiel würde dann z.B. so ausseh’n:
„*(2,i)“
Diese Operanden kann man auch wunderbar schateln. Ein Ausdruck wie z.B. „4*8+10“ sähe in der polnischen Notation so aus:
„+( *(4,8) ,10)“
So kann man ganz einfach die Zeichenkette von vorne nach hinten durcharbeiten und kann dann das „i“ jeweils durch den aktuelle Laufindex ersetzen.

Gruss Jens

Hallo

AdvSum(Ausdruck, Laufvariablenname, Untergrenze, Obergrenze)

um dann z.B. AdvSum(„2*i“, „ì“, 1, 5) = 30 zu erhalten.

Ich bin mir nicht sicher, ob ich Deine Vorstellungen ganz durchblicke, aber warum soll die Laufvariable Teil des Aufrufs sein? Normalerweise ist die Laufvariable eine interne Variable der Funktion und von aussen interessiert es mich nicht, ob ich die i, j oder otto nenne.

Mit dem Aufruf AdvSum(Multiplikator, Minimum, Maximum) solltest Du doch dann keine Probleme haben. Das i definierst Du innerhalb der Funktion und benutzt es in einer For-Schleife.

Gruß
Thomas

Hi nochmal !

Am einfachsten ist es, den Ausdruck zunaechst in eine ander
Darstellungsart zu bringen: Nennt die polnische Notation.
Dabei wird erst der Operator ( bei dir das „*“) und dann die
Operanden angegeben. Dein Beispiel würde dann z.B. so
ausseh’n:
„*(2,i)“
Diese Operanden kann man auch wunderbar schateln. Ein Ausdruck
wie z.B. „4*8+10“ sähe in der polnischen Notation so aus:
„+( *(4,8) ,10)“
So kann man ganz einfach die Zeichenkette von vorne nach
hinten durcharbeiten und kann dann das „i“ jeweils durch den
aktuelle Laufindex ersetzen.

Wer will kann den Source fuer diese Variante von mir haben … Mail reicht

Gruss Jens

Hi Jens,

Am einfachsten ist es, den Ausdruck zunaechst in eine ander
Darstellungsart zu bringen: Nennt die polnische Notation.
Dabei wird erst der Operator ( bei dir das „*“) und dann die
Operanden angegeben. Dein Beispiel würde dann z.B. so
ausseh’n:
„*(2,i)“
Diese Operanden kann man auch wunderbar schateln. Ein Ausdruck
wie z.B. „4*8+10“ sähe in der polnischen Notation so aus:
„+( *(4,8) ,10)“
So kann man ganz einfach die Zeichenkette von vorne nach
hinten durcharbeiten und kann dann das „i“ jeweils durch den
aktuelle Laufindex ersetzen.

Hmm, daran hatte ich noch nicht gedacht. Die Polnische Notation … ich fuehl mich so in meinen Informatik-Grundkurs zurueckversetzt :wink:

Allerdings ist mir das ein bisschen umstaendlich, da ich ziemlich lange Ausdruecke zu summieren habe, die so schon unhandlich genug sind und ich sie nicht nochmal umstricken will.

Gibt es nicht eine Moeglichkeit den Parameter Laufvariable „i“ in „2*i“ durch Zahlen zu ersetzen. In Perl wuerde ich i als symbolische Variable, also als Variable fuer einen Variablennamen ansetzen und den Ausdruck „eval“-uieren.

Geht das irgendwie mit VB (vielleicht ueber Typdeklaration
als Variant oder mit Stringersetzungen), wenn doch selbst moderne Taschenrechner solche Summen ohne Polnische Notation
berechnen koennen?

Schon mal danke fuer die Bemuehung,

-Andreas.

Hi Thomas,

vielleicht sollte ich einen der echten Ausdruecke als Bsp. bringen (nicht erschrecken :wink: ):

Formel:

P(tW\>0) \* exp(-s\*t/h) \* SUMME(z,i,i=0..100)

in Excel:

=$N3\*EXP(-$D$5\*$P3/$D$3)\*ADVSUM(z,i,0,100)

Die Faktoren (wie P(tW>0)) stehen fertig ausgerechnet
im Arbeitsblatt und werden als Zellbezuege ($N3) in die Formel eingesetzt.

Die gesuchte Funktion ADVSUM sollte nun den Ausdruck z=

( 1-r^(m-i) / (1-r^m) \* ( (s\*t/h)^i ) / i! )

bzw. in Excel:

=1-POTENCIA($D$7;$F4-"i")/(1-POTENCIA($D$7;"i") \* (POTENCIA( ($D$5\*$P4/$D$3);$H4)/FACT("i")))

von i=0…100 summieren koennen …

Hast Du da eine Idee (siehe auch meine 2. Antwort) ???

Ich bin mir nicht sicher, ob ich Deine Vorstellungen ganz
durchblicke, aber warum soll die Laufvariable Teil des Aufrufs
sein? Normalerweise ist die Laufvariable eine interne Variable
der Funktion und von aussen interessiert es mich nicht, ob ich
die i, j oder otto nenne.

Mit dem Aufruf AdvSum(Multiplikator, Minimum, Maximum)
solltest Du doch dann keine Probleme haben. Das i definierst
Du innerhalb der Funktion und benutzt es in einer
For-Schleife.

Gruesse,

  • Andreas

Hallo Andreas

Wenn ich Dich richtig verstehe, dann willst Du den Parameter z im Aufruf als (beliebige) Funktion z(i) eingeben, wobei Du das i dann als Laufparameter der Summe haben willst, weswegen man der Funktion den Namen i bekanntgeben musst.

Ich fürchte, da hast Du bei VBA wenig Chancen, zumindest meine Kenntnisse reichen da nicht aus. Ich könnte mir zwar vorstellen, so etwas in C hinzukriegen, aber in VBA gibt es meines Wissens nicht die Möglichkeit, solche Meta-Parameter zu definieren und zu verwenden.

Sorry
Thomas