Discussion:
Access97: Laufzeitfehler 6: Überlauf
(zu alt für eine Antwort)
Alberto Luca
2007-10-27 15:40:08 UTC
Permalink
Hallo NewsGroup,

folgender Code führt zu o.g. Fehler:
Dim llng As Long
Dim ldbl As Double
llng = 60 * 1000 '=> Fehler
ldbl = 60 * 1000 '=> Fehler
llng = 60000 '=> OK

Sowohl Long als auch Double müssten doch 60.000 aufnehmen können.
Woran liegts?

Hintergrund:
ich möchte Me.TimerInterval variabel setzen.

Besten Dank vorab!
Ciao, Alberto
Klaus Oberdalhoff
2007-10-27 16:00:30 UTC
Permalink
Hi,
Post by Alberto Luca
llng = 60 * 1000 '=> Fehler
ldbl = 60 * 1000 '=> Fehler
Sowohl Long als auch Double müssten doch 60.000 aufnehmen können.
Woran liegts?
ganz klar, du arbeitest hier mit zwei Integer-Werten, deren Gesamtwert nach
der Multiplikation den Integerbereich überschreitet, bevor der Zielwert nach
long oder double konvertiert wird, da für die Rechenoperation von zwei Short
Integerwerten selbst - unabhängig vom Zielwert - eine Short Integer
Operation durchgeführt wird.

Daraus folgt: Immer auch MINDESTENS bereits einen *Quellwert* in der
gewünschten Zielart definieren z.B.:

llng = 60 * cdbl(1000)
llng = 60 * clng(1000)
llng = 60 * 1000# ' # Double

llng = 60 * 1000& ' & Long
--
mit freundlichen Grüßen aus Nürnberg

Klaus Oberdalhoff ***@gmx.de
Ich unterstütze PASS Deutschland e.V. (http://www.sqlpass.de)
Nächstes Treffen in Nürnberg am 20.11.2007
Alberto Luca
2007-10-27 18:09:57 UTC
Permalink
Hallo Klaus,

besten Dank!
Ciao, Alberto
Thomas Möller
2007-10-28 08:48:23 UTC
Permalink
Hallo Klaus,
Post by Klaus Oberdalhoff
Daraus folgt: Immer auch MINDESTENS bereits einen *Quellwert* in der
llng = 60 * cdbl(1000)
llng = 60 * clng(1000)
llng = 60 * 1000# ' # Double
llng = 60 * 1000& ' & Long
Im Sinne einer leicht zu verstehenden und damit auch leicht zu wartenden
Lösung würde ich auf die letzten beiden Möglichkeiten verzichten.

Bei den ersten beiden Zeilen werden Funktionen verwendet. Die
Funktionsnamen drücken klar aus, was die jeweilige Funktion tut. Wem das
nicht bekannt ist, der kann den Cursor in den Funktionsnamen setzen und
F1 drücken. Dort findet er eine Erklärung.

Was # und & bedeuten ist wahrscheinlich nur Dinosauriern wie uns
bekannt. ;-) Wer die Bedeutung dieser Zeichen nicht kennt tut sich auch
schwer Informationen dazu zu finden. In der Onlinehilfe findet man mit
"#" oder "&" als Suchwort z.B. nichts.
Die Gefahr, dass jemand in Unkenntnis der Bedeutung dieser Zeichen diese
bei einer Überarbeitung des Codes löscht ist damit ungleich größer als
bei der Verwendung der Konvertierungsfunktionen.


CU
--
Thomas

Homepage: www.Team-Moeller.de
Klaus Oberdalhoff
2007-10-28 13:26:14 UTC
Permalink
Hi,
Was # und & bedeuten ist wahrscheinlich nur Dinosauriern wie uns bekannt.
;-)
<hust>

du magst recht haben, NUR: Sogar ich habe erstmal in der Onlinehilfe unter
den Datentypen schauen müssen ;-) Auswendig wusste ich's auch nicht, da ich
persönlich es nicht verwende, da ich mich bemühe unsinnige Operationen (und
die Multiplikation von zwei Konstanten ist IMHO ziemlich unsinnig) aus
Gewohnheit zu vermeiden. (Ich bin eher jemand der dann das Ergebnis
hinschreibt und evtl. die Multiplikation als Kommentar daneben). Oder
zumindest bemühe ich mich, weniger mit Konstanten, als mit definierten
Werten (Dim xy as Sonstwas - oder notfalls - Const xy as Long = 123) zu
arbeiten.
Die Gefahr, dass jemand in Unkenntnis der Bedeutung dieser Zeichen
diese bei einer Überarbeitung des Codes löscht ist damit ungleich
größer als bei der Verwendung der Konvertierungsfunktionen.
Mag sein, dem steht aber entgegen, dass die Funktion einen (wenn auch
kleinen) Overhead zur RUNTIME-Zeit auslöst, während # und & bereits zur
Compile-Zeit optimal aufgelöst werden, da dann zur Definition dieser
Konstanten gleich intern die richtigen Datentypen verwendet werden.
--
mit freundlichen Grüßen aus Nürnberg

Klaus Oberdalhoff ***@gmx.de
Ich unterstütze PASS Deutschland e.V. (http://www.sqlpass.de)
Nächstes Treffen in Nürnberg am 20.11.2007
Henry Habermacher
2007-10-30 03:01:44 UTC
Permalink
Hallo Alberto
Post by Alberto Luca
Dim llng As Long
Dim ldbl As Double
llng = 60 * 1000 '=> Fehler
ldbl = 60 * 1000 '=> Fehler
llng = 60000 '=> OK
Sowohl Long als auch Double müssten doch 60.000 aufnehmen können.
Woran liegts?
Wie Du das beheben kannst, hast Du ja bereits mitbekommen, aber nicht der
Grund.

Der Grund ist der, dass VBA den Typen der einzelnen Variablen, die Du
multiplizierst verwendet um das Ergebnis zwischenzuspeichern. Das ist in
diesem Fall wohl ein Integer, das Ergebnis hat aber in einem Integer nicht
Platz. Wenn es Platz hätte würde VBA anschliessend das Ergebnis in einen
Double umwandeln und der Variablen zuteilen.
Im letzten Fall hast Du ja bereits eine Variable verwendet, die grösser als
32k ist, daher hat VBA hier gleich einen Long genommen, darum gehts.

Die sauberste Methode ist, keine Zahlen direkt zu verwenden, sondern die
Typen über Variablen festzulegen (das Thema Benamsungen solltest Du in der
FAQ ebenfalls mal lesen).

Also z.B. so:
Dim lngSekunden as Long
Dim lngMS as Long
Dim lngDauer as Long
lngSekunden = 60
lngMS = 1000
lngDauer = lngSekunden * lngMS

Oder dann die schnellere Version:

Dim lngDauer as Long
lngDauer = 60 * 1000.0

Damit wird VBA gezwungen einen Double Datentypen zu verwenden
(Nachkommazahl). VBA wird allerdings so raffiniert sein und 1000.0 sofort in
1000# umwandeln, damit es beim Interpretieren nicht immer wieder überlegen
muss, welcher Datentyp denn da benutzt werden sollte. Das erspart Dir die
Suche nach den Datentyp Suffixen ;-)

Gruss
Henry
--
Microsoft MVP Office Access
Keine E-Mails auf Postings in NGs. Danke.
Access FAQ www.donkarl.com
Loading...