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

¿Fue útil?

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: status EG

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 a 0-Manual y Top y Left 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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top