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

patricktoulon

XLDnaute Barbatruc
re
comme ca il n'y a plus de doute
1677313992144.png
 

Gégé-45550

XLDnaute Accro
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 🤣
Bonjour,
Effectivement, j'ai appris ... et j'ai compris ... et de @Dranreb aussi j'ai appris ... et apprécié son soutien de la langue française qui en a bien besoin ;).
Merci à tous les deux.
 

patricktoulon

XLDnaute Barbatruc
pour en revenir au sujet a asvoir le mot "me"
je reprends mon exemple de 4 "exemplaires" de mon userform
et la je vais coder ceci dans le userform
VB:
Public mavariable
Private Sub UserForm_Activate()
TextBox1 = Me.mavariable
End Sub
veuillez noter que ma variable "mavariable" est public et peut donc etre modifiée dedans et en dehors du module
je reprends un peu le code de la sub test
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)
            .mavariable = "Instance " & i
            .StartUpPosition = 0
          .Left = (150 * i) + 50 + (i * 10)
            .Top = 200
            .Show 0
        End With
    Next
End Sub
résultat
demo.gif


le textbox prends la valeur de la variable de ME (Me.mavariable)
cette variable a été instruite dans la sub test au préalable(avant le show)
on voit bien que "Me" et "Textbox1" désigne distinctement(respectivement) l’exemplaire lui même (l'instance) et le textbox de l'exemplaire
 

fanch55

XLDnaute Barbatruc
pour en revenir au sujet a asvoir le mot "me"
....
le textbox prends la valeur de la variable de ME (Me.mavariable)
cette variable a été instruite dans la sub test au préalable(avant le show)
on voit bien que "Me" et "Textbox1" désigne distinctement(respectivement) l’exemplaire lui même (l'instance) et le textbox de l'exemplaire
Pour plussoyer dans ce sens,
Quand on utilise un Userform en tant qu' exemplance ou Instanplaire ( 😁 ) ,
dans le code de celui-ci, il faut oublier le nom Original qui ne sera plus honoré par Vb
( et ceci sans erreur, dur à tracer !!! ) .
Soit on indique Me pour toutes les propriétés, méthodes et contrôles ,
Soit on fait un Set Usf = Me dans l'initialize et on référence celui-ci ( pas trop de plus-value au Me ...:rolleyes: )
VB:
Private Sub UserForm_Click()
   ' Set Usf = Me
    MsgBox "Usf.Tbx=" & Usf.TextBox1.Value & vbLf & _
            "Me.Tbx=" & Me.TextBox1.Value & vbLf & _
            "MonSeulUserform.tbx=" & MonSeulUserform.TextBox1.Value
End Sub

Allez, je vais mettre de l'huile sur le feu :
Les Navigateurs Internet désigne une nouvelle instance ou exemplaire comme "nouvelle fenêtre" . 😩
 

patricktoulon

XLDnaute Barbatruc
re
Bonjour @fanch55
dans le code de celui-ci, il faut oublier le nom Original qui ne sera plus honoré par Vb
( et ceci sans erreur, dur à tracer !!! ) .
attention sur 2007 avec des fonction public dans le userform c'est justement le contraire
je l'ai constaté quand je suis passé de 2007 à 2013

et quand on subclasse des éléments comme des boutons ou label ou autres
dans les event de substitution "Me" te fera un beau plantage et cela quelque soit la version d'excel
c'est là il faut saisir la nuance entre module et object userform


ps :au fait toi qui disais que c’était plus ou moins bancale dans une autre discussion
je t'ai préparé une version de frame réellement transparente qui n'est pas bancale du tout si ça t’intéresse
fait le moi savoir
 

patricktoulon

XLDnaute Barbatruc
re
allez je vous ai préparé un "exemplaires" LOL
la on fait du classing et du subclassing
je reprends donc mon exemple 4 instanplaires 🤣

je modifie un peu la sub de test (3 fois rien)
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)
            .mavariable = Round(Rnd * 100000)
            .StartUpPosition = 0
          .Left = (150 * i) + 50 + (i * 10)
            .Top = 200
            .Show 0
        End With
    Next
End Sub

le userform
j'ajoute 3 bouton et je les classe (one event for all)
VB:
Public mavariable
Public WithEvents Bouton As MSForms.CommandButton
Public Userformica As Object
Dim cl(1 To 3) As New MonSeulUserform

Private Sub Bouton_Click()

'Me.TextBox1.Value = Bouton.Caption
' ne fonctionnera pas et sur 2007  te fera planter ("variable indéfinie" )
'car  dans cet event on est dans un exemplaire du module classe userform et un module classe n'a pas de controls textbox


'MonSeulUserform.TextBox1.Value = Bouton.Caption
'avec nom original: fonctionnera qu'en un seul exemplaire(si plusieurs exemplaires ca ne fonctionnera pas)


'fonctionnera dans tout les cas
'Userformica.TextBox1 = Bouton.Caption  ' à  debloquer pour plusieurs exemplaires(débloquer aussi la ligne dans le activate bien sur)


End Sub

Private Sub UserForm_Activate()
TextBox1 = Me.mavariable
For i = 1 To 3
'utilisation du mot "Me" dans le activate
Set cl(i).Bouton = Me.Controls("CommandButton" & i) 'classe userform(x).bouton

'on inscrit dans le même exemplaire l'object userform
'chaque instence de bouton aura son propre userformica
'Set cl(i).Userformica = Me ' à  debloquer pour plusieur exemplaires
Next
End Sub

voila lancez simplement le userform sans la sub en debloquant SOIT LE MODE 1 OU 2
vous verrez que seul la ligne avec le nom original fonctionne

maintenant testez avec la sub (4 instemplaires ;))
vous verez que là ni le 1 ni le 2 fonctionnent
on passe alors en mode 3 (débloquez les lignes concernée)
et là vous fonctionnera dans tout les modes mono ou pluriinstanplaires 😁

je vous donne le fichier pour que vous n'ayez pas a tout vous taper

voila voila
 

Pièces jointes

  • demo classe userform patricktoulon le Mot Me.xlsm
    17.9 KB · Affichages: 4

Lolote83

XLDnaute Barbatruc
Bonjour à tous,
Ayant déjà été confronté avec ce genre de problème, j'ai lu et compris la problématique.
Si la taille des formulaires peut être identiques, il m'arrive alors de créer un seul formulaire avec un contrôle Multipage qui dans ce cas peut "simuler quelque part", deux formulaires distincts.
Je vous livre donc une petite démo qui ressemble à celle fournie par notre ami @Gégé-45550 .
Bonne journée à vous tous.
@+ Lolote83
 

Pièces jointes

  • Copie de GEGE45550 - Test USF.xlsm
    27.6 KB · Affichages: 2

Discussions similaires

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

Statistiques des forums

Discussions
315 098
Messages
2 116 189
Membres
112 679
dernier inscrit
Yupanki