Kurzfassung — VBAs
Roundist nicht dasROUND, das Sie in einer Zelle verwenden. Es rundet eine Hälfte auf die nächste gerade Ziffer (Runden zur nächsten geraden Zahl, banker's rounding), also istRound(2.5)gleich2undRound(3.5)gleich4— Hälften gehen nicht immer nach oben. DasROUNDdes Arbeitsblatts rundet Hälften von der Null weg (2.5→3). Muss eine Makro-Summe mit dem Blatt übereinstimmen, rufen SieApplication.WorksheetFunction.Roundstatt des nativenRoundauf.
Sub RoundingIsNotWhatYouThink()
Debug.Print Round(2.5) ' 2 - Haelfte zur GERADEN Zahl, nicht 3
Debug.Print Round(3.5) ' 4 - Haelfte zur GERADEN Zahl
Debug.Print Round(2.5, 0) ' 2 - gleiche Regel mit Stellen-Argument
Debug.Print Application.WorksheetFunction.Round(2.5, 0) ' 3 - entspricht =ROUND(2.5,0)
End Sub
Round, Mod und Rnd sind drei Mathematik-Werkzeuge, die wie
ihre Verwandten auf dem Arbeitsblatt aussehen, sich aber still anders verhalten — denn VBA ist eine
universelle Programmiersprache, nicht die Tabellenkalkulation. Das Runden ist dasjenige, das Geld kostet:
Bekommen Sie die Regel falsch, driften die Summen eines Makros um einen Cent von den Zellen weg, die alle
anderen lesen.
Was Sie lernen
- Das Denkmodell — VBA-Mathematik ist keine Arbeitsblatt-Mathematik, und
Roundbeweist es - Was das Runden zur geraden Zahl ist und warum
Round(2.5)gleich2ist, während die Zelle3liefert - Der Fehler Nummer eins — eine Makro-Summe, die einen Cent vom
=ROUND()auf dem Blatt abweicht - Wie Sie das Arbeitsblatt exakt treffen, mit
Application.WorksheetFunction.Round - Warum
IntundFixabschneiden, statt zu runden, und sich bei negativen Zahlen uneinig sind
Das Denkmodell: VBA-Mathematik ist keine Arbeitsblatt-Mathematik
Sie wissen bereits, wie sich =ROUND(2.5, 0) in einer Zelle verhält — es ergibt 3. Wenn ein Makro also
zum ersten Mal 2 ausgibt, sieht das nach einem Fehler aus. Ist es nicht. VBAs Round-Funktion folgt
einer anderen, bewusst gewählten Regel, dem Runden zur nächsten geraden Zahl (banker's rounding;
formal round half to even): Sitzt eine Zahl genau auf der Hälfte, rundet sie zur nächsten geraden
Ziffer statt immer nach oben.
Debug.Print Round(0.5) ' 0 (0 ist gerade)
Debug.Print Round(1.5) ' 2 (2 ist gerade)
Debug.Print Round(2.5) ' 2 (2 ist gerade)
Debug.Print Round(3.5) ' 4 (4 ist gerade)
Beachten Sie, wie die Hälften abwechselnd nach unten, oben, unten, oben gehen. Genau darum geht es bei der Regel: Über viele Werte hinweg führt das konsequente Aufrunden von Hälften zu einer kleinen Verzerrung nach oben, und das Runden zur geraden Zahl hebt sie auf. Es ist die statistisch fairere Wahl — genau deshalb hat eine Sprache, die für allgemeine Berechnungen entworfen wurde, sie gewählt, und die Tabellenkalkulation, gebaut für alltägliches Rechnen, nicht.
Merken Sie sich einen Satz, und der Rest dieses Artikels ergibt sich von selbst: Der Funktionsname ist
derselbe, die Regel nicht. Alles Weitere ist eine Folge davon, dass Round zur geraden Zahl rundet.
Der Fehler Nummer eins: eine Summe, die einen Cent abweicht
Hier ist der Fehler, der die Leute zur Suche treibt. Ein Makro summiert Rechnungspositionen und rundet
jede auf zwei Nachkommastellen; die Gesamtsumme fällt einen Cent niedriger aus als die =ROUND(...)-Spalte,
die das Finanzteam auf dem Blatt pflegt, und nun stimmen die beiden Zahlen nicht mehr überein:
' Rundet jeden halben Cent zur geraden Zahl - driftet weg vom =ROUND() des Blatts
lineTotal = lineTotal + Round(price * qty, 2)
Jedes einzelne Round liegt höchstens einen halben Cent daneben, aber über Hunderte von Halb-Cent-Werten
ziehen das Runden zur geraden Zahl und das Runden-von-der-Null-weg des Blatts in verschiedene Richtungen,
und die Cents summieren sich. Nichts wirft einen Fehler; die Zahlen stimmen einfach nicht überein. Muss
Ihre Ausgabe eine Zelle treffen, verwenden Sie nicht VBAs Round:
' Rundet exakt wie =ROUND() auf dem Blatt - Haelfte von der Null weg
lineTotal = lineTotal + Application.WorksheetFunction.Round(price * qty, 2)
Application.WorksheetFunction.Round (Sie können auch Application.Round schreiben) ist das ROUND des
Arbeitsblatts, aus VBA aufgerufen, also rundet es Hälften von der Null weg und Ihre Summe stimmt bis auf
den Cent. Die Faustregel ist unmissverständlich: Geld und jede Zahl, die mit dem Blatt übereinstimmen
muss → WorksheetFunction.Round; das native Round bleibt für Statistik, wo das Runden zur geraden Zahl
gerade der Sinn ist.
Runden ist nicht Abschneiden: Int und Fix
Runden entscheidet, in welche Richtung ein Nachkommateil geht; manchmal wollen Sie gar keinen Nachkommateil, Sie wollen ihn abschneiden. Das ist das Abschneiden, und VBA hat zwei Funktionen dafür — die sich natürlich bei negativen Zahlen uneinig sind:
Debug.Print Int(2.7) ' 2 Fix(2.7) ' 2 - identisch bei positiven Zahlen
Debug.Print Int(-2.7) ' -3 Fix(-2.7) ' -2 - bei negativen gehen sie auseinander
Int rundet ab in Richtung minus unendlich (eine echte Abrundung, ein Floor), also ist Int(-2.7)
gleich -3. Fix rundet in Richtung Null (es lässt einfach die Nachkommastellen fallen), also ist
Fix(-2.7) gleich -2. Bei positiven Zahlen sind sie gleich; sobald eine negative auftaucht, müssen Sie
wissen, welche der beiden Sie meinten. Keine von beiden ist Round — sie sehen nie den Nachkommateil an,
um zu entscheiden, sie entfernen ihn einfach.
Es gibt in VBA auch kein eingebautes RoundUp oder RoundDown. Wenn Sie „immer auf" oder „immer ab" auf
eine Anzahl von Nachkommastellen brauchen, greifen Sie zu den Arbeitsblatt-Varianten:
Application.WorksheetFunction.RoundUp(x, 2) und RoundDown(x, 2).
Die Gleitkomma-Fußnote
Unter allem Runden lauert noch eine Überraschung: Double-Werte werden binär gespeichert, und manche
sauber aussehenden Dezimalzahlen lassen sich nicht exakt darstellen. Das klassische Beispiel ist
Round(2.675, 2), das 2.67 zurückgibt, nicht 2.68 — denn 2.675 wird in Wahrheit als 2.67499999...
gehalten, ist also gar keine echte Hälfte. Das ist kein Fehler von Round; es ist die Natur der
Gleitkommazahlen. Kommt es auf Genauigkeit bis zum Cent an, arbeiten Sie mit dem Typ Currency oder
Decimal, oder runden Sie über WorksheetFunction.Round, das gebaut ist, um diese Darstellungslücken zu
glätten.
Wann das Runden zur geraden Zahl richtig ist
Nichts davon heißt, dass VBAs Round kaputt ist — es heißt, es zielt auf eine andere Aufgabe. Berechnen
Sie einen Durchschnitt, eine statistische Auswertung oder irgendetwas, wo Tausende von Hälften ein
Ergebnis sonst nach oben verzerren würden, ist das Runden zur geraden Zahl die richtige Wahl und die
Regel des Arbeitsblatts, von der Null weg zu runden, die verzerrte. Verwenden Sie dort das native Round
mit Absicht. Der Fehler ist nicht, Round zu verwenden; er ist, es für Geld zu verwenden, das mit einer
Tabelle stimmen muss, wo die zwei Regeln still auseinanderlaufen.
Wie ExcelMaster hilft
Runden ist eine Entscheidung mit drei stillen Weggabelungen — Runden zur geraden Zahl gegen Runden von der
Null weg (natives Round gegen WorksheetFunction.Round), Runden gegen Abschneiden (Round gegen
Int/Fix, die sich dann bei negativen Zahlen uneinig sind) und ob die Gleitkommadarstellung überhaupt
eine echte Hälfte hält — und jede falsche Abzweigung scheitert leise: eine Summe einen Cent daneben, eine
negative Zahl in die falsche Richtung abgerundet, ein 2.675, das sich nicht aufrunden lässt.
ExcelMaster lässt Sie sagen, was Sie
wirklich wollen — „runde jede Position auf zwei Nachkommastellen, damit die Summe mit der ROUND-Spalte auf
dem Blatt übereinstimmt" — und wählt WorksheetFunction.Round, weil Sie stimme mit dem Blatt überein
gesagt haben, nutzt Int oder Fix bewusst, wenn Sie abschneiden meinen, und markiert die
Geld-im-Double-Falle, bevor sie Sie einen Cent kostet. Sie behalten die Arbeitsmappe und den Code.
Häufig gestellte Fragen
Warum gibt VBA Round(2.5) 2 statt 3 zurück?
Weil VBAs Round das Runden zur nächsten geraden Zahl verwendet — round half to even. Liegt ein Wert
genau auf der Hälfte, geht er zur nächsten geraden Ziffer, also ist Round(2.5) gleich 2 (2 ist gerade)
und Round(3.5) gleich 4 (4 ist gerade). Das =ROUND(2.5,0) des Arbeitsblatts verwendet eine andere
Regel, das Runden von der Null weg, das 3 ergibt. Gleicher Name, andere Regel.
Wie bringe ich VBA dazu, genau wie das Arbeitsblatt-ROUND zu runden?
Rufen Sie die Arbeitsblattfunktion aus VBA auf: Application.WorksheetFunction.Round(x, 2) (oder
Application.Round(x, 2)). Es rundet Hälften von der Null weg, genau wie =ROUND() in einer Zelle,
sodass in einem Makro berechnete Summen mit einer ROUND-Spalte auf dem Blatt übereinstimmen. Behalten
Sie das native Round für Fälle, in denen das Runden zur geraden Zahl wirklich das ist, was Sie wollen.
Wie runde ich in VBA auf 2 Nachkommastellen?
Übergeben Sie die Anzahl der Stellen als zweites Argument: Round(value, 2) für das Runden zur geraden
Zahl, oder Application.WorksheetFunction.Round(value, 2), um mit dem Blatt übereinzustimmen. Um immer
auf zwei Stellen auf- oder abzurunden, nutzen Sie WorksheetFunction.RoundUp(value, 2) oder
RoundDown(value, 2) — VBA hat kein natives RoundUp oder RoundDown.
Was ist der Unterschied zwischen Int und Fix in VBA?
Beide entfernen den Nachkommateil, aber sie sind sich bei negativen Zahlen uneinig. Int rundet ab in
Richtung minus unendlich, also ist Int(-2.7) gleich -3. Fix schneidet in Richtung Null ab, also ist
Fix(-2.7) gleich -2. Bei positiven Zahlen sind sie identisch. Keine von beiden rundet — sie verwerfen
die Nachkommastellen, statt sie anzusehen, anders als Round.
Warum ergibt Round(2.675, 2) 2.67 und nicht 2.68?
Weil sich 2.675 nicht exakt als Double speichern lässt — es wird in Wahrheit als 2.67499999...
gehalten, ist also keine echte Hälfte und rundet ab. Das ist die Gleitkommadarstellung, kein
Rundungsfehler. Für Geld nutzen Sie den Typ Currency oder Decimal, oder runden Sie über
Application.WorksheetFunction.Round.
Getestet in
Getestet in: Excel 365 (Windows 11), VBA 7.1 — zuletzt geprüft am 18.09.2026.
Verwandte Anleitungen: VBA Mod · VBA Rnd · VBA Format · VBA Number Format · VBA WorksheetFunction
