2015-08-04 10 views
63

Bene, ho appena creato un sub semplice e dà l'errore di overflow. Tuttavia, non vedo nulla di sbagliato nel codice, ed è davvero strano dal momento che 50000 * 100 è molto più grande di 500 * 100.Perché celle (1,1) = 500 * 100 causa un overflow ma 50000 * 100 no?

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

È interessante notare che non causa l'errore di overflow se si specifica 50000 invece di 500 * 100 ... – KFichter

+6

Hint : Prova 'CLng (500) * 100' – ja72

+4

Sì, suppongo che 500 e 100 vengano gestiti come numeri interi, quindi il prodotto viene gestito come un numero intero e 50000 è oltre il limite di 32767, quindi eccoci qui. – KFichter

risposta

72

considerare:

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

Evidentemente VBA stava raccogliendo un tipo predefinito di Integer per la prima espressione, perché questo tipo è abbastanza grande da contenere i letterali sul lato destro della strada. 50000 è troppo grande per un Integer quindi lo interpreta come Long. CLng attiva esplicitamente una promozione su Long.

+2

Oppure [stenografia] (http://www.bettersolutions.com/vba/VUD113/NO333718332.htm) 'Cells (1, 1) = 500 & * 100 &' – AndrewD

20

Il valore maximim per un Integer è 32767 e poiché è più 50000 è gettato come un tipo Long. Quindi i risultati si adattano perfettamente a Long. Ma nel primo caso tutto è fatto con i tipi Integer e si rovescia.

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

ho avuto la risposta dal seguente link: Link from microsoft

sembra che anche io non ha assegnato un tipo al numero, Excel automaticamente assegnare una ad essa in base alla sua lunghezza. Quindi, 500 è definito come numero intero e il risultato 50.000 è troppo grande per il numero intero di tipi. Ecco perchè.

9

Ciò è dovuto al modo in cui VBA valuta le espressioni matematiche. Il tipo di espressione di restituzione sarà il tipo di primo operando nell'espressione o il suo equivalente di tipo numerico più vicino. Tuttavia, il risultato finale potrebbe non rientrare in quel tipo di ritorno e generare un errore di overflow.

Quando si esegue 500 * 100, il tipo restituito è intero. Mentre quando si esegue 50000 * 100 il tipo di ritorno di questa espressione è Long.

Per evitare errore di overflow si può fare un cast esplicito di farle sapere le vostre intenzioni

CLng(500) * 100