Excel 2010 VBA Makro Nachkommastelle lässt sich nicht richtig ermitteln

Triggerfish

Stammgast
Hallo zusammen

Ich habe eine Liste von Werten, deren Nachkommastelle ich überprüfen will.
Es ist eine einfache "IF"-Abfrage. Solange die Nachkommastelle = 0 ist, wird anders verfahren.

Dazu habe ich den folgenden Code geschrieben:

Code:
        owert = Range("A" & t).Value
        iwert = Int(Range("A" & t).Value)
        nachkommastelle = owert - iwert

        If nachkommastelle = 0 Then

        ...

Damit habe ich aber merkwürdige Probleme. Bei der ersten Abfrage funktioniert alles.

1. Abfrage:
owert= 426.0
iwert= 426


Dann kommen die Abfragen 2 bis 7, die auch alle richtig funktionieren.

2.-7. Muster der Abfragen an Hand der dritten:
owert = 426.3
iwert = 426


8. Abfrage:
owert= 427.0
iwert = 426 (!)


Es scheint so also nicht zu funktionieren.
Hat jemand einen Tipp? Ich sehe wohl den berühmten Wald vor lauter Bäumen nicht mehr...

Vielen Dank im Voraus.

Lieber Gruss
Triggerfish
 

Nebuk

PCtipp-Moderation
Teammitglied
Hast du mal den Code im Debugger durchlaufen lassen?

Kann es sein, dass eine Variable nicht zurückgesetzt wird und noch der letzte Wert darin gespeichert ist Versuch mal testweise die Werte
1. Abfrage:
owert= 426.0
iwert= 426

2. Abfrage:
owert= 427.0
iwert= 427

gleich nacheinander durchlaufen zu lassen. Falls es funktioniert mal mit dem Muster 426.0, 427.0, 427.3, 428.0 testen.
 

weer

Stammgast
Hallo Triggerfish

Ohne "Dimensionierung" rechnet Excel oft nicht nach Adam Riese.

Ich habe z. B. mit Deinem Makro für owert = 428.3 folgenden Wert erhalten für nachkommastelle:
0.300000000000011

Versuch doch mal, Deine Variablen zu "dimensionieren". Das hilft oft. - Also:

Code:
Dim owert, iwert, nachkommastelle As Integer

owert = Range("A" & t).Value
iwert = Int(Range("A" & t).Value)
nachkommastelle = owert - iwert

As Integer: Wenn es sich um Zahlen im Bereich von -32.768 bis +32.767 handelt. Oder:
As Long: Wenn es sich um Zahlen im Bereich von -2.147.483.648 bis +2.147.483.647 handelt.

Sagst Du uns, ob das zu einem "besseren" Resultat führt.

Grüsse Niclaus
 
Zuletzt bearbeitet:

Triggerfish

Stammgast
Hallo zusammen

Vielen Dank für die schnellen Antworten!
Ich verstehe es aber immer noch nicht.
Die Vorschläge habe ich ausprobiert.
Es scheint aber wirklich so, dass nach der ersten Zahl mit Nachkommastelle, die Werte der Variablen nicht mehr richtig aktualisiert werden. Nachfolgend einmal meine Beispiele:

Spalte A

Code:
0.0
4.0
8.0
12.0
16.0
20.0
24.0
28.0
32.0
36.0
40.0
44.0
48.0
52.0
56.0
60.0
64.0
68.0
72.0
76.0
80.0
84.0
88.0
92.0
96.0
100.0
104.0
108.0
112.0
116.0
120.0
124.0
128.0
132.0
164.0
166.0
168.0
170.0
172.0
174.0
178.0
182.0
186.0
190.0
194.0
198.0
202.0
206.0
210.0
214.0
218.0
222.0
226.0
230.0
234.0
238.0
242.0
246.0
250.0
254.0
256.0
258.0
260.0
262.0
264.0
266.0
268.0
270.0
274.0
278.0
282.0
286.0
290.0
294.0
298.0
302.0
306.0
310.0
314.0
318.0
322.0
326.0
330.0
334.0
338.0
342.0
346.0
350.0
354.0
358.0
362.0
366.0
370.0
374.0
378.0
382.0
386.0
390.0
394.0
398.0
402.0
406.0
410.0
414.0
418.0
422.0
426.0
427.0
428.0
426.3
426.4
426.5
426.6
426.7
427.0
427.1
427.2
427.3
427.4
427.5
427.6
427.7
428.0
Spalte C:
Code:
REAL
REAL
REAL
REAL
REAL
REAL
REAL
REAL
REAL
REAL
REAL
REAL
REAL
REAL
REAL
REAL
REAL
REAL
REAL
REAL
REAL
REAL
REAL
REAL
REAL
REAL
REAL
REAL
REAL
REAL
REAL
REAL
REAL
STRING[30]
INT
BYTE
INT
BYTE
DATE
TIME_OF_DAY
REAL
REAL
REAL
REAL
REAL
REAL
REAL
REAL
REAL
REAL
REAL
REAL
REAL
REAL
REAL
REAL
REAL
REAL
REAL
INT
BYTE
INT
BYTE
INT
BYTE
INT
BYTE
REAL
REAL
REAL
REAL
REAL
REAL
REAL
REAL
REAL
REAL
REAL
REAL
REAL
REAL
REAL
REAL
REAL
REAL
REAL
REAL
REAL
REAL
REAL
REAL
REAL
REAL
REAL
REAL
REAL
REAL
REAL
REAL
REAL
REAL
REAL
REAL
REAL
REAL
REAL
BOOL
BOOL
BOOL
BOOL
BOOL
BOOL
BOOL
BOOL
BOOL
BOOL
BOOL
BOOL
BOOL
BOOL
BOOL
BOOL
BOOL

