Microsoft 365 Userform's "en cascade"

Gégé-45550

XLDnaute Accro
Bonjour amis Excel'lents, pouvez-vous m'expliquer ce que j'ai mal fait et que je n'arrive pas à comprendre ?
Je m'explique :
Dans le fichier joint, il y a un bouton sur la Feuil1 qui ouvre un Userform1 en modal.
Dans ce Userform1, il y a deux boutons, un pour quitter et un autre qui ouvre un Userform2 en modal et masque (Hide) le Userform1 tant que Userform2 est ouvert.
Dans le Userform2, il y a un bouton qui permet de fermer le Userform2 en le déchargeant (Unload) et de ré-afficher le Userform1 (Show).
Comme je souhaite que les deux usf aient le même comportement à la fermeture, j'ai mis pour chacun d'eux le même code de sortie dans leur évènement QueryClose.
le problème que je rencontre et sur lequel je m'arrache le peu de cheveux qu'il me reste est le suivant :
Lorsque Userform1 est ouvert et que je clique sur le bouton qui ouvre Userform2, pas de problème, Userform2 s'affiche et Userform1 est masqué.
Lorsque, dans Userform2, je clique sur le bouton qui ferme Userform2 et qui ré-affiche Userform1, pas de problème, Userform2 disparaît et Userform1 est affiché.
Comme disait l'individu qui était en train de tomber du 50e étage en passant devant le 30e : jusque là, tout va bien.
Mais, lorsque, un fois revenu sur Userform1, je clique à nouveau pour afficher Userform2, patatras, plantage, Userform2 est affiché mais bloqué et VBA s'arrête sur la commande "UserForm2.Show" dans le code du bouton de Userform1 qui commande l'affichage de Userform2 (qui pourtant devrait avoir été vidé de la mémoire).
Je sais, j'ai été un peu long mais, au moins je l'espère, suffisamment clair pour décrire un problème qui me laisse perplexe.
Merci à vous, amis Excel'lents, d'avoir eu la patience de me lire jusqu'au bout ;) et à ceux qui voudront bien m'expliquer pourquoi un code si simple a priori ne fait pas ce que j'en attends.
 

Pièces jointes

  • Test USF.xlsm
    25.3 KB · Affichages: 16

Gégé-45550

XLDnaute Accro
Salut,
Dans userform1 :
VB:
Private Sub CommandButton1_Click()
    Me.Hide
    'Load UserForm2
    UserForm2.Show
    Me.Show
End Sub
Userform2: event terminate supprimé

Et tout va bien ....
Bonjour fanch55 et merci pour cette réponse ultra-rapide ... mais ...
j'avais déjà testé ça (comme je pense une bonne partie des combinaisons avec Load, Show en modal ou non, etc.) et ça ne marche pas. Je viens, par acquis de conscience, de modifier le code du CmdBtn comme vous l'indiquez et, chez moi, en 365, le problème est toujours le même au deuxième appel => plantage.
Bien amicalement,
[EDIT]
au temps pour moi et toutes mes plus plates excuses.
Je fais des laïus pour m'expliquer et je ne suis même pas capable de lire une réponse courte jusqu'au bout.
J'avais zappé le event terminate de usf2 supprimé.
Et là ça marche impec.
Bravo et merci
[/EDIT]
 
Dernière édition:

Gégé-45550

XLDnaute Accro
Bonjour,

Moi, ce que j'adore, c'est le Me.Show auquel je n'aurais jamais pensé !
Si cette instruction fonctionne, je trouve ça absolument génial !!!
Moqueur !!!
Le Me.show est issu d'un dérapage de copier/coller lorsque j'ai construit vite fait cette nuit ce fichier de test.
Mais cette instruction ne peut que fonctionner (lol) 🤣
 
Dernière édition:

TooFatBoy

XLDnaute Barbatruc
Non, je ne me moque pas. Je parle de #2.

Pour moi, un UserForm qui s'affiche lui-même, ça va complètement à l'encontre de ma logique. Mais vu que ça doit s'exécuter juste après la fermeture du UserForm2 qui doit rendre la main au code du UserForm1, logiquement ça doit pouvoir fonctionner, et je trouve ça vraiment génial.
 

Gégé-45550

XLDnaute Accro
Non, je ne me moque pas. Je parle de #2.

Pour moi, un UserForm qui s'affiche lui-même, ça va complètement à l'encontre de ma logique. Mais vu que ça doit s'exécuter juste après la fermeture du UserForm2 qui doit rendre la main au code du UserForm1, logiquement ça doit pouvoir fonctionner, et je trouve ça vraiment génial.
Alors je peux retirer mon [EDIT] du post #5. Effectivement, c'est génial.
@+ mon ami !
 

patricktoulon

XLDnaute Barbatruc
Bonjour
je peux peut être vous apporter une explication supplémentaire quand au "Me.show"

tout d'abords il faut savoir que les module userform avant tout !! sont des module classe a part entière

et que les fonction show , hide ainsi que les propriété left top width, etc.. etc... sont des fonctions et

