2008-09-09 12 views
3

J'ai créé un générateur de rapport de base de données dans Excel. J'essaye de créer une boîte de dialogue qui affiche des informations d'état pendant que le programme s'exécute.Comment créer une boîte de dialogue d'état dans Excel

Quand je produis le rapport, bien que la boîte de dialogue apparaît, je ne peux pas rafraîchir/mettre à jour les informations qu'il 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'ai toujours les mêmes résultats. Je vois seulement la boîte de dialogue complète, après que le rapport soit généré.

Répondre

2

Le code ci-dessous fonctionne bien lors de l'exécution des actions dans Excel (XP ou version ultérieure).

Pour les actions qui ont lieu en dehors Excel, par exemple connexion à une base de données et la récupération de données le mieux cette offre est l'occasion de montrer les boîtes de dialogue avant et après l'action (par exemple « Obtenir des données », « Got données »)

Créer un formulaire appelé "frmStatus", mettre une étiquette sur la forme appelée "Label1".

Définissez la propriété de formulaire 'ShowModal' = false, ce qui 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 
0

La boîte de dialogue est en cours d'exécution aussi sur le même thread d'interface utilisateur. Donc, il est trop occupé pour se repeindre. Vous ne savez pas si VBA a de bonnes capacités de multi-threading.

4

Je l'ai utilisé propre barre d'état Excel (en bas à gauche de la fenêtre) pour afficher des informations de progression pour une application similaire, j'ai développé dans le passé.

Il fonctionne très bien si vous voulez juste pour afficher les mises à jour textuelles sur les progrès et évite la nécessité d'un dialogue de mise à jour du tout.

Ok @JonnyGold, voici un exemple du genre de chose je ...

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 

Hope this helps!

+0

S'il vous plaît pourriez-vous ajouter un exemple, merci. – JonnyGold

6

Essayez d'ajouter un DoEvents appel dans votre boucle. Cela devrait permettre au formulaire de repeindre & accepter d'autres demandes.

2

Insérez une feuille vierge dans votre classeur Renommez le par exemple la feuille. "Informations"

Sheets("information").Select 
Range("C3").Select 
ActiveCell.FormulaR1C1 = "Updating Records" 
Application.ScreenUpdating = False 
Application.Wait Now + TimeValue("00:00:02") 

Continuer 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 Macro

Etc Vous pouvez également sélectionner une cellule vide 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

Questions connexes