2009-11-25 22 views
5

Estoy buscando una solución elegante para determinar si una variante es un número entero en VBA. Lamentablemente, si la variante se creó a partir de una cadena, estoy atascado. He aquí un pequeño script de prueba:¿Cómo puedo determinar si una variante es un número entero en VBA?

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

Aquí, el MsgBox aparece, probablemente debido a que la variante se crea a partir de una cadena, a pesar de lo que habría esperado v = a ser redonda (v).

+2

Puede valer la pena preguntarse si realmente necesita manejar cualquier variante y cualquier número entero. ¿Qué tal una cadena de 1000 dígitos? ¿Qué hay de los dobles integrales fuera del alcance de un Long? Será mucho más fácil si especifica exactamente lo que necesita y luego codifica eso. No es el mismo problema, pero vea esta respuesta de Eric Lippert a otra pregunta aquí en Stackoverflow: http://stackoverflow.com/questions/921180/c-round-up/926806#926806 – jtolle

Respuesta

9

Usted debe escribir algo como:

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

Dónde CDbl es una función de la conversión de los datos a un número de tipo doble. Puede que tenga que tratar los casos donde v no se puede convertir a un número con la función isNumeric() antes de llamar a la función cDbl. Incluso puede utilizar la función CInt para sus comparaciones:

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

Eso no funcionará en algunos casos , por ejemplo: Dim v Como moneda v = -123456.0000006 – Fionnuala

+1

Bueno, mi proposición era más 'escribir algo así' que 'esto es código a prueba de balas', pero la idea principal está aquí, incluso si necesita algo más pruebas. –

+1

Lo siento, pero tengo que decir -1, incluso teniendo en cuenta su advertencia sobre "algo así". Cualquiera de sus respuestas, ya que están codificadas, tienen errores. Si presenta el código, debería ser correcto y no dejar de encontrar los errores como un ejercicio. – jtolle

3
Sub test() 

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

End Sub 

Si utiliza Val(), se hará todo lo posible para convertir en un número. Si no puede, devolverá cero y Val (v) siempre será igual a Int (Val (v)) en ese caso.

Cuestiones relacionadas