2009-11-23 24 views
7

Le code VBA suivant s'arrête à Me.Show. De mes tests, il semble que Me.Show arrête toute exécution de code, même si le code est dans l'UserForm.Pourquoi afficher un UserForm comme exécution de code d'arrêt modal?

Cette pièce est en dehors de la UserForm:

Public Sub TestProgress() 
    Dim objProgress As New UserForm1 
    objProgress.ShowProgress 
    Unload objProgress 
End Sub 

Cette pièce est à l'intérieur du formulaire utilisateur:

Private Sub ShowProgress() 
    Me.Show vbModal 
    Dim intSecond As Integer 
    For intSecond = 1 To 5 
     Application.Wait Now + TimeValue("0:00:01") 
     Me.ProgressBar1.Value = intSecond/5 * 100 
    Next intSecond 
    Me.Hide 
End Sub 

Le code arrête à Me.Show, après que le formulaire utilisateur est affiché. Il n'y a pas d'erreur, cela interrompt simplement l'exécution du code. Il semble que la seule façon d'exécuter du code dans un UserForm modal dans VBA est de l'inclure dans la procédure UserForm_Activate comme ceci:

Cette partie est en dehors de la UserForm:

Public Sub TestProgress() 
    Dim objProgress As New UserForm1 
    Load objProgress 
    Unload objProgress 
End Sub 

Cette partie est à l'intérieur du UserForm:

Private Sub UserForm_Initialize() 
    Me.Show vbModal 
End Sub 

Private Sub UserForm_Activate() 
    Dim intSecond As Integer 
    For intSecond = 1 To 5 
     Application.Wait Now + TimeValue("0:00:01") 
     Me.ProgressBar1.Value = intSecond/5 * 100 
    Next intSecond 
    Me.Hide 
End Sub 

Bien sûr, je ne peux pas mettre Me.Show l'intérieur UserForm_Activate parce que la procédure ne se déclenche après l'UserFo rm Show event.

La documentation UserForm.ShowModal dit « Lorsqu'un UserForm est modal, l'utilisateur doit fournir des informations ou fermer le formulaire utilisateur avant d'utiliser toute autre partie de l'application. Aucun code suivant est exécuté jusqu'à ce que le UserForm est masqué ou déchargé. » J'essaie d'utiliser un UseForm modal comme une barre de progression pour empêcher l'utilisateur d'interagir avec l'application pendant qu'un processus s'exécute. Mais ce sera difficile à accomplir si tout mon code doit être dans la procédure UserForm_Activate.

Ai-je raté quelque chose ici? Pourquoi toutes les exécutions de code s'arrêtent-elles à Me.Show?

Répondre

2

Je pense avoir compris cela.

Après Me.Show, l'événement UserForm_Activate se déclenche. S'il n'y a aucun code dans la procédure UserForm_Activate rien ne se passera parce que VBA attend Me.Hide.

Ainsi, l'ordre des événements est: Me.Show>UserForm_Activate>Me.Hide

Tout code que je veux courir doit être dans la procédure de UserForm_Activate et doit être avantMe.Hide.

La structure est très stricte, mais je peux être en mesure d'utiliser cette structure à mon avantage.

+3

Tout ce que vous avez vraiment besoin de faire si vous voulez toujours être en mesure d'interagir avec la feuille alors que la forme est en place est d'utiliser ce code lorsque vous appelez le userform: 'userform.show vbModeless'. – Casey

10

Lorsque le formulaire est affiché avec vbModal, le code suspend l'exécution et attend l'interaction de l'utilisateur avec le formulaire. Par exemple, en cliquant sur un bouton ou en utilisant une liste déroulante.

Si vous mettez à jour la propriété forme

ShowModal = False 

et de supprimer vbModal de votre code. Cela permettra à l'exécution de code de continuer lorsque le formulaire est affiché.

+0

Yup, vbModeless UserForms est facile, mais j'ai besoin de verrouiller l'interaction de l'utilisateur avec l'application jusqu'à la fin du processus. C'était juste une question de comprendre comment structurer le code dans un UserForm vbModal. Dommage que la documentation ne se contente pas de dire "si vous utilisez vbModal assurez-vous de mettre tout code que vous voulez exécuter dans UserForm_Activate et _before_ Me.Hide" Merci! – Kuyenda

+0

Cela n'a pas fonctionné pour moi. , mais absolument aucun composant n'est rendu, pas même une simple étiquette. – cbaldan

-3

Je ne sais pas vraiment ce qui se passe dans votre esprit parce qu'il ya une grande variété de code pour ce que votre demandent mais j'espère que cela peut aider

Private Sub cmdSwitch_Click() UserForm1.Hide UserForm2 .show

End Sub

-2

Je pense que j'ai tout compris Essayez de faire cette étape simple en vous formez un clic droit sur la partie bancaire et cliquez sur propriétés Changer la « ShowModal » False ou dans le code VBA lorsque vous affichez l'UserForm en utilisant le code suivant:

UserForm1.Show Faux

5

je cherchais une réponse à pourquoi je recevais l'erreur suivante:

Run time error '5': Invalid procedure call or argument

quand l'exécution de cette ligne de code:

UserForm1.Show True 

même si cela fonctionne en ligne:

UserForm1.Show False 

Bien sûr. Le vrai est différent de vbModal! Donc, la réponse simple est d'utiliser les énumérations correctes:

UserForm1.Show vbModal 
UserForm1.Show vbModeless