Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: VBA prüfen, ob Zahl eine Null hinterm Komma hat

VBA prüfen, ob Zahl eine Null hinterm Komma hat
16.05.2013 11:42:28
KLE
Hi,
...stehe irgendwie mal wieder auf dem Schlauch und brauche eure Hilfe!
Folgendes:
Möchte per VBA prüfen, ob eine Zahl eine glatte Zahl ist, d.h. keine Kommastelle aufweist.
Zahl = i * b
If Zahl = "komma null/also glatt" then...
Else goto weiter...
Vielen Dank für Eure schnelle Hilfe!
KLE

Anzeige

15
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA prüfen, ob Zahl eine Null hinterm Komma hat
16.05.2013 11:44:41
Hajo_Zi
If cint(Zahl)=Zahl Then

besser nicht mit CInt
16.05.2013 11:53:03
Erich
Hi Hajo,
CInt produziert schnell einen Überlauf. Fix oder Int sind da besser:

Sub aTest()
Dim zahl As Double
zahl = 33333
'   If zahl = Fix(zahl) Then
'oder
If zahl = Int(zahl) Then
MsgBox "glatt"
Else
MsgBox "nicht glatt"
End If
If zahl = CInt(zahl) Then   ' Überlauf!
MsgBox "glatt"
End If
End Sub
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich

Anzeige
Danke, perfekt - geht es auch mit...
16.05.2013 12:03:39
KLE
Vielen Dank für die schnelle Antwort!
Geht es auch mit einer Überprüfung auf 10 Cent-Schritten?
Hintergrund:
Ich soll für Cheffe eine Kalkulation ermitteln, die auf Brutto-VK-Zahlen beruht, die "glatt" sind.
Nun, will er aber doch mal in 10 Cent-Schritten, die Werte sehen.
Wie kann man das prüfen?
Also wenn i * 1,19 = auf ...,10 oder ,20 etc. endet, soll die Zahl wiedergeben werden in einer Tabelle.
Wie prüfe ich auf Nachkommastellen?
Gruß und Danke für die schnelle Hilfe!
KLE

Anzeige
x10 x100 x1000... Schulmathe! (owT)
16.05.2013 12:08:48
EtoPHG

AW: Danke, perfekt - geht es auch mit...
16.05.2013 12:11:37
Klaus
Hallo KLE,
wenn 10-cent, ist die letzte Zahl 0 (beim Format 0.00)
if VBA.Right(Format(i, "0.00"), 1) = 0 then
msgbox("10-cent")
else
msgbox("nicht 10-cent")
end if
Grüße,
Klaus M.vdT.

Jepp, vielen Dank! ... genau was ich brauchte! o.T
16.05.2013 12:28:40
KLE

Anzeige
Danke für die RÜ! Aber ...
16.05.2013 12:39:09
Klaus
... mit *10 müsste es genauso gut gehen.

Prüfung auf glatte 0,10er
16.05.2013 12:19:23
Erich
Hi,
das würde ich mit
If 10 * zahl = Fix(10 * zahl) Then
prüfen.
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich

Klappte nich so gut, lies einige aus?
16.05.2013 12:34:44
KLE
Hi Erich,
hatte folgende Lösung genutzt:
Option Explicit
Dim zahl As Double
Dim i As Double
Dim a As Double
Sub test()
a = 1
zahl = 0
With Worksheets("Tabelle1")
For i = 1 To 20000
zahl = i - (i * 0.19)
' Version von Klaus
If VBA.Right(Format(zahl, "0.00"), 1) = 0 Then
a = a + 1
Cells(a, 2).Value = zahl
Cells(a, 3).Value = i * 0.19
Cells(a, 4).Value = zahl + (i * 0.19)
End If
' andere Formel von Erich
If 10 * zahl = Fix(10 * zahl) Then
Cells(a, 5).Value = zahl
End If
Next i
End With
End Sub
dabei stellte sich heraus, dass nicht alle Werte angezeigt wurden. Daher nutze ich die Version von KLaus.
Danke aber, werde mich mit der FIX-Anweisung mal in Ruhe auseinandersetzen...
Gruß
KLE

Anzeige
Unterschied
16.05.2013 12:55:08
Erich
Hi,
zwischen Klaus' und meinem Vorschlag gibt es einen großen Unterschied.
Mein Fix(10 * zahl)-Vorschlag erkennt 5,004 oder 5,697 nicht als glatte 0,10er an,
bei Klaus werde diese Zahlen als glatt erkannt.
Das liegt daran, dass Format(i, "0.00") das i auf 2 Nachkommastellen rundet.
Aus 5,004 oder 5,697 wird 5,00 oder 5,70 - und das sind dann glatte 0,10er.
Aufgabe war: "Also wenn i * 1,19 = auf ...,10 oder ,20 etc. endet, ..."
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich

