martes, 19 de abril de 2016

VBA: El método PopUp en programación de Excel.

Hoy veremos un método de VBA Excel que nos permite controlar el tiempo de exposición de un MsgBox, veremos el método .PopUp.
Este método tiene la siguiente sintaxis:
objeto.PopUp: .Popup(Texto,[Tiempo en segundos],[Titulo MsgBox],[Tipo])

Siendo relevantes las posibles constantes a emplear en el cuarto parámetro: Tipo.
Desde este controlamos el aspecto del cuadro diálogo. Veamos cuales son las constantes a nuestra disposición.
Nota: Son similares a las que podemos emplear directamente en un MsgBox, pero con alguna adicional.


En este primer cuadro describimos el número y tipo de botones a mostrar en el cuadro de diálogo:
MiembroValorValor HexadecimalDescripción
OKOnly00x0Muestra sólo el botón Aceptar.
OKCancel10x1Muestra los botones Aceptar y Cancelar.
AbortRetryIgnore20x2Muestra los botones Anular, Reintentar y Omitir.
YesNoCancel30x3Muestra los botones Sí, No y Cancelar.
YesNo40x4Muestra los botones Sí y No.
RetryCancel50x5Muestra los botones Reintentar y Cancelar.
 60x6Muestra los botones Reintentar, Cancelar y Continuar.


Para describir el estilo del icono.
MiembroValorValor HexadecimalDescripción
Critical160x10Muestra el icono Mensaje crítico.
Question320x20Muestra el icono Consulta de advertencia.
Exclamation480x30Muestra el icono Mensaje de advertencia.
Information640x40Muestra el icono Mensaje de información.


El tercer grupo determina qué botón es el valor predeterminado.
MiembroValorValor HexadecimalDescripción
DefaultButton100x000El primer botón es el predeterminado.
DefaultButton22560x100El segundo botón es el predeterminado.
DefaultButton35120x200El tercer botón es el predeterminado.
DefaultButton47680x300El cuarto botón es el predeterminado.


El cuarto grupo determina la modalidad del cuadro de mensaje.
MiembroValorValor HexadecimalDescripción
ApplicationModal00x0000Aplicación modal: el usuario debe responder al cuadro de mensaje antes de continuar trabajando en la aplicación actual.
SystemModal40960x1000Sistema modal: se suspenden todas las aplicaciones hasta que el usuario responda al cuadro de mensaje.



Y el quinto grupo especifica si el cuadro de mensaje es la ventana de primer plano, junto con la alineación y la dirección del texto.
MiembroValorValor HexadecimalDescripción
VbMsgBoxHelpButton163840x4000Agrega el botón Ayuda al cuadro de mensaje.
MsgBoxSetForeground655360x10000Especifica la ventana del cuadro de mensaje como ventana de primer plano.
MsgBoxRight5242880x80000Texto alineado a la derecha.
MsgBoxRtlReading10485760x100000Especifica que el texto debe aparecer para ser leído de derecha a izquierda en los sistemas árabe y hebreo.


Recordemos que a la hora de sumar números para crear el valor final del argumento Tipo (cuarto argumento del método .PopUp) , se debe utilizar únicamente un número de cada grupo!!!.

Para mostrar un ejemplo práctico, insertamos el siguiente código dentro de la ventana de código de un módulo estándar desde el editor de VB:

Option Explicit
Const Tempus = 2 'Segundos
  
Sub MsgBox_con_Temporizador()
Dim objShell As Object
Dim respuesta1 As Integer, respuesta2 As Integer, respuesta3 As Integer

Set objShell = CreateObject("WScript.Shell")
'Sintáxis Método PopUp:  .Popup(Texto,[Tiempo en segundos],[Titulo MsgBox],[Tipo Botón])
respuesta1 = objShell.Popup("Mensaje 1 Retrasado en 2 Segundos.", Tempus, "excelforo.com", 6 + vbQuestion)
respuesta2 = objShell.Popup("Mensaje 2 Retrasado en 2 Segundos.", Tempus, "excelforo.com", vbYesNo + vbExclamation)
respuesta3 = objShell.Popup("Mensaje 3 Retrasado en 2 Segundos.", Tempus, "excelforo.com", vbRetryCancel + vbInformation)

Set objShell = Nothing
  
End Sub



Para poder trabajar con las posibles respuestas tendremos presente el siguiente cuadro de valores de respuesta del método:
MiembroValor decimalDescripción
 -1Valor cuando el usuario no hace clic en ningún botón después de transcurridos los N segundos.
vbOK1Aceptar
vbCancel2Cancelar
vbAbort3Anular
vbRetry4Reintentar
vbIgnore5Ignorar
vbYes6
vbNo7No
 11Continuar


En el ejemplo observamos tres ejemplos del método .PopUp, aplicando un retardo de dos segundos entre cada MsgBox, y mostrando diferentes combinaciones de botones, iconos o estilos...
Notemos que la cuestión temporal en VBA es siempre muy aproximada y que dependiendo de los procesos abiertos en nuestro equipo, el tiempo estipulado será más o menos preciso (normalmente 'menos').

6 comentarios:

  1. Muy bueno. Muchas gracias.
    Me han venido muy bien para un programa mío pero a veces pasa el tiempo y no se cierra. ¿Se podría solucionar esto?
    Gracias

    ResponderEliminar
    Respuestas
    1. Hola Sara,
      no, solo tienes el controlador que se indica...
      a veces puede ocurrir que el equipo esté empleando sus recursos en otros procesos y eso de la sensación de bloqueo.
      :'(

      Saludos

      Eliminar
  2. Muchas gracias por contestar ¡ y tan rápido!. No llego a saber porqué se queda la ventana sin cerrar, solo pasa en algunas ocasiones. He metido un DoEvents antes del popup y parece que funciona.
    Gracias de nuevo

    ResponderEliminar

Nota: solo los miembros de este blog pueden publicar comentarios.