Rechnen in VBA, geht das überhaupt?

Hallo Leute,

ich habe ein Riesenproblem:
ich habe in drei Textboxen je eine Zahl stehen (Eurobetrag), wo ich prüfen muß, ob die Summe der Zahlen aus Textbox1 und Textbox2 gleich ist der Zahl in Textbox 3.

Dazu muß ich zunächst die Zahlen aus den beiden Textboxen addieren.
Textbox1=„88,40“ Textbox2=„0,00“ Textbox3=„88,40“

Da ich die Zahlen als String nicht addieren kann, habe ich über „Replace“ das Komma zum Punkt gemacht und über „Val“ eine Dezimalzahl (a1, a2, a3) erstellt. Damit ist a1=88,4, a2=0, a3=88,4.
Die Variablen habe ich als Single deklarier, Variant habe ich auch ausprobiert.
Die Addition a1 = a1 + a2 wird nun mit a3 verglichen: if a1 = a3. Das Ergebnis ist false.

Verstehe ich nicht! Ich habe dann die jetzt ausgerechnete Summe a1 von a3 abgezogen: if (a1-a3) = 0. Dieses Ergebnis ist ebenfalls false, weil die Differenz 2,3456E-14 beträgt und somit nicht Null ist.

Dazu habe ich dann gefragt if Abs(a1 - a3) < 0,001 was wegen des Kommas zum Syntaxerror führte.
Wenn ich 0.001 schreibe, geht der Vergleich daneben, weil (a1 - a3) Zahlen mit Komma sind!

HILFE, wer holt mich hier raus?

Gruß
Pauli

Hallo!

Das ist so völlig normal, weil der Computer im Binärsystem rechnet, und sich „Komma-Zahlen“ im Dezimalsystem meist nicht ohne Rundung umrechnen lassen. Die Lösung für das Problem nennst du selbst.

Das müßtest du mal genauer erklären. Zeig mal deinen Code, und was daran „daneben“ geht!

Hallo Pauli

Versuche es mal so:

Sub test1()
Textbox1 = "88,40"
TextBox2 = "0,00"
Textbox3 = "88,40"
tb1 = CCur(Textbox1)
tb2 = CCur(TextBox2)
tb3 = CCur(Textbox3)
tt1 = tb1 + tb2
If tt1 = tb3 Then
    MsgBox "wahr"
Else
    MsgBox "falsch - Diff. = " & tt1 - tb3
End If
End Sub

Das Dumme ist: Ich kann dieses Makro nicht testen, weil wir in der Schweiz als Dezimaltrennzeichen den Dezimalpunkt verwenden, nicht das Dezimalkomma.
Niclaus

Moin,

Replace ist überflüssig, die Textfelder müssen in Zahlen konvertiert werden. Schreib

    TextBox3 = CDbl(TextBox1.Value) + CDbl(TextBox2.Value)

Gruß
Ralf

Hi Niclaus,

über die Ländereinstellung „DE“ von Windows sollte sich das regeln lassen.

Gruß
Ralf

Hallo Ralf,

genau das ist die Lösung, herzlichen Dank.
Die Zahl, die dann in der Variablen steht, ist dann z.B. 88,4. Mit einer weiteren Variablen kann ich dann prima rechnen. Ist diese weitere Variable z.B. auch 88,4 und frage ich, ob die Differenz Null ist, muß ich allerdings nach <0.001 fragen, was kurioserweise nur mit dem Punkt funktioniert.

Das Problem ist zumindest gelöst und auf die Zwischenlösung mit den Zellen kann ich verzichten.
Gruß
Pauli

Diese Differenz von 0.001 bzw. das „=“ nicht funktioniert daran, dass sich in Single / Double oder allgemein Gleitkommazahlen nicht jede beliebige Zahl darstellen lässt und dass daher eben die Differenz nicht 0 ist, wenn du die subtrahierst. Wenn du zur Anzeige auf 2 Stellen rundest, siehst du davon aber nichts, das z.B. 88,40 als 88,39991239234 gespeichert wird.

Umgehen kannst du das Ganze, wenn du grundsätzlich mit ganzen Zahlen (dann eben in Cent) rechnest und vor der Ausgabe ggfs. wieder in Euro umrechnest.