Die restlichen Spalten sind für den Teil nicht relevant.

Das komplette Makro:
Code:
Public Sub T4_Zusammensetzen_Adressen()

'** Ermittlung der letzten Zeile in Spalte A
lz = Cells(Rows.Count, 1).End(xlUp).Rows.Row

'**Dimensionierung
Dim owert, nachkommastelle As Double
Dim iwert As Integer

'** Durchlauf aller Zeilen
For t = 1 To lz

    If Range("C" & t).Value = "BOOL" Then
        owert = Range("A" & t).Value
        iwert = Int(Range("A" & t).Value)
        nachkommastelle = owert - iwert
      
          If nachkommastelle = 0 Then
            Range("F" & t).Value = "DB10.DBX." & Range("A" & t).Value & ".0" & ":" & Range("C" & t)
          Else
            Range("F" & t).Value = "DB10.DBX." & Range("A" & t).Value & ":" & Range("C" & t)
          End If
        
    Else
        Range("F" & t).Value = "DB10.DBD." & Range("A" & t).Value & ":" & Range("C" & t)
    End If
        

Next t

End Sub

@weer
Für Fliesskommazahlen habe ich aber einen Double definiert. Die Integer sind ja für Ganzzahlen, oder?

Ich verstehe es wirklich nicht.

Gruss
Triggerfish
 

weer

Stammgast
Ich verstehe es aber immer noch nicht.
Die Vorschläge habe ich ausprobiert.
Es scheint aber wirklich so, dass nach der ersten Zahl mit Nachkommastelle, die Werte der Variablen nicht mehr richtig aktualisiert werden. Nachfolgend einmal meine Beispiele:

@weer
Für Fliesskommazahlen habe ich aber einen Double definiert. Die Integer sind ja für Ganzzahlen, oder?

Hallo Triggerfish

Zuerst zur Variablen-Definition: Du hast recht, Integer = Ganzzahl.

Aber etwas ganz anderes habe ich im Internet gefunden: «Wenn Sie mehrere Variablen deklarieren, müssen Sie den Datentyp für jede Variable angeben. Wenn Sie schreiben "Dim x, y As Integer" gilt nur y als Integer! x ist deklariert als Variant. Testen können Sie das mit: MsgBox TypeName(Variablenname).» - Eine ganz neue Erkenntnis für mich!

Nun aber zu Deinem Problem. Ich habe Deine Daten aus Spalte A und C übernommen und Dein Makro laufen lassen. Ich hänge hier ein PrintScreen der Zellen A103:F123 an. Wahrscheinlich habe ich ein Brett vor den Augen - oder ist es vor lauter Euro? -, aber ich sehe nicht, wo Dein Problem liegt. Was müsste in der Spalte F anders sein?

Grüsse Niclaus
 

weer

Stammgast
Nachtrag
Weiss jemand, wie man hier im PCTipp Dateien hochladen kann? Ich habe es unten über "Anhänge verwalten" gemacht, aber in meinem Beitrag erscheint nichts davon. Dann machen wir es halt wie zu Steinzeit-Zeiten:

@Triggerfish
Hier kannst Du mein jpg herunterladen
HTML:
http://www.file-upload.net/download-10149971/Nachkommastellen.JPG.html

Niclaus
 

Nebuk

PCtipp-Moderation
Teammitglied
Du kannst halt nicht alle Dateien hochladen.
Zum einen Datentyp beachten (nur möglich: bmp, doc, gif, jpe, jpeg, jpg, pdf, png, psd, txt und zip)
Dateigrösse darf die 500KB nicht überschreiten
Bei den Bilddateien darf die Bildauflösung nicht mehr als 1024x768 Pixel gross sein.

Wenn du die Datei über die "Anhänge" Funktion ausgewählt hast, brauchst du die Datei auch noch Hochladen (extra Knopf). Zudem müsstest du wohl noch mindestens 10 Buchstaben in das Antwortfenster tippen bevor du den Beitrag samt Upload abschicken (posten) kannst.
 

weer

Stammgast
a) Zum einen Datentyp beachten (nur möglich: bmp, doc, gif, jpe, jpeg, jpg, pdf, png, psd, txt und zip)
b) Dateigrösse darf die 500KB nicht überschreiten
c) Bei den Bilddateien darf die Bildauflösung nicht mehr als 1024x768 Pixel gross sein.

d) Wenn du die Datei über die "Anhänge" Funktion ausgewählt hast, brauchst du die Datei auch noch Hochladen (extra Knopf).
e) Zudem müsstest du wohl noch mindestens 10 Buchstaben in das Antwortfenster tippen bevor du den Beitrag samt Upload abschicken (posten) kannst.

Hallo Nebuk
Danke für die Hinweise. Ich habe alle fünf Bedingungen, die Du aufzählst, erfüllt! Und trotzdem geht es nicht. Ich habe auch keine Fehlermeldung oder ähnliches erhalten. Komisch und unangenehm.
Grüsse Niclaus
 
Oben