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 | Sí |
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.
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.
Es posible? Hay alguna otra poción?
Gracias de ante manos.
Juan C
Mensaje = [A1].Value & vbCrLf & vbCrLf
Mensaje = Mensaje & [B3].Value & vbCrLf
Mensaje = Mensaje & [C5].Value
MsgBox Mensaje
Cada valor aparecerá en una lÃnea diferente.
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.
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
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
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
Se puede modificar la posición de la ventana del MsgBox ? . Por ejemplo que se vea en el angulo superior derecho.
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.
Estimado Sergio, el cuadro de msgbox puedo ubicarlo en cualquir parte de la o es fijo, gracias
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.
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
No te recomiendo modificar los botones del MsgBox. Es mejor que crees tu propio formulario con la misma apariencia.
Echale un vistazo a este artículo:
https://www.lawebdelprogramador.com/foros/Visual-Basic/608511-Crear-msgbox-propia.html
No he tenido tiempo de ponerlo en práctica pero creo que soluciona lo que necesitas.
Saludos.
COMO HAGO PARA INGRESAR UNA GRAFICA O IMAGEN PARA QUE LA MUESTRE EL MSGBOX
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.
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”
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).
Muy bueno, gracias.
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
¡Hola Pablo!
Puedes utilizar el operador de concatenación &:
MsgBox ("Primera parte del mensaje, " & parte_calculada & ", segunda parte del mensaje")
Como puedo hacer para que al momento de ingresar un valor a una celda y esta sea mayor, salte una ventana emergente.
Hola Sebastián!
Te será suficiente con aplicar validación de datos en tu hoja. Échale un vistazo al enlace.
Muchas gracias Sergio por esta guía me fue muy util para mi trabajo, Saludos! Camilo Fernández.
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.
Hola José,
Con la herramienta Validación de datos puedes mostrar un mensaje cuando se intenta introducir un valor incorrecto.
Hola Sergio, espero estes bien , quiero saber como inhabilitar la x que sale en el msgbox dado que tengo un botón cancelar
Hola Diana,
Echale un vistazo a esta minimacro:
Sub InhabilitarX()
MsgBox "No es posible utilizar la X del MsgBox", 20, "Acción"
End Sub
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.
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.
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!!
Hola Amanda!
Así es. La respuesta enviada por el botón puedes guardarla en una variable para poder activar la hoja que quieras.
Hola Sergio, ¿Cómo se le cambiaría el color de fondo al mensaje que reemplaza a Microsoft Excel? Así lo he he visto en algunos videos de YouTube.
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).
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