Rechnen mit Vba in Excel über 15 Stellen

In einem anderen Forum fand ich folgendes Skript:

Public Function SummePlus(Zahl1, Optional Zahl2) As String Dim aTemp Dim x As Variant, y As Variant Dim i As Long, j As Long

If IsArray(Zahl1) Then
aTemp = Zahl1
For i = 1 To UBound(aTemp, 1)
For j = 1 To UBound(aTemp, 2)
If IsNumeric(aTemp(i, j)) Then
x = x + CDec(aTemp(i, j))
End If
Next j
Next i
Else
x = CDec(Zahl1)
End If
If Not IsMissing(Zahl2) Then
If IsArray(Zahl2) Then
aTemp = Zahl2
For i = 1 To UBound(aTemp, 1)
For j = 1 To UBound(aTemp, 2)
If IsNumeric(aTemp(i, j)) Then
y = y + CDec(aTemp(i, j))
End If
Next j
Next i
Else
y = CDec(Zahl2)
End If
x = x + y
End If
SummePlus = x
End Function

Probleme:
•Excel meint, dass in der ersten Zeile ein Fehler ist,
•Ich bräuchte dass mit multiplikation

Vielen Dank im Vorraus

Hi Bioniker,

Excel meint das vollkommen zu Recht, denn bei so einer mieserablen Formatierung würde ich auch streiken. Schreib das Ganze so:

Public Function SummePlus(Zahl1, Optional Zahl2) As String

Dim aTemp
Dim x As Variant, y As Variant
Dim i As Long, j As Long

If IsArray(Zahl1) Then
aTemp = Zahl1
For i = 1 To UBound(aTemp, 1)
For j = 1 To UBound(aTemp, 2)
If IsNumeric(aTemp(i, j)) Then x = x + CDec(aTemp(i, j))
Next j
Next i
Else
x = CDec(Zahl1)
End If

If Not IsMissing(Zahl2) Then
If IsArray(Zahl2) Then
aTemp = Zahl2
For i = 1 To UBound(aTemp, 1)
For j = 1 To UBound(aTemp, 2)
If IsNumeric(aTemp(i, j)) Then
y = y + CDec(aTemp(i, j))
End If
Next j
Next i
Else
y = CDec(Zahl2)
End If
x = x + y
End If

SummePlus = x
End Function

und schon hört Excel auf mit ‚meinen‘… :smile:
Ich hab jetzt die Funktion nicht auf Richtigkeit überprüft, nur sichergestellt, dass die Fehleranzeige durch Excel unterbleibt.
Wenn Du das noch für die Multiplikation brauchst, benenne die Funktion entsprechend um (und ersetze die letzte Zeile
„SummePlus = x“ durch „NeuerFunktionsname = x“ und überall wo x = steht ersetze das Additionszeichen durch ein Multiplikationszeichen.

Viel Erfolg!

Hallo Bioniker,

dafür reichen meine VBA-Kenntnisse leider nicht aus.

Gruß Hugo

Hallo
Ja, das sehe ich auch schon so. Diesen Rattenschwanz musst Du mal trennen.

Von:
Public Function SummePlus(Zahl1, Optional Zahl2) As String Dim aTemp Dim x As Variant, y As Variant Dim i As Long, j As Long

Nach:
Public Function SummePlus(Zahl1, Optional Zahl2) As String
Dim aTemp
Dim x As Variant, y As Variant
Dim i As Long, j As Long

Weiter hast Du im Deklarationsbereich das Problem:
Ändere von:
Public Function SummePlus(Zahl1, Optional Zahl2) As String

Nach:
Public Function SummePlus(Zahl1 as double, Optional Zahl2 as double) As String

So damit kannst Du zwei Werte der Funktion übergeben, die dann einen Text zurück gibt. Am ende Der Funktion gibst Da aber X as Variant und nucht as String zurück.

Irgendwie machst Du da ja eine Addition mit zwei Variant. meine frage, warum nicht mit zwei Decimal oder Double? Denn x und y erhalten jeweils ein Dezimalwert mit CDec. kannst Sie ja als Dec deklariren, dann geht die Rechnung möglicherweise nicht Flöte. Für genaue berechnungen nimmst Du eh am besten die Double Variable.

Zum Thema Zahl1. ist diese jetzt einen Array oder keinen?

Die Multiplikation ist einfach ein *

Grüsse Sebastian

probiers hier mit

Public Function SummePlus(Zahl1, Optional Zahl2) As String

Dim aTemp
Dim x As Variant, y As Variant
Dim i As Long, j As Long

If IsArray(Zahl1) Then
aTemp = Zahl1
For i = 1 To UBound(aTemp, 1)
For j = 1 To UBound(aTemp, 2)
If IsNumeric(aTemp(i, j)) Then
x = x + CDec(aTemp(i, j))
End If
Next j
Next i
Else
x = CDec(Zahl1)
End If
If Not IsMissing(Zahl2) Then
If IsArray(Zahl2) Then
aTemp = Zahl2
For i = 1 To UBound(aTemp, 1)
For j = 1 To UBound(aTemp, 2)
If IsNumeric(aTemp(i, j)) Then
y = y + CDec(aTemp(i, j))
End If
Next j
Next i
Else
y = CDec(Zahl2)
End If
x = x + y
End If
SummePlus = x
End Function

Hallo,

ehrlich gesagt, ich habe den Code ausprobiert und steige nicht dahinter wie er mit einem Array umgeht, ich arbeite allerdings auch nie mit Arrays.

Die erste Zeile ist fehlerhaft, weil einige Zeilenumbrüche fehlen.

Public Function SummePlus(Zahl1, Optional Zahl2) As String

Dim aTemp

Dim x As Variant, y As Variant Dim i As Long, j As Long

Mit diesen Umbrüchen sollte es gehen.

Versuche mal die Zeile x = x + y zu ersezen durch
x = x * y.

Bin mir aber nicht sicher, ob das so schon ausreicht!

VG
KarinAndrea

Grüezi Bioniker

Ich kann dir hier ein AddIn empfehlen, das ie Berechnung langer Zahlen mit Excel-VBA beherrscht:

http://www.rendar.de/lzr.htm

Mit freundlichen Grüssen

Thomas Ramel

  • MVP für MS-Excel -

1.)
Die ersten Zeilen wie folgt abändern
Public Function SummePlus(Zahl1, Optional Zahl2) As String

