Perspectives macro VBA: La meilleure façon d'indiquer « s'il vous plaît attendre »
Question
Quelle est la meilleure pratique pour indiquer à l'utilisateur qu'une macro est en cours d'exécution dans Outlook? La macro peut prendre environ 1-30 secondes.
Je veux éviter un modal « msgbox » éclater avant la macro est exécutée, comme cela peut être gênant.
Je préfère éviter le curseur de sablier si possible, et je me demandais s'il y avait une meilleure façon.
Est-il possible de placer un message 'statut' non modal up, tandis que la macro est en cours d'exécution?
(La macro je fonctionne actuellement sélectionné contre mailItem - et lancé par un bouton sur la barre d'accès rapide).
La solution
Cet article ( Cet article sur les perspectives dit:
Modification de la barre d'état
Il n'y a pas façon de modifier le texte de la barre d'état Microsoft Outlook. La barre d'état est ne sont pas exposés comme dans d'autres modèles Microsoft objet Office.
Autres conseils
Couple de choses à l'esprit cette chaîne, je suis sûr que d'autres auront des idées aussi bien.
1.Show une forme avec une barre de progression sur ce qui rend compte des progrès ou a la barre de progression en mode marque si vous ne pouvez pas rendre compte des progrès 2.Show un formulaire avec une zone d'image avec votre gif animé préféré à l'intérieur (spinny pizza, etc.). Vous pouvez désactiver les boutons, etc. 3. Utilisez gagner api pour obtenir jouer avec les perspectives bar Staus
Ne sachant pas ce que vous faites dans votre macro vous pourriez avoir à traiter avec le maintien de la forme « en haut » et le pompage des progrès async en elle.
Vive
Marcus
Développant @ réponse de 76mel, une belle façon de le faire est avec un userform non modal. Faire quelque chose de vraiment simple, avec juste une étiquette et une légende comme celui-ci:
Ce que je veux faire est d'avoir le userform défini comme:
- non modale (dans les propriétés F4 , définissez
ShowModal
false)- Cela signifie que vous pouvez cliquer en dehors de la barre d'état et ne vous arrêtez pas.
- Je mis le
StartupPosition
à0-Manual
etTop
etLeft
à quelque chose comme 100, de sorte que la forme d'état apparaît dans le coin supérieur gauche de l'écran (sur la voie de tous les autres messages qui apparaissent dans le centre par défaut)
Définir la value
de l'étiquette à un texte par défaut lorsque les premières charges formUtilisateur
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
Note, comme avec Application.Statusbar
Excel vous devez réinitialiser le userform à sa valeur par défaut si vous prévoyez de l'utiliser plus tard dans la même instance d'Excel
Vous pouvez éventuellement utiliser cela aussi
'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
dans le code formUtilisateur lui-même pour le garder toujours sur