Perspectivas macro VBA: La mejor manera para indicar 'por favor espere'
Pregunta
¿Cuál es la mejor práctica para indicar al usuario que está ejecutando una macro dentro de Outlook? La macro puede tomar alrededor de 1-30 segundos en completarse.
Quiero evitar un modal se ejecuta 'MsgBox' apareciendo antes de la macro, ya que esto puede ser molesto.
Yo preferiría evitar el cursor de reloj de arena, si es posible, y se preguntó si había una manera mejor.
¿Hay una manera de colocar un mensaje no modal 'estado' arriba, mientras se ejecuta la macro?
(La macro tengo carreras contra el MailItem seleccionado en ese momento - y se puso en marcha mediante un botón en la barra de herramientas de acceso rápido).
Solución
Este artículo ( también esta ) en las mejores prácticas dice utilizar la barra de estado.
Este artículo en perspectiva dice:
Cambio de la barra de estado
No hay manera de cambiar el texto en la barra de estado Microsoft Outlook. La barra de estado es no expuesto como lo es en otra modelos de objetos de Microsoft Office.
Outlook.com proporciona código para un cuadro de progreso .
Otros consejos
Un par de cosas que cadena, no estoy seguro de otra tendrá ideas.
1.Show un formulario con una barra de progreso en ella que los informes de progreso o tiene la barra de progreso en el modo de marca si no se puede informar sobre el progreso 2.Show un formulario con un cuadro de imagen con su gif animado favorito en el interior (spinny pizza, etc.). Puede desactivar los botones etc. 3. Utilice Windows API para obtener jugar con la barra staus perspectivas
Sin saber lo que está haciendo en su macro puede que tenga que ocuparse de mantener la forma “visible” y bombear el progreso asíncrono en ella.
Saludos
Marcus
Ampliando la respuesta de @ 76mel, una buena manera de hacerlo es con un formulario de usuario no modal. Hacer algo realmente sencillo, con sólo una etiqueta y un subtítulo de la siguiente manera:
Lo que me gusta hacer es tener el formulario de usuario establecer como:
- No modal (en las propiedades F4 , ajuste
ShowModal
a falso)- Esto significa que usted puede hacer clic fuera de la barra de estado y que no te detenga.
- fijo el
StartupPosition
a0-Manual
yTop
yLeft
a algo así como 100, de modo que la forma de estado aparece en la esquina superior izquierda de la pantalla (fuera del camino de los demás mensajes que aparecen en el centro de manera predeterminada)
Establecer value
de la etiqueta para un texto por defecto para cuando las primeras cargas de formulario de usuario
Public strStatus As String
Public Const defaultStatus As String = "Default status text" 'set this to whatever you want
Sub statusReporter()
frmStatus.Show
'''
'Your code here
'''
frmStatus.lblStatus = "Step 1"
'...
frmStatus.lblStatus = "Step 2"
'...
'''
'Unload the form
'''
frmStatus.lblStatus = defaultStatus
frmStatus.Hide
End Sub
Tenga en cuenta, al igual que con Application.Statusbar
de Excel debe restablecer el formulario de usuario a su valor por defecto si va a utilizarlo más adelante en la misma instancia de Excel
utilizar Opcionalmente esto también
'Written By RobDog888 - VB/Office Guru™
'Add a Command Button so you can toggle the userform's topmost effect
Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" ( _
ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long
Private Declare Function SetWindowPos Lib "user32" ( _
ByVal hwnd As Long, _
ByVal hWndInsertAfter As Long, _
ByVal X As Long, _
ByVal Y As Long, _
ByVal cx As Long, _
ByVal cy As Long, _
ByVal wFlags As Long) As Long
Private Const HWND_TOPMOST = -1
Private Const HWND_NOTOPMOST = -2
Private Const SWP_NOMOVE = &H2
Private Const SWP_NOSIZE = &H1
Private mlHwnd As Long
Private Sub UserForm_Initialize()
Dim overTim As Single
overTim = Timer
mlHwnd = FindWindow("ThunderDFrame", "Status") 'Change "Status" to match your userforms caption
Do While mlHwnd = 0 And Timer - overTim < 5
mlHwnd = FindWindow("ThunderDFrame", "Status")
DoEvents
Loop
'Set topmost
SetWindowPos mlHwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE
End Sub
en el código UserForm sí para mantenerlo siempre en la parte superior