La función MsgBox de VBA a fondo

Se trata de una de las funciones más utilizadas en VBA. Además de utilizarla para mostrar mensajes que requieren una acción del usuario, yo la empleo para controlar en momentos específicos, el valor de las variables que utilizo.

El uso más común que le puedes dar a la función MsgBox es el de mostrar un mensaje al usuario o el de solicitarle una respuesta simple (por ejemplo, Aceptar o Cancelar). Si has seguido algún ejemplo de los que he publicado en la web, habrás visto que la empleo a menudo, pero nunca he completado todos los argumentos que acepta.

Sintaxis de la función MsgBox

La sintaxis de la función MsgBox es la siguiente:

MsgBox (texto [, botones] [, título] [,archivo de ayuda, contexto])

  • Texto: Es el mensaje que se mostrará en el cuadro del mensaje.
  • Botones: Se trata de una o varias constantes que indican qué botones e iconos se van a mostrar en el cuadro del mensaje. En la siguiente tabla te muestro todos los botones que puedes emplear.
  • Título: Es el texto que se mostrará en el título de la ventana del cuadro.
  • Archivo de ayuda y contexto: Cuando se especifica este argumento, si el usuario pulsa la tecla de ayuda F1, se abrirá el archivo de ayuda en la parte correspondiente al cuadro del mensaje.

El argumento Texto se refiere al mensaje que se va a mostrar en el cuadro. Éste puede ser una cadena de texto o el valor de una variable. En el primer caso, debe ir siempre encerrado entre comillas.

Gracias a la flexibilidad del argumento Botones, puedes crear fácilmente muchos cuadros de mensaje diferentes. Es posible especificar qué botones quieres mostrar, si debe aparecer un icono y qué botón se muestra por defecto.

Constante Valor Descripción
vbOKOnly 0 Muestra solamente el botón Aceptar.
vbOKCancel 1 Muestra los botones Aceptar y Cancelar.
vbAbortRetryIgnore 2 Muestra los botones Anular, Reintentar y Omitir.
vbYesNoCancel 3 Muestra los botones Sí, No y Cancelar.
vbYesNo 4 Muestra los botones Sí y No.
vbRetryCancel 5 Muestra los botones Reintentar y Cancelar.
vbCritical 16 Muestra el icono de mensaje Crítico.
vbQuestion 32 Muestra el icono de Pregunta.
vbExclamation 48 Muesta el icono de mensaje de advertencia.
vbInformation 64  Muestra el icono de mensaje de Información.
vbDefaultButton1 0 El primer botón es el predeterminado.
vbDefaultButton2 256 El segundo botón es el predeterminado.
vbDefaultButton3 512 El tercer botón es el predeterminado.
vbDefaultButton4 768 El cuarto botón es el predeterminado.
vbSystemModal 0 Se suspenden todas las aplicaciones hasta que el usuario responda al cuadro de mensaje.
vbApplicationModal 4096 Convierte el cuadro del mensaje en Modal, es decir, que hasta que no se cierre no es posible utilizar ninguna otra función del programa.
vbMsgBoxHelpButton 16384 Muestra un botón de ayuda, pero no se mostrará ninguna ayuda al hacer clic en el botón.
VbMsgBoxSetForeground 65536 La ventana del mensaje se establece como ventana en primer plano.
vbMsgBoxRight 524288 Alinea el texto a la derecha.
vbMsgBoxRtlReading 1048576  Especifica que el texto debe ser leído de derecha a izquierda en árabe y hebreo.

Los primeros cinco valores (de 0 a 5) determinan el número y el tipo de botones que se van a mostrar en el cuadro del mensaje, los cuatro siguientes (de 16 a 64) indican el estilo de icono, los cuatro siguientes (de 0 a 768) hacen referencia al botón predeterminado, los dos siguientes (0 y 4096) hacen referencia al tipo de modalidad del cuadro, y el resto de constantes o valores especifican si el cuadro de mensaje es la ventana en primer plano, la alineación y la dirección del texto.

