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

VBA MsgBox en Excel — Sí/No, botones y la regla de los paréntesis

|

VBA MsgBox en Excel — Sí/No, botones y la regla de los paréntesis

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

En resumenMsgBox 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

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.