VBA Excel activer 1 UserForm depuis un autre?

Résolu/Fermé
pijaku
Messages postés
12257
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
3 septembre 2021
- 20 juil. 2011 à 16:40
pijaku
Messages postés
12257
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
3 septembre 2021
- 21 juil. 2011 à 13:59
Bonjour,

Je me bas avec les propriétés "modales" de deux userforms... Grrr!!!

Le principe de ce que je souhaites réaliser:
J'ai deux Userform. Lorsque je lance le fichier, les 2 userforms s'affichent côte à côte. Jusqu'ici pas de souci!
A l'aide d'un bouton sur l'un, je souhaite activer le deuxième, et réciproquement, tout en laissant les deux apparants!
Bien sur, Hide aurait été très utile, mais je souhaite vraiment garder les 2 userform visibles à l'écran.

Est ce possible?
Si oui comment?

Merci beaucoup de vos contributions et/ou conseils avisés...

Excel 2003 (peu important car >97, mais bon j'le mets quand même...)

1 réponse

aquarelle
Messages postés
7099
Date d'inscription
dimanche 8 avril 2007
Statut
Modérateur
Dernière intervention
20 janvier 2022
1 301
20 juil. 2011 à 19:22
Bonsoir,

Je ne sais pas si cela te conviendra mais tu peux passer tes userforms en non modal :
UserForm1.Show 0
UserForm2.Show 0


Il te suffira de cliquer sur la userform de ton choix pour l'activer.
Cela permet aussi de travailler sur ta feuille de calcul sans fermer tes userforms

Bonne soirée
-1
pijaku
Messages postés
12257
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
3 septembre 2021
2 695
21 juil. 2011 à 08:57
Salut aquarelle et merci.

En fait, je connais la propriété modale des USF.

Cependant, ce que je souhaite faire c'est une activation automatique de l'USF2 à partir de l'USF1 sans que l'utilisateur n'ait à intervenir...

Quelque chose comme :
Dans l'USF1 :
Private Sub CommandButton1_Click()
'Mon code de procédure ici
UserForm2.Activate
End Sub
Private Sub UserForm_Activate()
MsgBox "Coucou l'USF1 est bien activé"
End Sub
Dans l'USF2 :
Private Sub UserForm_Activate()
MsgBox "Coucou l'USF2 est bien activé"
End Sub
Private Sub CommandButton1_Click()
'Mon code de procédure ici
UserForm1.Activate
End Sub

Alors j'ai essayé de remplacer : UserForm1.Activate par : UserForm1.Show 1 , userForm1.Show 0, mais j'obtiens toujours le message d'erreur : "vous ne pouvez pas afficher un USF en mode modal gna gna gna..."

Bah, si c'est pas possible, j'en masquerai un sur les deux avec Hide...
0
aquarelle
Messages postés
7099
Date d'inscription
dimanche 8 avril 2007
Statut
Modérateur
Dernière intervention
20 janvier 2022
1 301
21 juil. 2011 à 11:14
Salut,

Pour moi cela fonctionne si je mets :
Dans l'USF1 :
Private Sub CommandButton1_Click()
'Mon code de procédure ici
Load UserForm2
UserForm2.Show 0
End Sub
Private Sub UserForm_Activate()
MsgBox "Coucou l'USF1 est bien activé"
End Sub


Dans l'USF2 :
Private Sub UserForm_Activate()
MsgBox "Coucou l'USF2 est bien activé"
End Sub
Private Sub CommandButton1_Click()
'Mon code de procédure ici
Load UserForm1
UserForm1.Show 0
End Sub


Et pour lancer l'affichage des 2 UserForms :
Sub Auto_Open()
Load UserForm1
UserForm1.Show 0
Load UserForm2
UserForm2.Show 0
End Sub
0
pijaku
Messages postés
12257
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
3 septembre 2021
2 695
21 juil. 2011 à 12:10
Merci encore de t'intéresser à mon souci.
Le problème de "Load" c'est qu'il recharge mon Usf en mémoire. Or dans ma procédure Initialise, je remets à zéro certaines de mes variables public. Donc, j'ai peur que Load ne me remette systématiquement à zéro des variables qui évoluent au fur et à mesure de l'utilisation de mes userform.

J'ai donc fini par trouver une solution alternative. Je la livre ici, ça peux servir...

1- remplacer les appels des procédures : Private Sub UserForm_Activate() par : Sub UserForm1_Activate() (remplacer UserForm1 par le nom de votre UserForm)

2- les appeler depuis l'autre Userform par :
CallByName UserForm1, "UserForm1_Activate", VbMethod
3- dans chaque userform placer un textbox (que l'on rendra invisible)

Alors le code global donne :
Dans l'USF1 :
Private Sub CommandButton1_Click()
CallByName UserForm2, "UserForm2_Activate", VbMethod
With UserForm2.TextBox1
    .Visible = True
    .SetFocus
    .Visible = False
End With
End Sub

Sub UserForm1_Activate()
    MsgBox "USF 1 activé"
End Sub

Dans l'USF2 :
Private Sub CommandButton1_Click()
CallByName UserForm1, "UserForm1_Activate", VbMethod
With UserForm1.TextBox1
    .Visible = True
    .SetFocus
    .Visible = False
End With
End Sub

Sub UserForm2_Activate()
    MsgBox "USF 2 activé"
End Sub

Ci-joint un classeur exemple

Ca pourrait faire une astuce CCM non?
Bonne journée à toi et merci encore
0
aquarelle
Messages postés
7099
Date d'inscription
dimanche 8 avril 2007
Statut
Modérateur
Dernière intervention
20 janvier 2022
1 301
21 juil. 2011 à 13:56
Ca pourrait faire une astuce CCM non?
Ben, vi...allez au travail ;)

Bonne journée à toi aussi et de rien pour mon aide, finalement peu utile ^^
0
pijaku
Messages postés
12257
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
3 septembre 2021
2 695
21 juil. 2011 à 13:59
Ben, vi...allez au travail ;)
J'm'y mets dès que j'aurais fini ce boudiou de classeur!!!...
Si si ton aide fut utile car sans toi, j'me s'rais pas cassé le derche davantage et j'aurais utilisé simplement hide...
0