2009-11-25 14 views
5

Sto cercando una soluzione elegante per determinare se una variante è un numero intero in VBA. Sfortunatamente, se la variante è stata creata da una stringa, sono bloccato. Ecco un piccolo script di test:Come determinare se una variante è un numero intero in VBA?

dim v as variant 
v = "42" 
if v <> round(v) then 
    msgBox("<>") 
end if 

Qui, il Msgbox si apre, probabilmente perché la variante è stato creato da una stringa, anche se mi sarei aspettato di essere v = round (v).

+2

Potrebbe valere la pena chiedersi se è davvero necessario gestire qualsiasi variante e qualsiasi numero intero. Che dire di una stringa di 1000 cifre? Che dire dei Doppi integrali al di fuori della portata di un lungo? Sarà molto più semplice se specifichi esattamente ciò di cui hai bisogno e poi codifichi solo quello. Non è lo stesso problema, ma vedi questa risposta di Eric Lippert a un'altra domanda qui su Stackoverflow: http://stackoverflow.com/questions/921180/c-round-up/926806#926806 – jtolle

risposta

9

Si dovrebbe scrivere qualcosa di simile:

if cDbl(v) <> round(cDbl(v)) Then 

Dove CDbl è una funzione di conversione di tutti i dati in un numero doppio tipo. Potrebbe essere necessario trattare casi in cui v non può essere convertito in un numero con la funzione isNumeric() prima di chiamare la funzione cDbl. È anche possibile utilizzare la funzione CInt per i vostri confronti:

if isnumeric(v) then 
    if cDbl(v) - cInt(v) <> 0 Then 
    .... 
    endif 
else 
    debug.print "data cannot be converted to a number" 
endif 
+0

Che in alcuni casi non funzionerà del tutto , ad esempio: Dim v Come valuta v = -123456,0000006 – Fionnuala

+1

Bene, la mia proposta era più 'scrivere qualcosa del genere' che 'questo è un codice antiproiettile garantito', ma l'idea principale è qui, anche se ha bisogno di qualche extra test. –

+1

Mi dispiace, ma devo dire -1, anche dato il tuo avvertimento su "qualcosa del genere". Entrambe le tue risposte così come sono codificate hanno degli errori. Se presenti il ​​codice, dovrebbe essere corretto e non lasciare trovare i bug come esercizio. – jtolle

3
Sub test() 

    Dim v As Variant 
    v = "42" 
    If Val(v) <> Int(Val(v)) Then 
     MsgBox ("<>") 
    End If 

End Sub 

Se si utilizza Val(), che farà del suo meglio per convertire in un numero. Se non può, restituirà zero e Val (v) sarà sempre uguale a Int (Val (v)) in quel caso.

Problemi correlati