Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1312to1316
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

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

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

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

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

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.

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

48 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige