Perspectives macro VBA: La meilleure façon d'indiquer « s'il vous plaît attendre »

StackOverflow https://stackoverflow.com/questions/2211642

  •  18-09-2019
  •  | 
  •  

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

Était-ce utile?

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.

code pour une boîte de progression .

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 et Top et Left à 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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top