TL;DR — Un TextBox guarda una sola cosa: texto.
TextBox1.Valuesiempre te devuelve unString, incluso cuando el usuario escribió42o una fecha. Ahí nace casi todo bug de TextBox — aritmética sobre texto, o un número comparado con una cadena. Antes de hacer cuentas, comprueba conIsNumericy convierte conCDbloCLng..Texty.Valueson casi lo mismo en un cuadro de texto; un cuadro vacío es"", no0.
Private Sub cmdAdd_Click()
' TextBox1.Value es la CADENA "10", no el numero 10:
If IsNumeric(TextBox1.Value) Then
Dim n As Double
n = CDbl(TextBox1.Value) ' ahora es un numero real
MsgBox n + 5
Else
MsgBox "Please enter a number"
End If
End Sub
Un TextBox es el control más sencillo de un UserForm — una caja en la que el usuario escribe — y es el que más confusión causa, por una única razón. Pertenece a la familia de controles a la que llegas por la colección Controls del formulario: como todo control, hablas con un cuadro de texto a través de sus propiedades. Pero donde un CheckBox devuelve un Boolean y un ListBox devuelve el elemento seleccionado, un TextBox devuelve algo engañosamente simple — una cadena — y tratar esa cadena como el número al que se parece es el error número uno con TextBox.
Lo que aprenderás
- Por qué
TextBox1.Valuesiempre es unString, sea cual sea su aspecto - Las dos formas distintas en que la aritmética sobre
.Valuesale mal - Cómo convertir con seguridad usando
IsNumeric, y luegoCDbloCLng - La pequeña diferencia entre
.Texty.Value - Por qué un cuadro vacío es
""y no0, y cómo comprobarlo - Cómo reaccionar mientras el usuario escribe con los eventos
ChangeyExit
El modelo mental: un TextBox siempre devuelve texto
Un cuadro de texto guarda caracteres, nada más. Cuando el usuario escribe 42, el cuadro contiene la
cadena de dos caracteres "42", no el número 42. Así que TextBox1.Value es un String — siempre,
sin importar qué aspecto tenga. Una fecha escrita como 31/12/2026 es una cadena de diez caracteres;
un importe 1,250.00 es una cadena con una coma dentro. VBA no lee la intención de un cuadro de
texto; te entrega los caracteres y te deja a ti el significado.
Este único hecho explica toda sorpresa con TextBox. Si no recuerdas nada más: lo que sale de un cuadro de texto es texto hasta que lo conviertes.
La trampa del número: sumar a .Value sale mal de dos formas
Como .Value es una cadena, hacer cuentas con él es como tirar una moneda al aire entre dos fallos:
' Digamos que el cuadro contiene 10
MsgBox TextBox1.Value + 5 ' NO 15
Si VBA trata + como concatenación obtienes "105"; si un valor posterior en el cuadro no es
numérico obtienes en su lugar error de ejecución 13, « Type mismatch ». El mismo código, dos
resultados equivocados distintos, según lo que haya escrito el usuario — justo el tipo de bug que
pasa tu prueba y falla en manos del usuario. El arreglo nunca es hacer aritmética directamente sobre
.Value.
Convertir con seguridad: IsNumeric, luego CDbl o CLng
Dos pasos, siempre en este orden. Primero pregunta si el texto es un número con IsNumeric; solo
entonces conviértelo:
If IsNumeric(TextBox1.Value) Then
Dim price As Double
price = CDbl(TextBox1.Value) ' string -> Double
Else
MsgBox "That is not a number"
TextBox1.SetFocus ' lo mandamos de vuelta para que lo corrija
End If
Usa CDbl para todo lo que tenga decimales (precios, tasas) y CLng para números enteros
(recuentos, ids). Saltarte la protección IsNumeric y llamar a CDbl sobre "abc" lanza el mismo
error 13 — así que la protección no es cortesía opcional, es lo que convierte un cuelgue en un
mensaje. Esto es el equivalente en TextBox de la seguridad de tipos que perdiste en cuanto el valor
se volvió texto.
.Text frente a .Value
En un cuadro de texto los dos son casi idénticos, y .Value es el que se usa por costumbre. La
distinción que importa: .Text es siempre la cadena que se muestra en el cuadro, mientras que
.Value puede verse afectado por otras propiedades en controles más ricos. En un TextBox sencillo
ambos devuelven la misma cadena. Prefiere .Value para leer datos, y recurre a .Text solo cuando
necesites específicamente los caracteres mostrados — por ejemplo dentro de un evento Change antes
de que .Value se haya asentado.
Vacío es una cadena de longitud cero, no cero
Un cuadro de texto vacío es "" — una cadena de longitud cero — no 0 y no Null. Así que
compruébalo como texto:
If Trim(TextBox1.Value) = "" Then
MsgBox "This field is required"
Exit Sub
End If
Trim también atrapa un cuadro donde el usuario solo escribió espacios. No compruebes
If TextBox1.Value = 0 — eso compara una cadena con un número y te engaña. Como vacío es una cadena,
comprobar un campo obligatorio es una prueba de texto, no numérica — una distinción que confunde a
quien viene del InputBox, que tiene sus propias reglas de cancelar frente a
vacío.
Reaccionar mientras el usuario escribe: los eventos Change y Exit
Dos eventos cubren casi toda la validación en vivo. Change se dispara en cada pulsación — bueno
para un contador de caracteres en vivo o para activar un botón OK, malo para trabajo pesado. Exit
se dispara cuando el usuario abandona el cuadro, y puede cancelar la salida para forzar una
corrección:
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If Not IsNumeric(TextBox1.Value) Then
MsgBox "Enter a number before moving on"
Cancel = True ' mantener el foco en el cuadro
End If
End Sub
Poner Cancel = True en Exit es la forma limpia de retener al usuario en un campo hasta que sea
válido — mucho mejor que dejar que un valor incorrecto fluya al resto del formulario y falle más
tarde. Usa Change para retroalimentación barata por pulsación y Exit para la validación de
verdad.
Cómo te ayuda ExcelMaster
El bug de TextBox es la definición de "funciona en mi máquina": el cuadro que siempre tuvo un número
en las pruebas tiene una letra suelta en producción, y + 5 se vuelve "105" o error 13. Se queda
callado hasta que llega justo la entrada que lo rompe.
ExcelMaster te deja decir qué
significa el campo — "esto es un precio, rechaza cualquier cosa que no sea un número y devuelve el
cursor" — y escribe la protección IsNumeric y la conversión CDbl, con el evento Exit ya
conectado, así el paso de cadena a número nunca se salta. Tú conservas el formulario y el código.
Preguntas frecuentes
¿El valor de un TextBox de VBA siempre es una cadena?
Sí. Un TextBox guarda caracteres, así que TextBox1.Value devuelve un String cada vez, incluso
cuando el usuario escribió dígitos o una fecha. VBA no lo convierte por ti. Para usarlo como número
debes convertirlo tú mismo con CDbl o CLng, después de comprobar que de verdad es numérico con
IsNumeric.
¿Cómo obtengo un número de un TextBox de VBA?
Protege y luego convierte. Comprueba IsNumeric(TextBox1.Value); si pasa, llama a
CDbl(TextBox1.Value) para un decimal o CLng(TextBox1.Value) para un número entero. Llamar a
CDbl sobre texto no numérico lanza el error de ejecución 13, así que la comprobación IsNumeric es
lo que convierte un cuelgue en un mensaje amable.
¿Cuál es la diferencia entre .Text y .Value en un TextBox?
En un TextBox sencillo ambos devuelven la misma cadena, y .Value es la opción convencional para
leer datos. .Text es siempre los caracteres mostrados en ese momento; .Value puede diferir en
controles más ricos. Usa .Value por defecto y .Text solo cuando necesites específicamente la
cadena mostrada, como dentro de un evento Change.
¿Cómo compruebo si un TextBox está vacío en VBA?
Compruébalo como texto: If Trim(TextBox1.Value) = "" Then. Un cuadro vacío es una cadena de
longitud cero, no 0 ni Null, y Trim también atrapa un cuadro que solo contiene espacios. No lo
compares con 0, que mezcla una cadena con un número y da resultados engañosos.
¿Cómo valido un TextBox mientras el usuario escribe?
Usa el evento Change para retroalimentación barata por pulsación (un contador de caracteres,
activar un botón) y el evento Exit para la validación de verdad. En Exit, pon su argumento
Cancel a True para mantener el cursor en el cuadro hasta que la entrada sea válida, así un valor
incorrecto nunca llega al resto del formulario.
Probado en
Probado en: Excel 365 (Windows 11), VBA 7.1 — última verificación el 28/09/2026.
Guías relacionadas: VBA Controls · VBA Frame · VBA UserForm · VBA InputBox · VBA ComboBox · VBA CheckBox · VBA On Error
