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

VBA InputBox en Excel — los dos InputBox y cuándo usar cada uno

|

VBA InputBox en Excel — los dos InputBox y cuándo usar cada uno

Probado en: Excel 365 v2509 · Excel 2021 · Excel 2019 · última verificación: 06/06/2026

En resumen — Excel ofrece dos funciones llamadas InputBox. La sencilla devuelve texto; la de Excel puede exigir un número, una fecha o incluso dejar que el usuario seleccione un rango con el ratón:

' 1. InputBox de VBA — siempre devuelve una cadena (String)
Dim nombre As String
nombre = InputBox("¿Su nombre?", "Configuración")

' 2. Application.InputBox — Type:=1 fuerza un número, Type:=8 captura un rango
Dim cantidad As Variant
cantidad = Application.InputBox("¿Cuántos?", "Cantidad", Type:=1)

Dim rango As Range
On Error Resume Next
Set rango = Application.InputBox("Seleccione los datos:", "Rango", Type:=8)
On Error GoTo 0

Elegir el equivocado es la razón por la que tantas macros con InputBox arrastran un bucle de validación escrito a mano que en realidad no necesitan. Así se elige bien.

El modelo mental: mismo nombre, dos herramientas distintas

Escribe InputBox en el editor y VBA lo ofrece dos veces — no es un fallo. De verdad hay dos:

  • InputBox(...) — la función del lenguaje VBA. Sencillísima, funciona en cualquier aplicación de Office y siempre devuelve una cadena. Escriba lo que escriba el usuario, recibes texto.
  • Application.InputBox(...) — un método exclusivo de Excel con una baza extra: un argumento Type. Puede insistir en un número, una fecha, un booleano o un rango de celdas, y devuelve ese valor con tipo — no una cadena que tengas que convertir.

Si MsgBox es el interfono que solo difunde, InputBox es el único sitio donde una macro rápida puede recibir un valor tecleado sin montar todo un UserForm. Usa el sencillo para texto libre; usa Application.InputBox en cuanto la respuesta deba ser un número, una fecha o un rango.

Elegir según la respuesta que necesitas

' Texto libre → el InputBox sencillo es lo más corto
Dim nota As String
nota = InputBox("Añadir un comentario:")

' Un número con el que harás cálculos → Application.InputBox Type:=1
Dim tasa As Variant
tasa = Application.InputBox("Tasa de interés %:", Type:=1)

' Un rango que el usuario señala con el ratón → Type:=8 (la función estrella)
Dim destino As Range
On Error Resume Next
Set destino = Application.InputBox("Elija las celdas a sumar:", Type:=8)
On Error GoTo 0

Ese selector de rango Type:=8 es lo único que ningún otro diálogo ligero sabe hacer — el usuario arrastra por la hoja y recuperas un objeto Range de verdad. Montar un UserForm con un control RefEdit solo para capturar un rango es exagerado cuando existe esto.

Los valores de Type que conviene conocer

Type Acepta Devuelve
1 Un número el número (Double)
2 Texto una cadena (String)
4 Un booleano True / False
8 Una referencia de celda un Range (con Set)
0 Una fórmula la fórmula como texto

Se pueden sumar para «uno u otro» — Type:=1 + 2 acepta un número o texto. La gracia de Type es que Excel valida la entrada por ti: escribe letras en un campo Type:=1 y Excel las rechaza antes de que tu código se ejecute. Ese bucle de validación que ibas a escribir — ya viene incorporado.

La trampa que rompe ambos: detectar Cancelar

Aquí viven la mayoría de los errores de InputBox, y es distinto en cada versión.

El InputBox sencillo devuelve una cadena vacía "" cuando el usuario pulsa Cancelar — y también cuando lo deja en blanco y pulsa Aceptar. No puedes distinguir los dos casos:

Dim s As String
s = InputBox("Introduzca un código:")
If s = "" Then Exit Sub      ' trata Cancelar y «Aceptar vacío» igual — suele bastar

Application.InputBox devuelve el booleano False al cancelar. El truco: hay que atraparlo antes de asignarlo a una variable con tipo, así que guárdalo primero en una Variant:

Dim v As Variant
v = Application.InputBox("¿Cuántas filas?", Type:=1)
If VarType(v) = vbBoolean Then Exit Sub    ' el usuario canceló
' ahora es seguro usar v como número
Range("B1").Value = v

⚠️ No escribas If v = False Then Exit Sub aquí. Si el usuario introduce legítimamente 0, entonces v = False también es verdadero (VBA trata 0 como False), y tu macro se detiene ante una entrada válida. Comprobar VarType(v) = vbBoolean es la única verificación fiable — un número real vuelve como vbDouble, nunca como vbBoolean. Para un rango (Type:=8), usa en su lugar el patrón Is Nothing del bloque En resumen.

