Gepostet am: Dec 08, 2013 1:7:56 AM
In Excel gibt es eine Reihe von Funktionen, mit denen man bestimmen kann, wie Zahlen gerundet werden:
Die allgemein geläufigsten sind:
Ganzzahl(Zahl) - rundet eine Zahl immer auf die nächstkleinere Ganzzahl ab
Ganzzahl(6,55) => 6
Runden(Zahl, Anzahl_der_Stellen) - runden immer anhand der angegebenen Nachkommastellen (ab- oder auf, hängt von den Nachkommastellen ab; ab 0,5 wird aufgerundet.)
Runden(6,4999999; 0) => 6
Runden(6,5000000;0) => 7
Runden(6,499;2) => 6,50
Aufrunden(Zahl, Anzahl_der_Stellen) bzw. Abrunden(Zahl, Anzahl_der_Stellen) - rundet je nach Formel auf oder ab
Das sind die Excel Funktionen, die wohl die meisten Benutzer kennen. Wie man am Beispiel von 6,5 sieht rundet Excel bei der RUNDEN Funktion kaufmännisch gem. DIN 1333. Dh.
Ist die Ziffer an der ersten wegfallenden Dezimalstelle eine 0,1,2,3 oder 4, dann wird abgerundet.
Ist die Ziffer an der ersten wegfallenden Dezimalstelle eine 5,6,7,8 oder 9, dann wird aufgerundet.
Interessanterweise, verhält sich die VBA Funktion round() hingegen anders - siehe dazu unten!
Excel kennt noch andere Rundungsfunktionen:
KÜRZEN(Zahl;Anzahl der Stellen) - Schneidet die Kommastellen der Zahl ab und gibt als Ergebnis eine Zahl zurück (entspricht dem Abrunden, sowohl bei positiven als auch bei negativen Zahlen)
FEST(Zahl; Anzahl der Stellen) - formatiert eine Zahl als Text mit einer festen Anzahl von Nachkommastellen (entspricht dem runden von Excel)
zusätzlich gibt es die Funktionen:
Untergrenze(Zahl;Schritt) - Rundet eine Zahl betragsmäßig auf das kleinste Vielfache von Schritt ab.
Untergrenze.Mathematik(Zahl;Schritt;Modus) - Rundet eine Zahl auf die nächste ganze Zahl oder auf das nächste Vielfache von Schritt ab.
Obergrenze(Zahl;Schritt) - Rundet eine Zahl betragsmäßig auf das kleinste Vielfache von Schritt auf.
Obergrenze.Mathematik(Zahl;Schritt;Modus) - Rundet eine Zahl auf die nächste ganze Zahl oder auf das nächste Vielfache von Schritt auf.
Verhalten von Untergrenze gegenüber Abrunden:
Untergrenze.Mathematik(Zahl;Schritt;1) und Untergrenze.Mathematik(Zahl;Schritt;-1) verhalten sich wie Abrunden
0,0049 => 0,004
- 0,0049 => -0,004
Untergrenze.Mathematik(Zahl;Schritt;0) und Untergrenze(Zahl;Schritt) verhalten bei positiven Zahlen identisch mit Abrunden und negativen wie Aufrunden:
0,0049 => 0,004
- 0,0049 => -0,005
Und dann gibt es noch eine Reihe von VBA Funktionen, die nochmal anderes Verhalten an den Tag legen.
Beim Runden auf ganze Zahlen, können insgesamt 11 Methoden identifiziert werden, wobei leider nicht alle in Excel verfügbar sind. Für diese habe ich die Funktionen nachprogrammiert.
siehe auch:
Das Runden in VBA und Excel unterscheidet sich insofern, dass es sich beim
Runden in Excel um kaufmännisches Runden nach DIN 1333 und [5 wird immer aufgerundet]
beim Runden in VBA um mathematisches Runden nach IEEE-754 handelt [wird so gerundet, dass die letzte beizubehaltende Ziffer gerade wird]
Da thematisch passend möchte ich noch Formeln präsentieren, die auf die Ausgabe der Nachkomma-Stellen als Zahl abzielen.
als Kommazahl oder
als Ganzzahl
VBA-Code für die VBA-Lösungen
nur die Dezimalstellen als Dezimalzahl ausgeben
Public Function Dezimalwert(myRange As Range, Optional Mode As String = "normal") As Variant Dim myZahl As Double myZahl = myRange.Value Dim myFormat As String myFormat = myRange.NumberFormat Dim Nachkommazahl As Double Nachkommazahl = myZahl - CInt(myZahl) Select Case LCase(Mode) Case "normal" Dezimalwert = Nachkommazahl Case "format" Dezimalwert = CStr(Format(Nachkommazahl, myFormat)) Case "gerundet" Dezimalwert = Round(Nachkommazahl, Len(myFormat) - 2) End SelectEnd Function
nur die Dezimalstellen als Ganzzahl ausgeben
Public Function Dezimalwert_als_Zahl(myRange As Range, Optional Mode As String = "normal") As Long If IsNumeric(myRange.Value) = True Then Dim WertString As String WertString = CStr(myRange.Value) Dim Nachkommawert As String Nachkommawert = Right(WertString, Len(WertString) - InStr(WertString, Dezimaltrennzeichen)) Select Case LCase(Mode) Case "normal" Dezimalwert_als_Zahl = Val(Nachkommawert) Case "format" Dezimalwert_als_Zahl = Left(Val(Nachkommawert), 3) / 10 Case Else If IsNumeric(CInt(Mode)) = True Then Dezimalwert_als_Zahl = Left(Val(Nachkommawert), CInt(Mode) + 1) / 10 End If End Select Else Dezimalwert_als_Zahl = 0 End IfEnd Function
Hilfsfunktionen
Hilfsfunktionen
Public Function AnzahlDargestellteNachkommastellen(myRange As Range) As Long Dim tmplength As Long tmplength = Len(myRange.NumberFormat) - 2 If tmplength < 0 Then AnzahlDargestellteNachkommastellen = 0 Else AnzahlDargestellteNachkommastellen = tmplength End IfEnd FunctionPublic Function Dezimaltrennzeichen() As String Dezimaltrennzeichen = Application.DecimalSeparator End Function
abweichende Rundung
In der
Links: