Ik heb zojuist een eenvoudige sub gemaakt en deze geeft een overloopfout. Ik zie echter niets mis met de code, en het is echt raar aangezien 50000*100
veel groter is dan 500*100
.
sub add()
'This will cause an overflow error
cells(1,1) = 500 * 100
'But this won't
cells(2,2) = 50000 * 100
end sub
Antwoord 1, autoriteit 100%
Overweeg:
Sub add()
'This works:
Cells(1, 1) = CLng(500) * 100
'as does this:
Cells(2, 2) = 50000 * 100
End Sub
Blijkbaar koos VBA een standaardtype Integer
voor de eerste expressie, omdat dat type groot genoeg is om de letterlijke waarden aan de rechterkant te bevatten. 50000 is te groot voor een Integer
en wordt daarom geïnterpreteerd als een Long
. CLng
activeert expliciet een promotie naar Long
.
Antwoord 2, autoriteit 27%
De maximale waarde voor een Integer
is 32767
en aangezien 50000
meer is, wordt deze gecast als een Long
type. Dus de resultaten passen prima in Long
. Maar in het eerste geval wordt alles gedaan met Integer
-typen en loopt het over.
(Integer=500) * (Integer=100) = (Integer=50000) 'Overflow
(Long=50000) * (Integer=100) = (Long=5000000) 'Ok
Antwoord 3, autoriteit 12%
Dit komt door de manier waarop VBA wiskundige uitdrukkingen evalueert. Het retourtype van expressie is het type eerste operand in de expressie of het dichtstbijzijnde equivalent van het numerieke type.
Het uiteindelijke resultaat past echter mogelijk niet in dat retourtype en een overloopfout.
Als je 500*100 doet, is het retourtype integer.
Terwijl wanneer u 50000*100 doet, het retourtype van deze uitdrukking Lang is.
Om een overloopfout te voorkomen, kunt u een expliciete cast maken om uw bedoelingen te laten weten
CLng(500) * 100
Antwoord 4, autoriteit 3%
ik kreeg het antwoord via de volgende link: Link van microsoft
het lijkt erop dat zelfs ik geen type aan het nummer heb toegewezen, Excel wijst er automatisch een toe op basis van de lengte. Dus 500 wordt gedefinieerd als geheel getal en het resultaat 50.000 is te groot voor het type geheel getal. Daarom.