Deja de escribir bucles de validación a mano

Como Application.InputBox ya impone el tipo, el clásico bucle «seguir preguntando hasta que escriba un número válido» es, sobre todo, código desperdiciado:

' ❌ El bucle que se escribe con el InputBox sencillo
Dim s As String
Do
    s = InputBox("Introduzca un número:")
Loop Until IsNumeric(s) And s <> ""

' ✅ Deja que Excel lo imponga
Dim n As Variant
n = Application.InputBox("Introduzca un número:", Type:=1)
If VarType(n) = vbBoolean Then Exit Sub

Regla práctica: si te ves validando el tipo del valor, elegiste el InputBox equivocado — cambia a Application.InputBox con el Type adecuado. La validación del significado (¿en rango? ¿ya existe?) sigue siendo cosa tuya.

Cuándo InputBox deja de ser la herramienta adecuada

Un valor, dos a lo sumo — las cadenas de InputBox van bien. Más allá se desmoronan: pide cinco cosas seguidas y el usuario que se equivoca en la segunda no tiene vuelta atrás, ni visión de conjunto, ni un «cancelar todo». Esa es la señal para ascender a un UserForm, donde todos los campos se ven a la vez y se pueden editar hasta pulsar Aceptar. No recurras a él antes de lo necesario — tres campos de texto simples sin validación viven la mar de bien como tres InputBox.

Errores frecuentes con InputBox (y la solución)

Síntoma Causa Solución
La macro se detiene ante un 0 válido If v = False tras Type:=1 (0 = False) Comprobar VarType(v) = vbBoolean en su lugar
«No coinciden los tipos» al elegir rango Dim r As Range recibiendo un Cancelar (False) On Error Resume Next + If r Is Nothing
El número vuelve como texto Se usó el InputBox sencillo (siempre String) Application.InputBox con Type:=1
El selector de rango no aparece InputBox(...) en vez de Application.InputBox(...) Solo la versión Application. tiene Type:=8
Cancelar indistinguible de un campo vacío El InputBox sencillo devuelve "" para ambos Cambiar a Application.InputBox (devuelve False al cancelar)
El texto predeterminado no aparece Puesto en el argumento equivocado InputBox(prompt, título, predeterminado) — el predeterminado es el 3.º

Una pregunta es fácil — la lógica posterior no

Capturar un número o un rango con InputBox es la parte sencilla. El trabajo es lo que viene después — «para el rango elegido, suma cada columna, omite los vacíos y marca todo lo que supere la media.» ExcelMaster Agent te deja describir toda esa operación en español sencillo y escribe la macro — la pregunta, el manejo del rango y todo lo demás. Prueba gratis →

Otras guías

Preguntas frecuentes

¿Qué es un InputBox en VBA? Un InputBox es un cuadro de diálogo que pide al usuario que escriba un valor y lo devuelve a tu macro. VBA en realidad tiene dos: la sencilla función InputBox (siempre devuelve una cadena) y Application.InputBox (exclusiva de Excel, con un argumento Type que puede devolver un número, una fecha o un rango).

¿Cuál es la diferencia entre InputBox y Application.InputBox? InputBox siempre devuelve texto, funciona en cualquier aplicación de Office y es la opción más corta. Application.InputBox solo existe en Excel y añade un argumento Type, de modo que puede imponer y devolver un número (Type:=1), un rango seleccionado con el ratón (Type:=8) y más. Devuelve False al cancelar.

¿Cómo obtengo un número de un InputBox de VBA? Usa Application.InputBox("Mensaje", Type:=1) y guarda el resultado en una Variant. Excel rechaza automáticamente las entradas no numéricas. Comprueba la cancelación con If VarType(v) = vbBoolean Then Exit Sub antes de usar el número.

¿Cómo detecto Cancelar en un InputBox de VBA? El InputBox sencillo devuelve una cadena vacía "" al cancelar (indistinguible de un Aceptar vacío). Application.InputBox devuelve False; guárdalo en una Variant y comprueba VarType(v) = vbBoolean. Para un rango (Type:=8), envuelve la llamada en On Error Resume Next y comprueba If rango Is Nothing.

¿Cómo dejo que el usuario seleccione un rango con InputBox? Usa Application.InputBox("Elegir celdas:", Type:=8) y asigna con Set. Envuelve la llamada en On Error Resume Next … On Error GoTo 0 para que una cancelación no provoque un error de tipo, y luego comprueba If rango Is Nothing Then Exit Sub.