🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

VBA TextBox en Excel — por qué .Value siempre es texto (y cómo convertirlo)

|

VBA TextBox en Excel — por qué .Value siempre es texto (y cómo convertirlo)

TL;DR — Un TextBox guarda una sola cosa: texto. TextBox1.Value siempre te devuelve un String, incluso cuando el usuario escribió 42 o 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 con IsNumeric y convierte con CDbl o CLng. .Text y .Value son casi lo mismo en un cuadro de texto; un cuadro vacío es "", no 0.

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.Value siempre es un String, sea cual sea su aspecto
  • Las dos formas distintas en que la aritmética sobre .Value sale mal
  • Cómo convertir con seguridad usando IsNumeric, y luego CDbl o CLng
  • La pequeña diferencia entre .Text y .Value
  • Por qué un cuadro vacío es "" y no 0, y cómo comprobarlo
  • Cómo reaccionar mientras el usuario escribe con los eventos Change y Exit

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