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

Était-ce utile?

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.

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