Comment créer une boîte de dialogue d'état dans Excel
Question
J'ai créé un générateur de rapports de base de données dans Excel.J'essaie de créer une boîte de dialogue qui affiche les informations d'état pendant l'exécution du programme.
Lorsque je génère le rapport, bien que la boîte de dialogue apparaisse, je ne peux pas actualiser/mettre à jour les informations qu'elle affiche.La plupart du temps, la boîte de dialogue n'apparaît que partiellement.J'ai essayé d'utiliser la méthode .repaint, mais j'obtiens toujours les mêmes résultats.Je ne vois la boîte de dialogue complète qu'une fois le rapport généré.
La solution
Le code ci-dessous fonctionne bien lors de l'exécution d'actions dans Excel (XP ou version ultérieure).
Pour les actions qui se déroulent en dehors d'Excel, par exemple la connexion à une base de données et la récupération de données, le mieux que cela offre est la possibilité d'afficher des boîtes de dialogue avant et après l'action (par ex. "Obtenir des données", "J'ai des données")
Créez un formulaire appelé "statutfrm", mettez une étiquette sur le formulaire appelé "Étiquette1".
Définir la propriété du formulaire 'ShowModal' = faux, cela permet au code de s'exécuter pendant que le formulaire est affiché.
Sub ShowForm_DoSomething()
Load frmStatus
frmStatus.Label1.Caption = "Starting"
frmStatus.Show
frmStatus.Repaint
'Load the form and set text
frmStatus.Label1.Caption = "Doing something"
frmStatus.Repaint
'code here to perform an action
frmStatus.Label1.Caption = "Doing something else"
frmStatus.Repaint
'code here to perform an action
frmStatus.Label1.Caption = "Finished"
frmStatus.Repaint
Application.Wait (Now + TimeValue("0:00:01"))
frmStatus.Hide
Unload frmStatus
'hide and unload the form
End Sub
Autres conseils
Essayez d'ajouter un Faire des événements appelez dans votre boucle.Cela devrait permettre au formulaire de repeindre et d'accepter d'autres demandes.
J'ai utilisé la propre barre d'état d'Excel (en bas à gauche de la fenêtre) pour afficher les informations de progression d'une application similaire que j'ai développée dans le passé.
Cela fonctionne très bien si vous souhaitez simplement afficher des mises à jour textuelles sur la progression et évite le besoin d'une boîte de dialogue de mise à jour.
Ok @JonnyGold, voici un exemple du genre de chose que j'ai utilisé...
Sub StatusBarExample()
Application.ScreenUpdating = False
' turns off screen updating
Application.DisplayStatusBar = True
' makes sure that the statusbar is visible
Application.StatusBar = "Please wait while performing task 1..."
' add some code for task 1 that replaces the next sentence
Application.Wait Now + TimeValue("00:00:02")
Application.StatusBar = "Please wait while performing task 2..."
' add some code for task 2 that replaces the next sentence
Application.Wait Now + TimeValue("00:00:02")
Application.StatusBar = False
' gives control of the statusbar back to the programme
End Sub
J'espère que cela t'aides!
Insérez une feuille vierge dans votre classeur Renommez la feuille, par exemple."information"
Sheets("information").Select
Range("C3").Select
ActiveCell.FormulaR1C1 = "Updating Records"
Application.ScreenUpdating = False
Application.Wait Now + TimeValue("00:00:02")
Continuer la macro
Sheets("information").Select
Range("C3").Select
Application.ScreenUpdating = True
ActiveCell.FormulaR1C1 = "Preparing Information"
Application.ScreenUpdating = False
Application.Wait Now + TimeValue("00:00:02")
Continuer la macro
Etc. Sélectionnez également une cellule vierge quelque part sur la feuille existante au lieu d'insérer une nouvelle feuille
Range("C3").Select
ActiveCell.FormulaR1C1 = "Updating Records"
Application.ScreenUpdating = False
Application.Wait Now + TimeValue("00:00:02")
Etc
La boîte de dialogue s'exécute également sur le même thread d'interface utilisateur.Il est donc trop occupé pour se repeindre.Je ne sais pas si VBA possède de bonnes capacités multithread.