Anzeige
Unterschied erkannt - Danke,,,
16.05.2013 13:26:54
KLE
Hallo Erich,
danke für die Erklärung. Nun, da es für uns relevant ist, was auch an der 3 oder 4'ten Stelle nach dem Komma steht (da es um milli-Einheiten geht, die Summiert werden) ist Deine Version definitiv die bessere Version am Ende. "Für die einfache Art mit nur 2 Kommastellen gerundet, wäre die Von Klaus auch OK gewesen. Unser CHeffe mag aber eher Deine Version, da es über alles einige hundert Euro ausmachen kann."
Danke für die Hilfe - habe heut wieder dank Dir etwas gelernt ;o)
Gruß
KLE

Anzeige
war doch noch nix...
16.05.2013 13:51:07
Erich
Hi,
auch wenn es deinem Cheffe nun schon gefallen hat - mein Fix-Vorschlag ist so oft falsch. :-(
Das liegt daran, dass z. B. für i=10
zahl = i - (i * 0.19)
aufgrund der notwendigerweise ungenauen Darstellung von Gleitkommazahlen nicht exakt
zahl = 10 - (10 * 0.19) = 8,1 ist, sondern vielleicht aucn mal
zahl = 8,0999999999999999995 oder
zahl = 8,1000000000000000003
Im Fall zahl = 8,0999999999999999995 schneidet Fix 10*zahl auf 80 ab - und die 8,1 fehlt in deiner Liste.
Um das zu verhindern, kann man 10*zahl auf viele Nachkommastellen runden. Dann ist die Prüfung:
If 10 * zahl = Fix(Application.Round(10 * zahl, 10)) Then
Da bei dir jetzt gerade keine Cent-Bruchteile vormkommen, stimmen Klaus' und meine neue Liste überein. :-)
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich

Anzeige
ist das nicht rein akademisch?
16.05.2013 13:57:54
Klaus
Hallo Erich,
und wenn ich zu viele Nachkommastellen habe, gibt es irgendwann einen Fliesskommafehler. Beim Pentium1 halt früher als auf anderen Maschinen :-)
Wenn jemand wirklich mit laaaangen Nachkommazahlen hantierten muss, gibt es geeinetere Programme als Excel (zB Matlab?). Und bei der Frage "€ gerundet auf 0,10" mit 10 Nachkommastellen zu argumentieren erscheint mir doch eher von akademischem Interesse zu sein.
Grüße,
Klaus M.vdT.

Anzeige
gar nicht akademisch!
16.05.2013 14:10:30
Erich
Hi Klaus,
dass der Fall auftritt - auch wenn man nur mit 2 Nachkommastellen arbeitet wie KLE - sieht man daran,
dass in KLEs Liste mit meiner Bedingung Werte ausgeschlossen werden, die eigentlich stimmen.
Sieh dir nochmal mein Beispiel mit i=10 an.
Da entschied ich tatsächlich mit
zahl = 10 - (10 * 0.19) nur ungefähr = 8,1
so:
10 * zahl = Fix(10 * zahl)
     81      = Fix(8,0999999999999999995)
     81      = 80
