La función MsgBox en Excel VBA se utiliza para mostrar mensajes, información y alertas al usuario en forma de una caja de texto.
Estas cajas pueden configurarse a través de su contenido, título, íconos y botones, para adaptarla al contexto que deseamos que aparezcan. Si bien en algunos casos puede bastarnos con informar de un evento al usuario, los MsgBox proporcionan la ventaja de obtener respuestas sencillas del usuario en una forma que a todos nos resulta familiar (¿a quién no le ha aparecido alguna vez una ventana como estas al ejecutar cualquier programa en su ordenador?).Como podemos intuir de su nombre, la parte principal de un MsgBox es el mensaje mostrado, y es de hecho el único argumento obligatorio que debemos especificar al invocarlo. Sin embargo, configurar apropiadamente los títulos, íconos y botones ayudará a dar un aspecto más profesional al mensaje, y permitirá que el usuario interactúe con nuestra macro de la forma que lo definamos. En todo momento, durante la ejecución de una macro, el código se detendrá hasta obtener una interacción por parte del usuario, por lo cual podemos utilizarlo también como validación y control.
Veamos un ejemplo, basado en el MsgBox que mostramos al inicio del artículo, el cual fue elaborado a partir del siguiente código:
MsgBox "Esto es un MsgBox", vbOKOnly + vbInformation, "Blog de Escuela Directa"
Bastante sencillo, ¿verdad? En él, podemos identificar distintos elementos que se muestran luego en la ventana: el primer argumento es el mensaje propiamente dicho. A continuación, tenemos como argumento la suma de vbOKOnly + vbInformation, lo que significa que el botón será únicamente de Aceptar (OK Only), y el ícono mostrado en la ventana será uno de información (i). Finalmente, tenemos el título que se mostrará en el encabezado de la ventana.
VBA nos irá asistiendo con los argumentos que espera recibir si tenemos la ayuda activada (Herramientas > Opciones > Tildar Información rápida automática):
Como dijimos, solo el primer argumento es obligatorio (nos damos cuenta porque es el único que no aparece entre [ ] en la imagen anterior), pero a cambio obtendremos un MsgBox sumamente sencillo:MsgBox "Esto es un MsgBox"
Quizá te preguntes por qué el argumento vbOKOnly + vbInformation aparece en forma de suma en lugar de representarse como dos argumentos separados. Esto obedece al diseño de la función en VBA, dado que en realidad cada alternativa de parámetro de botones e íconos puede representarse con un número diferente, al igual que cada combinación (sumada) arroja un número distinto. De hecho, podríamos escribir el número en lugar de la descripción de la opción elegida, pero resultaría menos interpretable al leer el código. Veamos de qué opciones disponemos en cada caso:
Es decir que, siguiendo los lineamientos anteriores, resultaría equivalente expresar:
MsgBox "Ha habido un error", vbCritical + vbRetryCancel, "Error"
que:
MsgBox "Ha habido un error", 16 + 5, "Error"
o (haciendo la suma de 16+5):
MsgBox "Ha habido un error", 21, "Error"
Ya que en todos los casos se mostrará el mismo MsgBox:
Finalmente, debes saber que el sólo hecho de crear o configurar los botones que mostrará el MsgBox, no afectará el funcionamiento de tu código: para ello, debemos asociar el presionar un botón con la ejecución de una porción de código determinada. En primer lugar deberemos capturar en una variable la opción que elija el usuario, por ejemplo:
OpcionElegida = MsgBox("Ha habido un error", 21, "Error")
Como ves, hemos tenido que implementar un pequeño cambio en la función MsgBox, y ahora todos los argumentos se encierran entre paréntesis.
Ahora, podremos definir con estructuras condicionales (If... Else o Select Case), qué ocurrirá con nuestro código, en función del valor que tenga almacenada la variable OpcionElegida.
En función del botón presionado, se almacenará un valor determinado. En el ejemplo anterior, supongamos que el usuario presiona "Cancelar": esto supondrá que luego la variable OpcionElegida contenga la constante vbCancel, o de manera equivalente, el número 2, de acuerdo a la siguiente tabla de conversión: