Probado en: Excel 365 v2509 · Excel 2021 · Excel 2019 · última verificación: 06/06/2026
En resumen — MsgBox muestra al usuario un mensaje corto y unos botones, y luego te dice qué botón pulsó. Dos usos — anunciar algo y plantear una pregunta sí/no:
Sub MsgBoxBasico()
' 1. Anunciar — mostrar y olvidar (una instrucción, SIN paréntesis)
MsgBox "Importación terminada.", vbInformation, "Listo"
' 2. Preguntar — capturar la respuesta (una función, paréntesis OBLIGATORIOS)
Dim respuesta As VbMsgBoxResult
respuesta = MsgBox("¿Eliminar la fila seleccionada?", vbYesNo + vbQuestion, "Confirmar")
If respuesta = vbYes Then
Selection.EntireRow.Delete
End If
End Sub
Esa única diferencia — paréntesis o no — está detrás de casi todos los «Expected: end of statement» que la gente sufre con MsgBox. Todo esta guía gira en torno a ella.
El modelo mental: MsgBox es un interfono, no un teclado
Imagina un interfono en la pared. Puedes difundir una frase a quien escuche y ofrecerle un pequeño conjunto de botones para responder — Sí, No, Cancelar, Reintentar. Lo que no puedes hacer es oírlo teclear una frase. En cuanto necesitas entrada libre — un nombre de archivo, un número, una fecha — has superado a MsgBox y quieres InputBox o un UserForm.
Así que MsgBox hace bien exactamente dos cosas: decirle algo al usuario o plantear una pregunta cerrada y ramificar según el clic. Limítate a eso y nunca se te resistirá.
La única regla: forma instrucción contra forma función
MsgBox tiene dos caras, y la que uses decide si los paréntesis son válidos.
Forma instrucción — solo quieres mostrar el mensaje y no te importa el clic:
MsgBox "¡Guardado!" ' ✅
MsgBox "¡Guardado!", vbInformation, "Estado" ' ✅ argumentos separados por comas, SIN paréntesis
MsgBox ("¡Guardado!", vbInformation) ' ❌ Expected: end of statement
Esa última línea falla porque VBA lee ( … ) tras una instrucción como «evalúa esta única expresión», y "¡Guardado!", vbInformation no es una sola expresión — es una lista de argumentos. Los paréntesis solo van en una llamada a función.
Forma función — quieres el valor de retorno, así que lo asignas, y ahora los paréntesis son obligatorios:
Dim r As VbMsgBoxResult
r = MsgBox("¿Sobrescribir el archivo?", vbYesNo) ' ✅ se usa el valor de retorno → paréntesis necesarios
La regla en una frase: valor de retorno usado → paréntesis; ignorado → sin paréntesis. Interiorízala y el error desaparece para siempre.
Lee la respuesta por su nombre, nunca por su número
MsgBox devuelve un entero, pero nunca lo compares con un número crudo. vbYes resulta ser 6 — escribe vbYes, no 6. Las constantes con nombre se leen como lenguaje natural y sobreviven a quien relea la macro (tú incluido, más adelante):
Select Case MsgBox("¿Guardar los cambios antes de cerrar?", vbYesNoCancel + vbExclamation)
Case vbYes: ThisWorkbook.Save
Case vbNo: ' cerrar sin guardar — no hacer nada
Case vbCancel: Exit Sub ' el usuario se echa atrás → detener toda la macro
End Select
Este vbYesNoCancel de tres ramas es el patrón que conviene memorizar: Cancelar = «he cambiado de idea, para todo». Hónralo con Exit Sub y tus usuarios confiarán en la macro.
Botones e iconos se combinan con +
El segundo argumento mete dos decisiones independientes — qué botones y qué icono — en un solo número, así que se suman:
MsgBox "El disco está casi lleno.", vbOKOnly + vbCritical ' icono ✖ rojo
MsgBox "¿Ejecutar el proceso nocturno ahora?", vbYesNo + vbQuestion ' icono ? azul
MsgBox "Fallo de red: ¿reintentar?", vbRetryCancel + vbExclamation ' icono ! amarillo
Viven en «casillas» distintas del número, por eso + funciona limpiamente. ¿Quieres resaltar un botón que no sea el predeterminado (para que un Intro descuidado no borre nada)? Añade vbDefaultButton2 para que el segundo botón sea el predeterminado.
Inserta una variable en el mensaje
Un texto constante es raro en macros reales — casi siempre quieres informar de un recuento, un nombre, un resultado. Concatena con & y usa vbNewLine para apilar líneas:
Dim n As Long
n = WorksheetFunction.CountA(Range("A:A")) - 1
MsgBox "Procesadas " & n & " filas." & vbNewLine & _
"Terminado a las " & Format(Now, "hh:mm:ss"), vbInformation, "Informe"
Ese & (no +) para unir texto, y vbNewLine para el salto, son las dos cosas que más se olvidan.
No uses MsgBox para depurar
El mal uso más común: salpicar MsgBox x por un bucle para «ver el valor». En 500 filas son 500 clics — y la macro se congela en cada uno. MsgBox es modal: bloquea hasta el clic, a propósito, porque existe para que un humano se detenga y decida.
Para observar valores mientras desarrollas, usa la ventana Inmediato:
Debug.Print "fila " & i & " = " & celda.Value ' Ctrl+G para leerlo, cero clics, sin bloqueo
Regla práctica: MsgBox es una puerta de decisión para el usuario final; Debug.Print es la herramienta de salida del desarrollador. Confundirlas es lo que hace que las macros resulten torpes.
Errores frecuentes con MsgBox (y la solución)
| Síntoma | Causa | Solución |
|---|---|---|
| «Expected: end of statement» | Paréntesis en la forma instrucción: MsgBox ("Hola", vbYesNo) |
Quita los paréntesis o asigna el resultado: r = MsgBox("Hola", vbYesNo) |
| La respuesta nunca coincide | Comparar con números mágicos 6 / 7 |
Comparar con las constantes vbYes / vbNo |
| La macro sigue tras Cancelar | Solo se comprobó vbYes, se ignoró vbCancel |
Añade Case vbCancel: Exit Sub |
| El título sale en el sitio equivocado | El orden es prompt, botones, título |
El título es el tercer argumento: MsgBox "Texto", vbOKOnly, "Título" |
| Texto y número pegados | Unidos con +, que suma o falla |
Une con &: "Total " & n |
| Botones + icono no aparecen juntos | Una coma entre ellos | Combínalos con +: vbYesNo + vbQuestion |
Sáltate la fontanería del diálogo — describe la regla y ya
Una confirmación con MsgBox está bien para una decisión. Pero cuando la lógica detrás de la decisión es el verdadero trabajo — «antes de eliminar, comprobar que la columna D está vacía y la fecha ya pasó» —, ahí está el esfuerzo. ExcelMaster Agent te deja enunciar la regla en español sencillo — «elimina las filas con estado vacío y cuya fecha de vencimiento ya pasó, pero pregúntame primero» — y escribe la comprobación, la confirmación y el borrado por ti. Prueba gratis →
Otras guías
- VBA InputBox en Excel — los dos InputBox y cuándo usar cada uno
- VBA UserForm en Excel — crea un formulario de entrada de datos real
- VBA If Then Else en Excel — condiciones bien hechas
- VBA Bucle For en Excel — 8 ejemplos reales
Preguntas frecuentes
¿Qué es MsgBox en VBA?
MsgBox es una función integrada de VBA que muestra un pequeño cuadro de diálogo con un mensaje y uno o más botones, y luego devuelve un valor que indica qué botón pulsó el usuario. Úsala para informar al usuario o plantear una simple pregunta sí/no.
¿Por qué obtengo «Expected: end of statement» con MsgBox?
Porque pusiste los argumentos entre paréntesis mientras usas MsgBox como instrucción, p. ej. MsgBox ("Hola", vbYesNo). Los paréntesis solo se permiten cuando capturas el valor de retorno: respuesta = MsgBox("Hola", vbYesNo). Sin valor de retorno, quita los paréntesis: MsgBox "Hola", vbYesNo.
¿Cómo hago un cuadro de mensaje Sí/No en VBA?
Llama a MsgBox como función con la constante vbYesNo y lee el resultado: If MsgBox("¿Continuar?", vbYesNo) = vbYes Then …. Añade vbQuestion para el icono de interrogación: vbYesNo + vbQuestion.
¿Cómo muestro un icono en un MsgBox de VBA?
Suma una constante de icono con + al argumento de botones: vbCritical (✖ rojo), vbExclamation (! amarillo), vbQuestion (? azul) o vbInformation (i azul). Ejemplo: MsgBox "Listo", vbOKOnly + vbInformation.
¿Cómo pongo una variable en un MsgBox?
Une el texto y la variable con &: MsgBox "Total: " & total. Usa vbNewLine para empezar una nueva línea dentro del mensaje.
¿Cuál es la diferencia entre MsgBox e InputBox?
MsgBox solo muestra un mensaje y devuelve qué botón se pulsó — no puede aceptar texto tecleado. InputBox pide al usuario que escriba un valor y devuelve lo que introdujo. Usa MsgBox para informar o confirmar, InputBox para recoger entrada.