properties pré encodées dans le clisd qui vous permet de voir une fenêtre(le userform)

et donc ces fonctions sont accessibles dans le classeur ou que l'on soit

beaucoup confondent le vbcomponents(3) et la fenêtre userform

quand vous ajoutez un userform dans votre classeur vous ajoutez un module (pas une fenêtre )

c'est le clisd qui est intégré automatiquement qui est la fenêtre

en sachant cela vous pouvez même faire vos propres fonctions dans un module userform

ces fonctions pourront être utilisées sans même afficher la fenêtre userform

je peux vous faire quelques démo si ça vous intéresse et vous en expliquer pourquoi le show , load , unload , hide

voir même qu'un même userform peut être affiché autant de fois que l'on veut avec des propriétés
différentes ce qui en est l’exemple approprié pour expliquer ce que je viens de dire ci dessus

petite précision néanmoins

le mot"Me" désigne le module lui même(et non la fenêtre que vous voyez à l’écran)

on peut l'utiliser dans un module classe , feuille et même le thisworkbook
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re
pour vous prouver qu'un module userform n'est pas une fenêtre je vous fait une première demo
j'ouvre un new classeur et je lui met un (MODULE USERFORM !!!)
je met un simple textbox dedans (pour la démo qui va suivre)
nous y voila je vais l'appeler "MonSeulUserform"
1677307113375.png


je vais maintenant ajouter un module standard et i codé une sub test qui va me permettre d'afficher mon seul userform 4 fois avec des propriétés différentes
le code est assez simple
VB:
Dim forms(3) As New MonSeulUserform
Sub test()
    nom = Array("toto", "titi", "loulou", "rififi")
    couleurs = Array(vbRed, vbGreen, vbMagenta, vbCyan)
    For i = 0 To 3
        With forms(i)
            .BackColor = couleurs(i)
            .TextBox1 = nom(i)
            .StartUpPosition = 0
          .Left = (150 * i) + 50 + (i * 10)
            .Top = 200
            .Show 0
        End With
    Next
End Sub
j'explique la déclaration globale module
Dim forms(3) As New MonSeulUserform
en fait ici je déclare (et instancie) 4 instance du module "monseuluserform
ET NON FENETRE USERFORM!!!!!!)
chaque item de ma variable forms devient un object module userform
ben me reste plus qu'a utiliser les fonctions et propriété comme sur une seule instance de userform pour chacune en les différenciant pour la demo je change donc la couleur de fond et meme la valeur du textbox

allez on lance la sub

on voit bien 4 userform affichés a l'écran tous d'une couleur différente et une valeur différente dans le textbox
pourtant nous somme bien d'accords que j'en ai qu'un dans mon projet
c'est parti!!!
demo.gif
 

Dranreb

XLDnaute Barbatruc
Bonjour.
le mot "Me" désigne le module lui même(et non la fenêtre que vous voyez à l’écran)
Non. "Me" ne désigne jamais ni code ni composant VBA. Il désigne l'exemplaire d'objet sur lequel le code, toujours unique, lui, s'applique. C'est essentiellement une structure de données, principalement sa collection "Controls" dans le cas d'un UserForm mais aussi, comme pour tout module de classe, tous emplacements mémoire requis pour les variables globales non Static, qu'elles soient Private et donc inaccessibles de l'extérieur ou Public et donc constitutives de propriétés.
 

Dranreb

XLDnaute Barbatruc
Je n'aime pas cet anglicisme. Je n'utilise que le mot "exemplaire"
Bien qu'il existe, le mot français n'a pas du tout le même sens :
Organisme, bureau qui exerce un pouvoir de décision, d'autorité : Les plus hautes instances d'un parti.
Ou alors vraiment très vaguement dans la seconde acception :
Toute procédure judiciaire en cours devant une juridiction. (Une assignation constitue une demande introductive d'instance.)
En français Il n'y a que le mot exemplaire qui convient pour désigner une réalisation particulière d'après un modèle théorique général.
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re
@Dranreb

perso pour moi et par définition le mot exemplaire ne peut être considéré comme valable dans ce contexte

un exemplaire =Chacun des objets (surtout imprimés) reproduisant un type commun.

le mot "Me" est une instruction représentant justement cet exemple en fonctionnement

exemplaire ne veux pas dire que tous sont actif ils existent c'est tout

le mot"me" est une instruction désignant l'exemplaire en fonctionnement (puisqu'il est codé à l'interieur)
donc pour moi (Instance de , instanciation de )convient mieux
ce n'est pas de l'"anglicisme" c'est une définition dans un contexte ;)

après je pense que tout le monde a compris ( je l’espère)🤣

que veux tu quand j'ai apris il n'y avait pas beaucoup de page Microsoft en français 🤣
 
Dernière édition:

Discussions similaires

  • Résolu(e)
Microsoft 365 Problème code
Réponses
2
Affichages
362

Statistiques des forums

Discussions
312 207
Messages
2 086 246
Membres
103 163
dernier inscrit
Pelaez