10
votes

Pourquoi montrent-il une userForm comme exécution de code d'arrêt modal?

Le code VBA suivant s'arrête à moi.show . De mes tests, il semble que me.show arrête toute exécution du code, même si le code est à l'intérieur de l'userForm.

cette partie est en dehors de l'utilisateur : xxx

cette pièce est à l'intérieur de l'userForm : xxx

Le code s'arrête à moi .Show , après l'affichage de l'utilisateur. Il n'y a pas d'erreur, il n'arrive tout simplement pas à exécuter du code. Il semble que la seule façon d'exécuter du code à l'intérieur d'une formulaire modale dans VBA soit de l'inclure dans la procédure userForm_ACtivater, comme ceci:

cette partie est en dehors de l'userForm : : > xxx

cette pièce est à l'intérieur de l'userForm : xxx

bien sûr, je ne peux pas mettre < code> me.show à l'intérieur de userform_ACtivate car cette procédure ne tire qu'après l'événement UserForm Afficher l'événement.

La documentation de userForm.showmodal dit " quand une information userse est modal, l'utilisateur doit fournir des informations ou fermer leformez-vous avant d'utiliser une autre partie de l'application. Aucun code suivant n'est exécuté jusqu'à ce que laformerform soit masqué ou non chargé.

J'essaie de Utilisez une utilité modale comme une barre de progression pour empêcher l'utilisateur d'interagir avec l'application lorsqu'un processus fonctionne. Mais ce sera difficile à accomplir si tout mon code doit être dans la procédure UserForm_ACtivater.

Suis-je manque quelque chose ici? Pourquoi toutes les exécutions de code s'arrêtent-elles à moi.show ?


0 commentaires

5 Réponses :


3
votes

Je pense que je l'ai compris.

Après moi.show Les incendies d'événement userForm_ACtivater. S'il n'y a pas de code dans la procédure userForm_ACtivater, rien ne se produira car VBA attend moi.hide . .

L'ordre des événements est donc le suivant: me.show > userform_activate > me.hide

Tout code que je veux exécuter doit être dans la procédure userform_ACtivater et doit être avant moi.hide . .

La structure est très stricte, mais je pourrais peut-être utiliser cette structure à mon avantage.


1 commentaires

Tout ce que vous avez vraiment besoin de faire si vous souhaitez toujours pouvoir interagir avec la feuille pendant que le formulaire est uplan est utile, utilisez ce code lorsque vous appelez le formal: userForm.show vbmodalyse .



11
votes

Lorsque le formulaire est affiché avec vbmodal code>, le code suspendra l'exécution et attendra l'interaction utilisateur avec le formulaire. Par exemple, en cliquant sur un bouton ou en utilisant une liste déroulante.

Si vous mettez à jour le formulaire Propriété P>

ShowModal = False


2 commentaires

Yup, UserForms sans vbmodeless sont faciles, mais je dois verrouiller l'interaction de l'utilisateur avec l'application jusqu'à la fin du processus. Il ne s'agissait que de déterminer comment structurer le code dans une formulaire userforme VBModal. Dommage que la documentation ne dise pas simplement "si vous utilisez VBModal, assurez-vous de mettre n'importe quel code que vous souhaitez exécuter dans userform_ACtivater et avant moi.hide. Merci! Merci! Merci! Merci! Merci!


Cela n'a pas fonctionné pour moi. L'appelant Sub continue à exécuter, mais absolument aucun composant n'est rendu, pas une simple étiquette simple.



-5
votes

Je ne sais pas vraiment ce qui vous va dans votre esprit car il existe une grande variété de code pour ce que vous demandez, mais j'espère que cela peut aider

Sous-Sous-CMDSWITCH_CLICK () UserForm1.hide UserForm2.show

end sous


0 commentaires

-4
votes

Je pense que je l'ai compris Essayez de faire cette étape simple Dans vous, faites un clic droit sur la partie bancaire et cliquez sur Propriétés. Changer le "showmodal" sur false ou dans le code VBA lorsque vous affichez le formal utilisateur à l'aide du code suivant:

userForm1.show false


0 commentaires

8
votes

Je cherchais une réponse à la raison pour laquelle j'avais l'erreur suivante:

Erreur de temps d'exécution '5': appel de procédure ou argument de procédure non valide p> blockQuote>

Lorsque vous exécutez cette ligne de code: p> xxx pré>

même si cette ligne fonctionne: p>

UserForm1.Show vbModal
UserForm1.Show vbModeless


0 commentaires