Überlauf bei der Multiplikation von ganzen zahlen und die Zuordnung zu Lang
Wenn ich geben Sie Folgendes in das Direktfenster bekomme ich Laufzeitfehler '6': Überlauf.
MsgBox 24 * 60 * 60
Warum ist das so?
Dieser auch ausfällt:
Dim giveTime As Long
giveTime = 24 * 60 * 60
Warum ist das so? giveTime
ist deklariert als Long-Datentyp, also 24 × 60 × 60 = 86400 sollte bequem passen.
- Weiter zu diesem. - wenn ich die msgbox 26 * 60 ^ 2 in das Direktfenster es ist kein problem. Ist es ein Reihenfolge-Problem? Das scheint mir eher unwahrscheinlich...
- Das ist, weil die
^
- operator gibt ein Doppel, das umgeht das problem beschrieben in meiner Antwort weiter unten.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist eine wirklich seltsame VBA-Marotte. Ich bin erstaunt, ich habe noch nie stieß auf dieses.
So wie es aussieht die
*
und+
Operatoren eine ganze Zahl zurück, die in den ersten beiden Beispielen. Sicher genug, in der Hilfe-Datei für die*
operator (ähnlich wie für die+
operator):Ihre Literale 24, 60, und 60 sind alle vom Typ Integer standardmäßig, so dass Ihre
*
(oder+
) der Betreiber gibt eine Ganzzahl zurück, die überfließt, weil das Ergebnis größer als 32.767 ist.Jedoch die wörtliche 32,768 im Dritten Beispiel oben defaults zu Lang (da es zu groß ist, um eine Ganzzahl sein) und so die
+
gibt eine Lange; kein überlauf.Hilfe-Datei sagt auch dies:
Schwerpunkt mir. Nun ist diese kleine Regel klingt wie der gesunde Menschenverstand, und jeder würde davon ausgehen, dass es gilt in Ihrem Fall. Aber deine zahlen sind vom Typ Integer, nicht Variant/Integer, so dass VBA nicht diese Regel anwenden! Macht absolut keinen Sinn für mich, aber das ist, wie es ist, und das ist, was die Dokumentation sagt.
Lösung: stellen Sie eines der Argumente Ihrer
*
Betreiber ein Typ sein, der präziser als ganze Zahl (z.B. Long) und das problem wird Weggehen.In der Tat, und dies ist wahrscheinlich der Grund, warum ich habe noch nie traf diese Marotte, die ich zur Gewohnheit machen, deklarieren alle meine Integer-Variablen, so Lange statt, es sei denn, es ist ein besonderes Anliegen, dass mit Long statt Integer Probleme mit Speicherverbrauch oder Ausführungszeit (was fast nie der Fall ist). Zugegeben, dies wird nicht helfen, in Fällen, in denen Sie tätig sind, auf Literale kleiner als 32.768 sind, weil Sie standardmäßig Integer-Typ.
Fragen Sie in ein Kommentar was ein Variant/Integer ist. Die Variante ist im Grunde ein container-Typ für alle anderen Daten geben. In dem besonderen Fall, wo Sie es machen enthalten eine Ganzzahl:
Aber wie oben erwähnt, eine einfache alte Integer löst der overflow-Fehler:
x = [24 * 60 * 60]
[]
eckigen Klammern sind Kürzel für dasEvaluate
- Methode. Du bist also der Aufruf der Excel-interpreter auswerten eines Ausdrucks in VBA. Klingt wie etwas, das fügt eine Menge Aufwand wenn man es wiederholt, aber ich denke, es ist ok, wenn gelegentlich.Nach jeder Nummer, Ort #. Es definiert jede Zahl als double. Betrachten Sie es als jede Zahl platziert werden, um Speicher für die Berechnung als eine Art temp-variable.
Wenn Sie festlegen, dass jede Zahl, es wird genügend Raum für die Berechnungen.
zB:
Dim x As Long
x = 24# * 60# * 60#
oder 24& 'zeigt an, lange