Outlook VBA-Makros: Der beste Weg, um anzuzeigen, ‚Bitte warten‘
Frage
Was ist die beste Praxis für den Benutzer zum Anzeigen, dass ein Makro in Outlook ausgeführt wird? Das Makro kann um 1-30 Sekunden dauern.
Ich möchte ein modal ‚msgbox‘ zu vermeiden, bevor der Makro Aufspringen ausgeführt wird, wie dies lästig sein kann.
Ich würde lieber die Sanduhr Cursor, wenn möglich, vermeiden, und fragte mich, ob es ein besserer Weg war.
Gibt es eine Möglichkeit, eine nicht-modal ‚Status‘ Nachricht des Vergebens oben, während das Makro ausgeführt wird?
(Die Makro Ich habe läuft gegen die aktuell ausgewählten MailItem - und durch eine Taste auf der Schnellstartleiste gestartet).
Lösung
dieser Artikel ( auch diese ) auf best Practice sagt die Statusleiste verwenden.
Dieser Artikel auf Outlook sagt:
Ändern der Statusleiste
Es gibt kein Art und Weise der Statusleiste Text zu ändern, in Microsoft Outlook. Die Statusleiste ist nicht ausgesetzt, wie es in anderen ist Microsoft Office-Objektmodelle.
Outlook.com bietet Code für einen Fortschritt Box .
Andere Tipps
Ein paar Dinge, die Zeichenfolge in dem Sinne, ich bin sicher, andere werden Ideen auch.
1.Show eine Form mit einem Fortschrittsbalken auf, dass Fortschrittsberichte oder die Fortschrittsbalken in marque Modus, wenn Sie keine Fortschritte berichten können 2.Show ein Formular mit einem Bildfeld mit Ihrem Lieblings animierte GIF innen (spinny Pizza etc.). Sie können die Tasten ausschalten usw. 3. Verwenden Sie api gewinnen mit dem Ausblick staus bar zu erhalten spielen
Nicht zu wissen, was Sie in Ihrem Makro tun Sie mit dem Halten Sie das Formular „On top“ zu tun haben kann und Pump async Fortschritt hinein.
Prost
Marcus
Als Erweiterung @ 76mel Antwort, eine schöne Art und Weise, dies zu tun ist mit einer nicht-modalen Userform. Machen Sie etwas wirklich einfach mit nur einem Etikett und einem Titel wie folgt aus:
Was ich tun möchte, ist hat die Userform gesetzt, wie:
- Nicht modal (in Eigenschaften F4 , setzen
ShowModal
auf false)- Das heißt, Sie außerhalb der Statusleiste klicken und es ist nicht zu stoppen.
- stelle ich die
StartupPosition
0-Manual
undTop
undLeft
so etwas wie 100, so dass die Status-Form in der oberen linken Ecke des Bildschirms angezeigt wird (aus dem Weg von anderen Nachrichten, die in der Mitte standardmäßig angezeigt)
Stellen Sie die value
des Labels zu einem gewissen Standardtext, wenn die Userform lädt zunächst
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
Beachten Sie, wie mit Excel Application.Statusbar
müssen Sie die Userform auf den Standardwert zurückgesetzt, wenn Sie es verwenden später in der gleichen Instanz von Excel planen
Optional diese nutzen
'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
in der Userform Code selbst es an der Spitze zu halten immer