Fix ist hart und böse! :-(
Und das passierte für viele Werte von i...
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich

Anzeige
nix mit Fix
18.05.2013 13:21:26
Erich
Hi,
irgendwie war ich in dieser Frage fixiert auf das Fix...
Nun mal völlig losgelöst (in meiner zweiten Version):

Option Explicit
Sub test()
Dim zahl As Double
Dim i As Long     ' nicht Double
Dim a As Long     ' nicht Double
a = 1
zahl = 0
With Worksheets("Tabelle1")
For i = 0 To 2000
zahl = i - (i * 0.19)
If VBA.Right(Format(zahl, "0.00"), 1) = 0 Or _
10 * zahl = Fix(10 * zahl) Or _
IstGlatt(zahl, 1) Then
a = a + 1
Cells(a, 1) = i
Cells(a, 2) = zahl
' Version von Klaus
If VBA.Right(Format(zahl, "0.00"), 1) = 0 Then Cells(a, 3) = "K"
' erste Version von Erich - da fehlen viele Werte
If 10 * zahl = Fix(10 * zahl) Then Cells(a, 4) = "E1"
' zweite Version von Erich - Ergebnis wie bei Klaus
If IstGlatt(zahl, 1) Then Cells(a, 5) = "E2"
End If
Next i
End With
End Sub
Function IstGleich(dZahl1 As Double, dZahl2 As Double) As Boolean
IstGleich = Abs(dZahl1 - dZahl2) 
i und a sollte man nicht als Double, sondern als Long deklarieren.
Schleifenzähler und Zeilennummern sind nicht double.
Die Funktionen IstGleich() und IstGlatt() können auch in Formeln im Tabellenblatt verwendet werden.
IstGlatt() bekommt als Parameter die zu testende Zahl und die (evtl. auch negative) Anzahl Nachkommastellen,
z. B ist IstGlatt(123.45, 1) = False (123.45 ist keine glatte 0,10er Zahl)
IstGleich(x, y) ergibt, ob zwei Double-Zahlen als gleich angesehen werden können oder nicht.
Dass das keineswegs trivial ist, zeigt sich in dieser Mappe:
https://www.herber.de/bbs/user/85389.xls
Schöne Pfingsten allerseits!
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich
Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige

Infobox / Tutorial

VBA: Überprüfung auf glatte Zahlen und Nachkommastellen


Schritt-für-Schritt-Anleitung

Um in Excel VBA zu prüfen, ob eine Zahl eine Null hinter dem Komma hat, kannst du folgende Schritte befolgen:

  1. Öffne Excel und drücke ALT + F11, um den VBA-Editor zu starten.
  2. Erstelle ein neues Modul, indem du im Menü Einfügen auf Modul klickst.
  3. Füge den folgenden Code ein:
Sub CheckIfGlatt()
    Dim zahl As Double
    zahl = 10.0 ' Beispielzahl

    If zahl = Int(zahl) Then
        MsgBox "Die Zahl ist glatt."
    Else
        MsgBox "Die Zahl ist nicht glatt."
    End If
End Sub
  1. Ändere die Variable zahl, um verschiedene Werte zu testen.
  2. Führe das Skript aus, um die Ergebnisse in einer MessageBox zu sehen.

Häufige Fehler und Lösungen

  • Fehler: Überlauf bei der Verwendung von CInt.

    • Lösung: Verwende Int oder Fix, um die Zahl ohne Überlauf zu überprüfen.
  • Fehler: Gleitkomma-Fehler bei Berechnungen.

    • Lösung: Runden der Werte vor der Prüfung kann helfen, z.B. If 10 * zahl = Fix(Application.Round(10 * zahl, 10)).
  • Fehler: Falsche Ergebnisse bei der Prüfung auf 10-Cent-Schritte.

    • Lösung: Verwende VBA.Right(Format(i, "0.00"), 1) = 0 für eine präzisere Prüfung.

Alternative Methoden

Wenn du eine flexiblere Prüfung auf Nachkommastellen benötigst, kannst du auch folgende Methoden verwenden:

  1. Verwendung von Funktionen:
    • Du kannst eine benutzerdefinierte Funktion erstellen, um die Prüfung auf glatte Zahlen durchzuführen. Beispiel:
Function IstGlatt(dZahl As Double, Nachkommastellen As Long) As Boolean
    IstGlatt = Abs(dZahl - Int(dZahl * 10 ^ Nachkommastellen) / 10 ^ Nachkommastellen) < 0.00001
End Function
  1. Excel-Formeln:
    • Du kannst auch Excel-Formeln in Kombination mit VBA verwenden, um die Nachkommastellen zu prüfen.

Praktische Beispiele

Hier sind einige praktische Beispiele zur Verwendung von VBA zur Prüfung von Zahlen:

  • Prüfung auf glatte Zahlen:
Sub CheckGlatt()
    Dim zahl As Double
    For zahl = 0 To 10 Step 0.1
        If Int(zahl) = zahl Then
            Debug.Print zahl & " ist glatt."
        Else
            Debug.Print zahl & " ist nicht glatt."
        End If
    Next zahl
End Sub
  • Prüfung auf 10-Cent-Schritte:
Sub CheckTenCent()
    Dim zahl As Double
    zahl = 1.20 ' Beispielzahl
    If VBA.Right(Format(zahl, "0.00"), 1) = "0" Then
        MsgBox "Die Zahl endet auf 0.10, 0.20 usw."
    End If
End Sub

Tipps für Profis

  • Verwende bei der Arbeit mit großen Zahlen Double anstelle von Integer, um Überläufe zu vermeiden.
  • Achte darauf, Gleitkomma-Fehler zu berücksichtigen, wenn du Berechnungen mit vielen Nachkommastellen durchführst.
  • Nutze die Application.Round-Funktion, um präzise Ergebnisse bei der Prüfung auf Nachkommastellen zu erhalten.

FAQ: Häufige Fragen

1. Wie kann ich in VBA prüfen, ob eine Zahl eine Null nach dem Komma hat? Du kannst die Int- oder Fix-Funktion verwenden, um zu überprüfen, ob eine Zahl eine glatte Zahl ist.

2. Was ist der Unterschied zwischen Int und Fix in VBA? Int rundet die Zahl nach unten, während Fix die Ganzzahl ohne Rundung zurückgibt.

3. Wie kann ich in Excel eine Zahl auf 10-Cent-Schritte prüfen? Verwende die Funktion VBA.Right(Format(i, "0.00"), 1) = "0" für eine einfache Prüfung auf 10-Cent-Schritte.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige