TL;DR —
IsNumeric(value)devuelveTruecuando VBA cree que podría convertir el valor en un número — una red mucho más amplia que los enteros limpios que probablemente tienes en mente. DiceTruea"1E5"(notación científica),"&HFF"(un literal hexadecimal),"1,000"(un separador de miles)," 42 "(rellenado con espacios) e incluso"12-"(un signo final). Además depende de la configuración regional, así que"1,5"es un número en una máquina alemana y no en una estadounidense. Úsalo como una primera reja barata, pero en cuanto necesites exactamente un entero limpio o un código de solo dígitos, fija la forma con el operador Like en su lugar.
Sub IsNumericSurprises()
Debug.Print IsNumeric("123") ' True - como se espera
Debug.Print IsNumeric("1E5") ' True - se lee como 100000 (cientifica)
Debug.Print IsNumeric("&HFF") ' True - se lee como 255 (literal hex)
Debug.Print IsNumeric("1,000") ' True - separador de miles
Debug.Print IsNumeric(" 42 ") ' True - ignora espacios al inicio/final
Debug.Print IsNumeric("12-") ' True - se permite el signo final
Debug.Print IsNumeric("12.3.4") ' False - dos puntos decimales
Debug.Print IsNumeric("") ' False - cadena vacia
Debug.Print IsNumeric("2026-01-01") ' False - eso es una fecha, usa IsDate
End Sub
Lo que aprenderás
- El modelo mental — IsNumeric prueba lo que VBA podría analizar, no lo que querías decir
- Los tres verificadores de texto de poder creciente, y qué pregunta responde cada uno
- Por qué la notación científica y los literales hexadecimales pasan de largo
- Por qué los espacios, los signos y los separadores de miles pasan todos
- Por qué IsNumeric depende de la configuración regional, y cómo eso corrompe datos entre equipos
- IsNumeric frente a
IsNumberfrente aIsDate, y la comprobación estricta que usar en su lugar
El modelo mental: IsNumeric pregunta qué podría analizar VBA, no qué querías decir
IsNumeric no es un validador. Es una vista previa de la propia coerción de tipos de VBA: devuelve True
para cualquier cadena que CDbl (o la conversión implícita detrás del análisis estilo Val) tragaría sin
error. Esa es una regla deliberadamente generosa, porque el analizador numérico de VBA entiende la notación
científica, los literales hexadecimales y octales, los símbolos de moneda y de agrupación, y los espacios
que rodean el valor.
Así que la pregunta correcta en tu cabeza nunca es «¿esto es un número?». Es «¿convertiría VBA esto en un número si se lo pidiera?» — y la respuesta es que sí mucho más a menudo de lo que quieres. Cada sorpresa de abajo se desprende directamente de ese único encuadre.
Los tres verificadores, de poder creciente
IsNumeric es el primer peldaño de una escalera. Antes de fiarte de cualquier cadena, la pruebas — y VBA
te da tres verificadores, cada uno respondiendo una pregunta distinta y cada uno mintiéndote a su manera:
| Verificador | La pregunta que responde | Su mentira característica |
|---|---|---|
IsNumeric |
¿Podría VBA analizar esto como un número? | Dice que sí a "1E5", "&HFF", "12-" |
Like |
¿Encaja la cadena entera en esta forma? | El caso depende de un interruptor de todo el módulo |
| RegExp | ¿Coincide con un patrón real, y qué hay dentro? | No devuelve nada hasta que fijas Global y llegas a SubMatches |
Echa mano del débil y los datos malos se cuelan; echa mano del pesado y te ahogas en preparativos. La
habilidad está en saber qué pregunta estás haciendo de verdad. IsNumeric responde la pregunta más laxa,
lo que lo hace el más rápido de usar y el más fácil de equivocar. Cuando «podría ser un número» no es lo
bastante estricto — necesitas exactamente tres dígitos, o un importe positivo, o un código sin letras —
te has bajado del peldaño de abajo y quieres Like o un patrón de verdad.
Trampa 1: la notación científica y los literales hexadecimales pasan de largo
Los dos que pillan a todo el mundo: "1E5" y "&HFF".
Debug.Print IsNumeric("1E5") ' True
Debug.Print CDbl("1E5") ' 100000 <- E es un exponente
Debug.Print IsNumeric("&HFF") ' True
Debug.Print CLng("&HFF") ' 255 <- &H es un literal hex
Esto no es un fallo — es VBA siendo coherente. Pero es un desastre de datos cuando el campo es un código
y no una cantidad. Un ID de producto como 1E5, un sufijo de cuenta como 12E3, o un número de pieza
que casualmente empieza por &H pasan todos la validación y luego se convierten en silencio en un entero
grande en cuanto conviertes. El usuario tecleó una etiqueta; tu macro guardó un número de millones y siguió
adelante sin decir palabra.
Si la columna está pensada para guardar identificadores, IsNumeric es la reja equivocada por completo —
no quieres «analizable como número», quieres «estos caracteres exactos». Ese es un trabajo para el
operador Like o una comparación directa de cadenas, no IsNumeric.
Trampa 2: los espacios, los signos y los separadores de miles pasan todos
El analizador de VBA es indulgente con la cosmética alrededor de un número, así que todos estos devuelven
True:
Debug.Print IsNumeric(" 42 ") ' True - recorta los espacios circundantes
Debug.Print IsNumeric("+5") ' True - signo inicial
Debug.Print IsNumeric("12-") ' True - signo FINAL (el famoso)
Debug.Print IsNumeric("1,000") ' True - separador de miles
Debug.Print IsNumeric("(5)") ' True - negativo estilo contable
El caso del signo final ("12-") sorprende a casi todo el mundo, y los paréntesis contables ("(5)") son
un auténtico tiro al pie cuando importas una exportación financiera y la mitad de tus negativos llegan
envueltos en corchetes. Mientras tanto, las cosas que esperarías que pasaran no pasan: un espacio interno
("1 2"), una fracción ("1/2") y una cadena vacía devuelven todas False. La regla no es «parece
dígitos» — es «coincide con una de las formas numéricas que VBA acepta», y ese conjunto es a la vez más
amplio y más extraño que la intuición.
Trampa 3: depende de la configuración regional, así que corrompe datos entre equipos
Esta es la silenciosa que sobrevive a las pruebas y falla en producción. IsNumeric respeta los ajustes
regionales de la máquina para los separadores decimal y de agrupación:
' En un PC estadounidense (decimal = ".")
Debug.Print IsNumeric("1,5") ' False - aqui la coma no es un punto decimal
Debug.Print IsNumeric("1.5") ' True
' En un PC aleman (decimal = ",")
Debug.Print IsNumeric("1,5") ' True - la coma SI es el punto decimal
Debug.Print IsNumeric("1.5") ' True - el punto se lee como separador de miles
El mismo libro, la misma macro, dos respuestas distintas según quién lo abra. Un paso de validación que
pasa en tu escritorio deja pasar el "1,5" de un colega como 1.5 — o lo rechaza de plano — y nunca lo
verás en una prueba. Cuando el valor viene de un archivo, una página web u otra región, haz tú mismo el
análisis con una suposición explícita (CDbl respeta la región; Val trata siempre
. como el decimal), en vez de confiar en que IsNumeric signifique lo mismo en todas partes.
IsNumeric frente a IsNumber frente a IsDate
Tres funciones que la gente usa indistintamente, tres trabajos distintos:
IsNumeric(x)— una función de VBA que pregunta si una cadena podría analizarse como un número. Esta es de la que trata este artículo.Application.WorksheetFunction.IsNumber(cell)— laISNUMBERde hoja, que pregunta si el valor almacenado de una celda ya es de tipo numérico. No analiza texto;IsNumber("123")en una celda con formato de texto esFalseaunqueIsNumeric("123")seaTrue.IsDate(x)— la reja hermana para las fechas.IsNumeric("2026-01-01")esFalse; usaIsDatepara cualquier cosa que deba ser una fecha, y ten en cuenta que depende de la región tanto comoIsNumeric.
Usa IsNumber cuando preguntas por un valor que ya está en una celda; usa IsNumeric cuando saneas texto
antes de convertirlo.
La opinión: IsNumeric es una reja barata, no un validador
IsNumeric se gana su sitio como un rechazo rápido de la basura obvia — una celda en blanco, un nombre, un
símbolo suelto. Deja que los eche fuera de forma barata. Pero el día en que tu regla es más estricta que
«podría ser un número» — un código postal de cinco dígitos, una cantidad positiva, un código de pedido sin
letras — IsNumeric deja de ser un activo y se convierte en una falsa sensación de seguridad, porque da
luz verde a la notación científica, el hexadecimal, las cadenas rellenas y los separadores específicos de
la región que nunca quisiste aceptar.
El arreglo es decir la forma en voz alta. Para «exactamente tres dígitos», s Like "###". Para «solo
dígitos, cualquier longitud», Len(s) > 0 And Not (s Like "*[!0-9]*"). Para cualquier cosa con estructura
— un grupo que extraer, un patrón que se repite — has subido a lo alto de la escalera y quieres un
patrón de verdad. Y sea lo que sea que decidas dejar pasar, conviértelo de inmediato
bajo la misma suposición regional con la que hiciste la prueba, para que «válido» y «convertido» nunca
puedan discrepar.
Cuando la validación es todo el trabajo — descríbela en su lugar
La mitad de las veces la tarea real no es «¿esto es numérico?» sino «limpia esta columna: quita los códigos
que parecen números, marca los que tienen el número de dígitos equivocado, fuerza el resto y dime qué filas
tocaste». Para cuando has encadenado IsNumeric, una comprobación de forma con Like, una conversión
consciente de la región y un registro de las excepciones, la fontanería eclipsa la respuesta.
ExcelMaster te deja enunciar ese
objetivo en español llano — «valida la columna C como cantidades enteras positivas, lista cada fila que
falle y por qué» — y genera Python que lee los datos, aplica la regla real, respalda tu archivo primero y
te devuelve las excepciones. Tú describes la comprobación; él se encarga de la notación científica, el
relleno y la región.
Preguntas frecuentes
¿Qué hace IsNumeric en VBA?
IsNumeric(expression) devuelve un Boolean: True si VBA podría convertir la expresión en un número, y
False en caso contrario. Es generoso — acepta la notación científica, los literales hexadecimales (&H)
y octales (&O), los separadores de miles, los espacios que rodean el valor y los signos iniciales o
finales — así que significa «analizable como número», no «un entero limpio».
¿Por qué IsNumeric devuelve True con un valor que no es un número?
Porque el valor es uno que el analizador de VBA reconoce. "1E5" es notación científica, "&HFF" es un
literal hexadecimal, "1,000" usa un separador de miles y "12-" tiene un signo final — todas formas
numéricas válidas para VBA. Si necesitas una definición más estricta, prueba la forma con Like (por
ejemplo s Like "###" para exactamente tres dígitos) en vez de IsNumeric.
¿Cómo compruebo que una cadena tiene solo dígitos en VBA?
Usa un patrón Like en vez de IsNumeric. Len(s) > 0 And Not (s Like "*[!0-9]*") es True solo cuando
s no está vacía y no contiene ningún carácter que no sea dígito — una prueba genuina de solo dígitos que,
a diferencia de IsNumeric, rechaza "1E5", "1,000" y "12-".
¿Cuál es la diferencia entre IsNumeric e IsNumber en VBA?
IsNumeric es una función de VBA que prueba si una cadena podría analizarse como un número.
WorksheetFunction.IsNumber (la ISNUMBER de hoja) prueba si el valor de una celda ya está almacenado
como un tipo numérico. Una celda de texto que contiene 123 da IsNumeric = True pero IsNumber = False.
¿Afecta la configuración regional a IsNumeric?
Sí. IsNumeric usa los separadores decimal y de agrupación de la máquina, así que "1,5" es numérico en
una máquina donde la coma es el punto decimal y no en una donde lo es el punto. Para resultados portables,
convierte con una regla explícita (Val usa siempre . como el decimal; CDbl respeta la configuración
regional actual) en vez de fiarte de que IsNumeric se comporte igual en todas partes.
Probado en
Probado en: Excel 365 (Windows 11), VBA 7.1 — última verificación el 04/09/2026.
Guías relacionadas: VBA Like · VBA Regex · VBA CStr · VBA InStr · VBA Split
