2015-08-04 9 views
63

Nun, ich habe gerade ein einfaches Sub erstellt und es gibt den Fehler des Überlaufs. Allerdings sehe ich nichts falsch mit dem Code, und es ist wirklich seltsam, da 50000 * 100 viel größer als 500 * 100 ist.Warum Zellen (1,1) = 500 * 100 verursacht Überlauf, aber 50000 * 100 nicht?

sub add() 
    'This will cause an overflow error 
    cells(1,1) = 500 * 100 
    'But this won't 
    cells(2,2) = 50000 * 100 
end sub 
+1

Interessanter es nicht den Überlauffehler verursachen, wenn Sie 50000 statt 500 * 100 ... – KFichter

+6

Hinweis angeben : Probieren Sie 'CLng (500) * 100' – ja72

+4

Ja, ich denke, 500 und 100 werden als ganze Zahlen behandelt, so dass das Produkt auch als eine ganze Zahl behandelt wird, und 50000 ist über der 32767 Grenze also hier sind wir. – KFichter

Antwort

72

Bedenken Sie:

Sub add() 
    'This works: 
    Cells(1, 1) = CLng(500) * 100 
    'as does this: 
    Cells(2, 2) = 50000 * 100 
End Sub 

Offenbar VBA wurde zum ersten Ausdruck einen Standardtypen von Integer Kommissionierung, weil diese Art der groß genug ist, um die Literale auf der rechten Seite zu halten. 50000 ist zu groß für eine Integer, so dass es als Long interpretiert wird. CLng löst explizit eine Beförderung zu Long aus.

+2

Oder [Abkürzung] (http://www.bettersolutions.com/vba/VUD113/NO333718332.htm) 'Zellen (1, 1) = 500 & * 100 &' – AndrewD

20

Der Maximim Wert für eine Integer ist 32767 und da 50000 mehr ist als Long Typ gegossen ist. Somit passen die Ergebnisse in Long ganz gut. Aber im ersten Fall ist alles mit Integer Typen gemacht und es läuft über.

(Integer=500) * (Integer=100) = (Integer=50000) 'Overflow 
(Long=50000) * (Integer=100) = (Long=5000000) 'Ok 
2

bekam ich die Antwort auf den folgenden Link: Link from microsoft

es scheint, dass selbst ich einen Typ der Nummer nicht vergeben, excel man es automatisch auf der Grundlage seiner Länge zuweisen. Somit ist 500 als Integer definiert und das Ergebnis 50.000 ist zu groß für den Typ Integer. Deshalb.

9

Dies liegt daran, wie VBA mathematische Ausdrücke bewertet. Der Rückgabetyp des Ausdrucks ist der Typ des ersten Operanden im Ausdruck oder der ihm am nächsten stehende numerische Typ. Das Endergebnis passt jedoch möglicherweise nicht in den Rückgabetyp und den Überlauffehler.

Wenn Sie 500 * 100 ausführen, ist der Rückgabetyp eine Ganzzahl. Wenn Sie 50000 * 100 ausführen, ist der Rückgabetyp dieses Ausdrucks Long.

Um Überlauffehler zu vermeiden Sie können eine explizite Umwandlung tun, um es Ihre Absichten wissen zu lassen

CLng(500) * 100