Outlook macro VBA: Il modo migliore per indicare 'attendere'
Domanda
Qual è la migliore pratica per indicare all'utente che una macro è in esecuzione all'interno di Outlook? La macro può richiedere circa 1-30 secondi.
Voglio evitare un modale viene eseguito 'msgbox' popping up prima della macro, in quanto questo può essere fastidioso.
avrei preferito evitare il cursore a clessidra, se possibile, e mi chiedevo se ci fosse un modo migliore.
C'è un modo di porre un messaggio non modale 'status' su, mentre l'esecuzione della macro?
(La macro ho corse contro il MailItem attualmente selezionato - ed è lanciato da un pulsante sulla barra di accesso rapido).
Soluzione
Questo articolo ( anche questo ) sulle migliori pratiche dice utilizzare la barra di stato.
Questo articolo su Outlook dice:
Modifica della barra di stato
Non c'è modo per cambiare il testo della barra di stato in Microsoft Outlook. La barra di stato è non esposto come in altri Microsoft Office modelli di oggetti.
Altri suggerimenti
Un paio di cose che stringa in mente, io sono sicuro che altri avranno le idee pure.
1.Show un modulo con una barra di avanzamento su di esso che segnala il progresso o ha la barra di avanzamento in modalità marque se non è possibile segnalare il progresso 2.Show un modulo con una casella di immagine con la vostra gif animate preferito all'interno (spinny la pizza, ecc). È possibile disattivare i pulsanti ecc 3. Utilizzare vincere api per ottenere giocare con la barra staus prospettive
Non sapendo cosa si sta facendo nella macro si può avere a che fare con il mantenimento della forma “in alto” e pompando il progresso asincrono in esso.
Saluti
Marcus
Ampliando @ risposta di 76mel, un bel modo per farlo è con un form non modale. Fare qualcosa di veramente semplice, con solo un'etichetta e la didascalia in questo modo:
Quello che mi piace fare è avere il form impostato come:
- non modale (nelle proprietà di F4 , impostare
ShowModal
false)- Questo significa che è possibile fare clic al di fuori della barra di stato e non ti fermare.
- Ho impostato il
StartupPosition
per0-Manual
eTop
eLeft
a qualcosa come 100 in modo che la forma di stato viene visualizzato nell'angolo in alto a sinistra dello schermo (fuori del modo di tutti gli altri messaggi che appaiono nel centro di default)
Imposta value
della griffe per un testo predefinito per quando i primi carichi form
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
Nota, come con Application.Statusbar
di Excel è necessario ripristinare il form al suo valore di default, se si prevede di utilizzare in un secondo momento nella stessa istanza di Excel
utilizzare opzionalmente anche questo
'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
nel codice userform stesso per tenerlo in cima sempre