Tres formas de mostrar el argumento Botones

Para mostrar uno o varios valores para este argumento, puedes hacerlo de tres formas diferentes. Te muestro cómo serían las tres formas si quisieras mostrar un cuadro de mensaje con el texto “Estoy aprendiendo a utilizar la función MsgBox”, con los botones Sí, No y Cancelar, que además se muestre un icono de interrogación, que el segundo botón (No) sea el predeterminado y que el texto del mensaje esté alineado a la derecha:

  • Puedes utilizar la forma clásica, es decir, utilizando el nombre de la constante:
a = MsgBox("Estoy aprendiendo a utilizar la función MsgBox", _
vbYesNoCancel + vbQuestion + vbDefaultButton2 + vbMsgBoxRight)
  • También puedes utilizar el valor equivalente de cada constante:
a = MsgBox("Estoy aprendiendo a utilizar la función MsgBox", 3 + 32 + 256 _
+ 524288)
  • Por último, puedes usar el valor de la suma de los argumentos (3+32+256+524288)
a = MsgBox("Estoy aprendiendo a utilizar la función MsgBox", 524579)

Personalmente prefiero la primera opción, porque es mucho más fácil de recordar el nombre de una constante que su valor. Tú puedes utilizar la que prefieras en cada momento, ya que cualquiera de las tres opciones es exactamente la misma.

Habrás observado que he asignado a la variable a, el resultado del cuadro del mensaje, es decir, el botón que pulsa el usuario. Si no le asignase el valor a una variable, la sintaxis anterior mostraría un error. Esto no sería necesario si utilizaras la función MsgBox solamente para mostrar el mensaje.

Para obtener una respuesta de un cuadro de mensaje, debes asignar el resultado de la función MsgBox a una variable. En el código que te muestro a continuación, he utilizado la constante (en vez de su valor), para que te resulte más claro:

Sub Continuar()
Dim Respuesta As Integer ' La función devuelve un valor entero
Respuesta = MsgBox("¿Deseas continuar?", vbYesNo)
Select Case Respuesta
    Case vbYes
        MsgBox "Has indicado que deseas continuar"
    Case vbNo
        MsgBox "Has indicado que no deseas continuar"
End Select
End Sub

¿Qué resultados puede devolver MsgBox?

Estos son todos los valores que puede devolver la función MsgBox:

Constante Valor Botón en el que se ha pulsado
vbOK 1 Aceptar
vbCancel 2 Cancelar
vbAbort 3 Anular
vbRetry 4 Reintentar
vbIgnore 5 Omitir
vbYes 6
vbNo 7 No

El ancho del cuadro de mensaje depende de la longitud del mensaje y de la resolución de pantalla que tengas. Si quieres introducir un salto de línea para que el mensaje quede algo más estético, debes utilizar la constante vbCrLf (o vbNewLine). Observa el siguiente ejemplo:

Mensaje = "Esta es la primera línea" & vbCrLf & vbCrLf
Mensaje = Mensaje & "Esta es la segunda línea" & vbCrLf
Mensaje = Mensaje & "Y esta, la tercera línea"
MsgBox Mensaje

El argumento Título no tiene más misterio que el argumento Texto. Puedes utilizar una cadena de texto entre comillas o una variable. Este contenido se mostrará en la barra de título del cuadro del mensaje, sustituyendo al mensaje estándar “Microsoft Excel”.

El argumento Archivo de ayuda hace referencia a la ubicación del archivo donde se encuentra la ayuda del cuadro del mensaje. El argumento Contexto indica dónde se encuentra exactamente la ayuda dentro del archivo de ayuda.

Comenta si te ha parecido interesante.

