Microsoft Excel

Herbers Excel/VBA-Archiv

Informationen und Beispiele zum Thema Label
BildScreenshot zu Label Label-Seite mit Beispielarbeitsmappe aufrufen

problem mit label

Betrifft: problem mit label von: ray
Geschrieben am: 15.09.2004 09:52:30

hallo,
auf einer userfrm lasse ich ergebnisse aus berechnungen in label anzeigen.

label 136 soll das ergebniss einer subtraktion anzeigen. dazu mache ich:

Label136 = Label138 - Label110 - Label109

( 138 ist 10279,60, 110 ist 1004,40, 109 ist 9275,20)
wenn ich die label in msgbox ausgeben sind zahlen korrekt.

nur label136 liefert -3,41060513164848E-13

Warum?

Gruß Ray

  


Betrifft: AW: problem mit label von: Axel
Geschrieben am: 15.09.2004 11:09:11

Hallo Ray,

da hast du eine zufällige Folge von Operanden erwischt, wo es bei der Subtraktion zu einer Rechenungenauigkeit kommt.

Das hat nichts mit den Labels zu tun, in einer Msgbox oder im Direktfenster wird das selbe fehlerhafte Ergebnis ausgegeben.

Da die Werte in einem Bezeichnungsfeld stehen, werde diese zunächst als normale Zeichenkette, also als String interpretiert.

Beim Rechnen mit Zeichenketten (sofern möglich, und keine Verkettung entsteht, z.B beim +-Operator), wird der Datentyp des Ergebnisses vom Operanden mit der größten Genauigkeit bestimmt.

Die Zahlen besitzen Nachkommawerte und werden deshalb bei der notwendigen Konvertierung intern als Gleitkommazahlen mit 16 Stellen Genauigkeit (Double, 8 Byte) abgebildet.

In diesem speziellen Fall reicht die Genauigkeit aber nicht aus.

Lösung: Du multiplizierst alle Operanden mit einem ausreichenden Faktor um die Nachkommastellen zu eliminieren und dividierst anschließend wieder entsprechend. Bei der Berechnung kommen dann long-Werte zum Einsatz. Das Ergebnis wird korrekt 0 lauten, also hier:

Label136 = (Label138 * 10 - Label110 * 10 - Label109 * 10) / 10

Oder du führst ein explizites Casting auf den Currency-Datentypen durch. Die Rechengenauigkeit beträgt dann 28 Stellen.

also

Label136 = CCur(Label138) - CCur(Label110) - CCur(Label109)

Gruß
Axel


  


Betrifft: Danke mT von: ray
Geschrieben am: 15.09.2004 11:21:46

Dank Dir Axel,

ich habe deine idee
Label136 = (Label138 * 10 - Label110 * 10 - Label109 * 10) / 10

verkürzt in

Label136 = Label138 * 1 - Label110 * 1 - Label109 * 1

Ergebnis ist jetzt richtig, aber ist meine lösung genauso sicher wie deine?

Gruß ray


  


Betrifft: AW: Danke mT von: Axel
Geschrieben am: 15.09.2004 11:51:10

Hallo Ray,

also bei mir funktioniert das nicht. Hätte mich aber auch gewundert, da dadurch nichts gewonnen wird.

Falls das bei dir tatsächlich 0 liefert, vermute ich, das du mit den Bezeichnungsfeldern zuvor noch weitere Operationen durchführst.

Teste das am besten im Direktfenster: ?10279.6*1 - 1004.4*1 - 9275.2*1 liefert dort wie gehabt -3,41060513164848E-13.

Alternativ ginge nur noch: Label136 = CCur(Label138 - Label110 - Label109)

Das Casting mit CCur() ist sicherer als die Multiplikation. Du könntest ja auch Werte mit 2 Nachkommastellen haben, da müsstest du schon mit 100 multiplizieren.

Obige Zuweisung mit dem Cast über die Gesamtsubtraktion ist übrigens rund 30% langsamer als die Zuweisung mit den Einzel-Casts.


Gruß
Axel


 

Beiträge aus den Excel-Beispielen zum Thema "problem mit label"