20

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 0 Aceptar
vbCancel 1 Cancelar
vbAbort 2 Anular
vbRetry 3 Reintentar
vbIgnore 4 Omitir
vbYes 5
vbNo 6 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.

¡Compartir es vivir!
Sergio
 

La destreza y el perfeccionismo quizá sean las dos virtudes que me permiten ayudar a mis clientes a facilitar las tareas administrativas de sus negocios.

Haz clic aquí para dejar un comentario 20 comentarios
juan rosado

Muy completo y muy bien explicado. Continua con estos artículos.

Responder
Guillermo Chavez

Muy buena informacion sobre esta formula, relamente los tips que das para el buen manejo de excel son muy buenos, muchas gracias.

Responder
Juan Carlos

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

Responder
Sergio

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.

Responder
Msalamanquez

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.

Responder
    Sergio

    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

    Responder
oscar

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

Responder
wfredo

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

Responder
    Sergio

    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.

    Responder
juan carlos

Estimado Sergio, el cuadro de msgbox puedo ubicarlo en cualquir parte de la o es fijo, gracias

Responder
    Sergio

    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.

    Responder
camila iriarte

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

Responder
ISMAEL HERNANDEZ

COMO HAGO PARA INGRESAR UNA GRAFICA O IMAGEN PARA QUE LA MUESTRE EL MSGBOX

Responder
    Sergio

    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.

    Responder
JoseG

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”

Responder
    Sergio

    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).

    Responder
Eleazar Cruces

Muy bueno, gracias.

Responder
Pablo

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

Responder
    Sergio

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

    Responder

Escribe una respuesta: