VBA Excel activer 1 UserForm depuis un autre?

Résolu
pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   -  
pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   -
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...)

--
Cordialement,
Franck P

1 réponse

  1. aquarelle Messages postés 7181 Date d'inscription   Statut Modérateur Dernière intervention   1 311
     
    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
    1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 772
       
      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
    2. aquarelle Messages postés 7181 Date d'inscription   Statut Modérateur Dernière intervention   1 311
       
      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
    3. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 772
       
      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
    4. aquarelle Messages postés 7181 Date d'inscription   Statut Modérateur Dernière intervention   1 311
       
      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
    5. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 772
       
      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