Respuestas

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

    1. para indicar que el archivo de ayuda se encuentra en la misma ubicacion. Al hacer clic sobre el boton Ayuda, se abrira una nueva ventana que nos permitira visualizar el archivo indicado. Con este ultimo ejemplo hemos cubierto todos los argumentos de la funcion MsgBox en VBA y estas listo para comenzar a crear tus propios mensajes dentro de tus aplicaciones de Excel. Descarga el libro de trabajo para probar por ti mismo cada uno de los ejemplos y seguir experimentando con la funcion MsgBox.

  1. Buen día, hay alguna forma de que el MsgBox devuelva varias lineas con valores de varias celdas
    Es posible? Hay alguna otra poción?
    Gracias de ante manos.

    Juan C

  2. Juan Carlos, teniendo en cuenta el último ejemplo y suponiendo que quisieras mostrar los valores de las celdas A1, B3 y C5, el código sería el siguiente:

    Mensaje = [A1].Value & vbCrLf & vbCrLf
    Mensaje = Mensaje & [B3].Value & vbCrLf
    Mensaje = Mensaje & [C5].Value
    MsgBox Mensaje

    Cada valor aparecerá en una línea diferente.

  3. Buenas tardes Sergio. Muy interesante el tema de Msgbox y lo estoy aplicando en el archivo que uso a diario, pero tengo una duda, necesito aplicar msgbox en una hoja y el msgbox tiene que dar muchos mensajes según las condiciones que le indique. Por ejemplo:

    Si la celda B1 es diferente a la celda B300 entonces el msgbox seria “Hay diferencia en las celdas A1 y A300 por Bs. xxxxx,xx, favor revisar”
    Si la celda B1 es diferente a la celda B300 entonces el msgbox seria “Hay diferencia en las celdas B1 y B300 por Bs. xxxxx,xx, favor revisar”
    Si la celda B1 es diferente a la celda B300 entonces el msgbox seria “Hay diferencia en las celdas C1 y C300 por Bs. xxxxx,xx, favor revisar”
    Y así sucesivamente. Son más de 100 comparaciones que debe hacer la función msgbox en la hoja, y por ende será un mensaje para cada SI según cada caso.
    Sería genial que en el mensaje pudiera mostrarse el valor de la diferencia entre las celdas a comparar.
    Estoy segura que es posible, pero no concibo la forma de hacerlo. Si está en tus manos poder ayudarme te lo agradezco de antemano.

    1. Sinceramente, no me parece buena idea ya que al ejecutar la macro, tendrías que aceptar los más de 100 mensajes que quieres crear.
      Por favor, entra en el foro de la web y te ayudaremos desde allí.

      Saludos

  4. buenas tardes seguio te queria preguntar cuando muesta el MSGBOX con las opciones de aceptar y cancelar si yo acepto corre el codigo pero si le doy cancelar tambien , no se como asociar el cancelar para que no me ejecute mas la accion , te agradesco mucho por una respuesta

    1. Pon algo así.
      if respuesta (donde se guarda el valor del msgbox o toda la sintáxis)=vbacept then
      y aquí lo que va a hacer
      elseif respuesta=vbcancel then
      exit sub
      end if

  5. Se puede modificar la posición de la ventana del MsgBox ? . Por ejemplo que se vea en el angulo superior derecho.

    1. wfredo, hasta donde yo sé, los MsgBox no pueden posicionarse de forma personalizada en la pantalla. Si realmente necesitas que el cuadro se muestre en otro lugar, te sugiero que pruebes a crear un UserForm con la misma apariencia que el MsgBox. Los UserForms son más versátiles y podrás hacer que aparezca en el lugar de la pantalla que desees.

    1. Juan Carlos, el MsgBox siempre aparece en el centro de la pantalla. Si quisieras ubicarlo en otra parte, te sugiero que crees un UserForm con apariencia de MsgBox y modifiques los parámetros de localización.

  6. Hola! queria saber como puedo cambiar el nombre del boton acceptar a accept.
    por ejemplo: msgbox”Welcome our program”
    y saldra aceptar abajo yo quiero que salga “ACCEPT”
    como puedo hacer eso? de ante mano muchas gracias

    1. Lo siento, Ismael, pero los MsgBox no pueden mostrar imágenes. Te sugiero que crees un Userform con la misma apariencia que el MsgBox. Ahí sí podrás insertar imágenes.

  7. Gracias por la información, fue de mucha utilidad pero tengo una duda. Quiero mostrar en un MsgBox la fecha que hay en una celda especifica. Cuando escribo el código de esta manera:

    Sub Muestra_hora ()

    MsgBox Now()

    End Sub

    Funciona perfecto, pero no quiero que muestre Now sino la fecha de la celda que quiero. Intente con esto:

    Sub Muestra_hora ()

    MsgBox TimeValue (Range(“A1”).Value)

    End Sub

    Pero me dice que hay un Error “13”

    1. Hola, JoseG. No hace falta que compliques tanto la cosa. Si la fecha se encuentra en una celda, haz referencia a la celda. Si está en A1, simplemente utiliza Range(A1).

  8. Muchas gracias por la nota.
    Tengo un problema de como agregar a un mismo cuadro el valor de una variable y un texto que lo acompañe.
    Ej: Faltan 20 días para reunión.
    Donde 20 fue un valor calculado.

    Muchas gracias

    1. ¡Hola Pablo!
      Puedes utilizar el operador de concatenación &:
      MsgBox ("Primera parte del mensaje, " & parte_calculada & ", segunda parte del mensaje")

  9. Buen dia Sergio

    Como puedo hacer para que en determinadas celdas al ingresar un texto me de un mensaje determinado.

    es decir si introduzco un texto me devuelva una alerta y me diga que hay que hacer una acción determinada.

    yo definiría que texto evaluar y que mensaje debe mostrar.

    1. Hola José,

      Con la herramienta Validación de datos puedes mostrar un mensaje cuando se intenta introducir un valor incorrecto.

  10. Hola Sergio, espero estes bien , quiero saber como inhabilitar la x que sale en el msgbox dado que tengo un botón cancelar

    1. Hola Diana,

      Echale un vistazo a esta minimacro:

      Sub InhabilitarX()
      MsgBox "No es posible utilizar la X del MsgBox", 20, "Acción"
      End Sub

  11. Hola Buenos días, quiero saber si se puede aumentar el tamaño de caja de dialogo que muestra la función msgbox. Gracias y lo felicito mucho por su dedicación para enseñarnos sobre este tema.

    1. Hola Víctor,
      Una de las formas ‘fáciles’ de hacerlo es agregar espacios a la izquierda y a la derecha del texto que quieras mostrar. Si lo que quieres es aumentar su tamaño verticalmente, concatena el texto con la función chr(10) las veces que estimes necesarias.

  12. Hola, buenas noches Sergio. Tenía una duda respecto las opciones de funcionalidad de MsgBox. Una vez le das a aceptar, ¿Se puede vincular ese “Aceptar” con una tabla de datos, estática o dinámica, para que cuando pulse ese botón de Aceptar me lleve a la Hoja de Excel con dicha tabla?
    Muchas gracias!!

    1. Hola Amanda!
      Así es. La respuesta enviada por el botón puedes guardarla en una variable para poder activar la hoja que quieras.

    1. Hola Hugo! Hasta donde yo sé solo se puede cambiar el color desde la configuración de Windows (puedes cambiar la apariencia de las barras de título de todas las ventanas).

  13. Hola Sergio. Estoy haciendo un formulario y quiero que al apretar el botos de guardar salga un msgbox que indique un texto con las opciones “yes” o “no”. La idea es que al indicar “yes” grabe la informacion del formulario, pero al indicar, “no” cierre el msgbox pero no el formulario, así para poder modificar la información que se haya ingresado mal ala formulario. cómo se puede hacer esto? Gracias