Waarom zorgen cellen (1,1) = 500 * 100 voor overflow, maar 50000*100 niet?

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*100veel 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 Integervoor de eerste expressie, omdat dat type groot genoeg is om de letterlijke waarden aan de rechterkant te bevatten. 50000 is te groot voor een Integeren wordt daarom geïnterpreteerd als een Long. CLngactiveert expliciet een promotie naar Long.


Antwoord 2, autoriteit 27%

De maximale waarde voor een Integeris 32767en aangezien 50000meer is, wordt deze gecast als een Longtype. 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.

Other episodes