Dim aTemp
Dim x As Variant, y As Variant
Dim i As Long, j As Long

2.)
-Funktionsname ändern in z.B ProduktMal
-Nach der Dimensionierung von x und y diesen den Wert 1 zuordnen
X=1
y=1

-Die Zeilen
x = x + CDec(aTemp(i, j))
y = y + CDec(aTemp(i, j))
x = x + y
SummePlus = x
umändern in
x = x * CDec(aTemp(i, j))
y = y * CDec(aTemp(i, j))
x = x * y
ProduktMal = x

Gruß Soleikum

Nachtrag:
Selbiges geht mit den Exelfunktionen Summe und Produkt

mfG

Hallo Bioniker YL,

die Dim-Anweisungen müssen jeweils in einer eigenen Zeile stehen.

Public Function SummePlus(Zahl1, Optional Zahl2) As String 
 Dim aTemp 
 Dim x As Variant, y As Variant 
 Dim i As Long, j As Long

Ansonsten befasse ich mich mich nicht mit der Rechengenauigkeit von 15 signifikanten Stellen in Excel.

Gruß
Franz

Hallo,

naja - DU solltest schon jedes „DIM“ in einer neuen Zeile beginnen - dann klappt’s auch…

Gruß,
Ptonka

Hallo Bioniker YL,

Wie lautet nun die genaue Aufgabenstellung/Frage?
Welche 15 Stellen meinst Du? Vor oder nach dem Komma.

Die Verwendung des Datentyps Double sollte eigentlich für (fast) alles ausreichen:
Double # 8 Bytes -1,79769313486232E308 bis -4,94065645841247E-324 für negative Werte
4,94065645841247E-324 bis 1,79769313486232E308 für positive Werte
(siehe http://www.vbarchiv.net/commands/cmd_datentypen.html)

Kannst Du eine Beispiel-Aufgabe inkl. gewünschtes Ergebnis liefern?
Dann kann man das zumindest mal testen.

Die 1. Zeile (copy&paste) liefert keine Zeilenumbrüche, so dass die Funktions-Deklaration nicht korrekt ist. Vielleicht ist das bei Dir ja auch der Fehler.

So muss es aussehen:
Zeile 1:
Public Function SummePlus(Zahl1, Optional Zahl2) As String

Zeile 2:
Dim aTemp

Zeile 3:
Dim x As Variant, y As Variant

Zeile 4:
Dim i As Long, j As Long

If IsArray…

Gruß
Harry