Nachkommastellen berechnen

Nur die Nachkommastellen berechnen

Es gibt Situationen, wo der Nachkomma-Anteil einer Zahl bzw. Ziffernfolge gebraucht wird. Gemeint ist beispielsweise bei der Zahl 3,456 das Ergebnis 0,456. Eigentlich ganz einfach, denn es gibt ja in VBA die Funktion Int(), welche den ganzzahligen Anteil einer Zahl berechnet. Im Beispiel wäre das dann 3 als Ergebnis. Und den Wert ziehe ich dann von der zu bearbeitenden Zahl ab. „Eigentlich“ heißt aber auch, dass es nicht immer stimmen muss. Und das ist auch hier der Fall. Eine solche Funktion (UDF) würde dann beispielsweise so aussehen:

Function NKA(Wert As Variant) As Double  'NachKommaAnteil
   'Führt zu fehlerhaften Ergebnissen!
   NKA = Wert - Int(Wert)
End Function

Probieren Sie es gerne einmal mit der oben genannten Zahl aus. Klappt doch! Alles klar, dann setzen Sie doch einmal ein Minuszeichen vor die Zahl: -3,456 und schauen Sie sich das Ergebnis an. Ernüchternd… Es ließe sich zwar etwas mit der Abs()-Funktion machen, aber das bedeutet unverhältnismäßig viel Aufwand.

Ich habe eine etwas umfangreichere Funktion erstellt, die auch für nicht so Geübte in Sachen Programmierung einigermaßen nachvollziehbar ist:

Function NKStellen(Wert As Variant) As Double
   Dim Rc As String, Lg As Integer, KommaPos As Integer
   Rc = CStr(Wert)
   Lg = Len(Rc)
   KommaPos = InStr(Wert, ",")
   Rc = IIf(KommaPos > 0, "0," & Right(Rc, Len(Rc) - KommaPos), 0)
   NKStellen = CDbl(Rc)
End Function

Hier wird immer der korrekte Nachkomma-Anteil einer Zahl ausgegeben, auch bei negativen Zahlen. Aber immer als positiver Wert. Wenn das nicht gewünscht ist, gibt es eine weitere Lösung, die ich etwas später darstelle. Diese (oben gezeigte) Funktion hat den Vorteil, dass ich mit einer Mini-Änderung in Zeile 6 des Codes erreichen kann, dass die Ziffern nach dem Komma ohne die führende „0,“ dargestellt werden:

Function NKStellen2(Wert As Variant) As Double
   Dim Rc As String, Lg As Integer, KommaPos As Integer
   Rc = CStr(Wert)
   Lg = Len(Rc)
   KommaPos = InStr(Wert, ",")
   Rc = IIf(KommaPos > 0, "0." & Right(Rc, Len(Rc) - KommaPos), 0)
   NKStellen2 = CDbl(Rc)
End Function

Hier wäre das Ergebnis 456 (als Zahl). Und Sie müssen schon genau hinsehen, um die Änderung zu erkennen. Innerhalb des (einzigen) Strings wurde das Komma gegen einen Punkt ausgetauscht. Kleine Ursache, große Wirkung.  💡 

Soll aber das Vorzeichen mit berücksichtigt werden, das Ergebnis also auch mit dem gleichen Vorzeichen behaftet sein, wie die Ursprungszahl bietet sich eine sehr kurze Variante mit einer recht unbekannten Funktion innerhalb der UDF an:

Function NKStellen3(Wert As Variant) As Double
   NKStellen3 = Wert - Fix(Wert)
End Function

Und das ist mein heimlicher Favorit, wenn die führende Null mit dem anschließenden Komma verwendet werden soll, also die typische Vorgabe für ein Ergebnis. Und wenn Negative Ausgangswerte einmal als positives Ergebnis dargestellt werden sollen, dann mache ich den Funktionsaufruf so: =ABS(NKStellen(A1)), wenn in A1  der auszuwertende Wert steht. Und natürlich lässt sich das auch fest in die UDF einbinden, dann ist der Aufruf natürlich ohne das umschließende ABS().

Hinweise, wie Sie eine UDF einbinden und nutzen können, finden Sie hier im Blog.

▲ nach oben …

Dieser Beitrag wurde unter Code-Schnipsel, Mit VBA/Makro, Rechnen & Zahlen abgelegt und mit , , , , verschlagwortet. Setze ein Lesezeichen auf den Permalink.