IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Pb ouverture /réouverture userform


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Inscrit en
    Avril 2007
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 27
    Points : 2
    Points
    2
    Par défaut Pb ouverture /réouverture userform
    Salut à tous,
    me voilà une fois plus de retour, mais j'espère cette fois-ci avec une question plus simple.

    Un "UserForm_Initialize()" se lance-t-il à chaque fois qu'on appelle un userform?
    Car dans mon cas ça ne fonctionne pas... uniquement lors du premier lancement.
    Ci dessous un exemple de l'ouverture du uf "admin_liste_a_faire" depuis l'uf "admin_voir_a_faire"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Private Sub Ouvrir_Click()
                Load admin_liste_a_faire
                admin_liste_a_faire.Show
                Unload admin_voir_a_faire
    End Sub
    et ensuite dans "admin_liste_a_faire", la fermeture:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Private Sub CommandButton1_Click()
        If MsgBox("Etes-vous sûr de vouloir retourner au menu précédent?", vbOKCancel, "Menu précédent") = vbOK Then
        admin_liste_a_faire.Hide
        Unload admin_liste_a_faire
        Exit Sub
        End If
    End Sub
    Merci d'avance à tous

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 24
    Points : 19
    Points
    19
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub Ouvrir_Click()
                Load admin_liste_a_faire
                Call userform_initialize
                admin_liste_a_faire.Show
                Unload admin_voir_a_faire
    End Sub
    Essaye de rajouter ca dans ton code, ca te lancera ton userform_initialize.
    C'est pas forcement propre mais ca a le mérite de marcher normalement .

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 44
    Points : 50
    Points
    50
    Par défaut
    Bonjour,

    A mon avis, tu devrais te servir de l'événement "Activate" (qui survient lors de l'emploi de la méthode "Show".

    Par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    'Survient lors du 'LOAD'
    sub UserForm_Initialize()
    ' Tes inits principales.....
    show 'Si tu voir ta Userform tout de suite
    end sub
     
    'Survient lors du 'SHOW'
    sub UserForm_Activate()
    ' inits secondaires (eventuellement).....
    end sub
    Evidemment, tu ne doit pas faire systématiquemnt un "UNLOAD" à chaque fois.

    Remarque : Il y a aussi l'événement "Deactivate" qui pourrait te servir.

    OK ??

  4. #4
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Quand tu fais "Userform.hide", tu masques l'userform. Mais il est toujours chargé.
    Pour le voir, tu fais simplement
    A+

    Edit
    Si tu veux le décharger, c'est
    Auquel cas, tu reparts avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Load Userform1
    Userform1.show
    PS - Mais stp, pas de Call Userform_initialize !

  5. #5
    Candidat au Club
    Inscrit en
    Avril 2007
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 27
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par ouskel'n'or
    Edit
    Si tu veux le décharger, c'est
    Auquel cas, tu reparts avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Load Userform1
    Userform1.show
    PS - Mais stp, pas de Call Userform_initialize !
    C'est ce que je fais mais ça fonctionne pas.
    j'ouvre mon userform depuis un autre que je laisse en dessous. je le ferme et le décharge, je me retrouve donc sur celui qui était resté en dessous, je le réouvre en sélectionnant une autre valeur et là il ne m'execute pas mon initialize...

  6. #6
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Il ne peut pas passer par initialize si tu fais Userform2.hide.
    Si tu veux qu'il le fasse, ne le masque pas, décharge-le par
    Ainsi, quand tu le rappelles depuis Userform1, par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Load Userfom2
    Userform2.show
    l'initialisation se fera.
    C'est ok ?

  7. #7
    Candidat au Club
    Inscrit en
    Avril 2007
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 27
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par ouskel'n'or
    Il ne peut pas passer par initialize si tu fais Userform2.hide.
    Si tu veux qu'il le fasse, ne le masque pas, décharge-le par
    Oui c'est ce que j'ai essayé de faire mais comme je l'appelle depuis lui même, ça ne fonctionne pas, il ne se ferme pas.

  8. #8
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Tu ne peux pas appeler un userform depuis lui-même. On tourne en rond, là.
    Fait une procédure d'initialisation que tu appelles depuis Userform_Initialize.
    Utilise Me.Hide pour masquer l'userform
    Et quand tu veux l'afficher et donc le ré-initialiser, tu rappelles la procédure d'init.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub Init()
    'Init des données
    End sub
     
    Sub Userform_Initialize()
    Init
    End sub
     
    Sub QuandTuVeuxRéInitialiser()
    Userform.Hide
    'Le code qui fait ce que tu veux
    Init
    Userform.show
    End sub
    M'enfin !

  9. #9
    Candidat au Club
    Inscrit en
    Avril 2007
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 27
    Points : 2
    Points
    2
    Par défaut
    j'ai du mal m'exprimer

    Quand je disais que je l'appelais depuis lui même je parlais du "Unload Userform2"

    En fait ce que je fais:
    Depuis Userform1:
    Load Userform2
    Userform2.Show

    J'affiche mes trucs dans userform2
    Ensuite dans Userform2, je clique sur un bouton qui fait
    Unload Userform2

    et là, userform2 ne se ferme pas si je rajoute un Userform2.Hide, il se cache, mais quand je reclique dans userform1 il ne se réinitialise pas.

  10. #10
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Citation Envoyé par Tu
    J'affiche mes trucs dans userform2
    Ensuite dans Userform2, je clique sur un bouton qui fait
    Unload Userform2
    Si tu fais ça, Userform2 est déchargé. Ok ?

    Citation Envoyé par Tu
    et là, userform2 ne se ferme pas si je rajoute un Userform2.Hide, il se cache, mais quand je reclique dans userform1 il ne se réinitialise pas.
    Tu n'as pas à ajouter ça ! Contente-toi de "Unload Userform2" dans Userform2 et quand tu relanceras Userform2 depuis Userform1, il s'initialisera de nouveau.

  11. #11
    Candidat au Club
    Inscrit en
    Avril 2007
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 27
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par ouskel'n'or
    Si tu fais ça, Userform2 est déchargé. Ok ?
    Oui je suis bien d'accord avec toi, c'est ce que j'avais compris, mais si je fais un "Unload Userform2" et bien le userform ne disparait pas....

  12. #12
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Il s'appelle comment ton userform2 ?
    Remplace Unload Userform2 par
    Ou alors... Userform1 te le relance sans que tu lui demandes...
    Si "Me" ne fonctionne pas, vérifie ce que tu fais dans Userform1
    Il existe deux manières de décharger un userform sans interrompre le programme, et c'est, soit la croix en haut à droite" soit
    Qu'est-ce qu'il se passe si tu fermes avec la croix ?

  13. #13
    Candidat au Club
    Inscrit en
    Avril 2007
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 27
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par ouskel'n'or
    Il s'appelle comment ton userform2 ?
    Remplace Unload Userform2 par
    Ou alors... Userform1 te le relance sans que tu lui demandes...
    Si "Me" ne fonctionne pas, vérifie ce que tu fais dans Userform1
    Il existe deux manières de décharger un userform sans interrompre le programme, et c'est, soit la croix en haut à droite" soit
    Qu'est-ce qu'il se passe si tu fermes avec la croix ?
    Yes tu m'as mis sur la voie! J'ai trouvé la cause du problème, te souviens tu de ce petit bou de code qui permettait de verrouiller la croix:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    Cancel = True
    End Sub
    et bien c'est lui qui empeche le bon fonctionnement.
    Donc voilà désormais ma question comment faire pour que les deux cohabitent...

  14. #14
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    La solution la plus simple est d'utiliser un boolean que tu déclares en tête de la feuille de code d'userform2
    Dans le clic de ton bouton, tu mets
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Private Sub CommandButton1_Click()
        Quitter = MsgBox("Etes-vous sûr de vouloir retourner au menu précédent?", vbOKCancel, "Menu précédent") = vbOK
        if quitter then Unload admin_liste_a_faire
    End Sub
    Rien de plus
    Et dans queryclose,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    Cancel = not quitter
    End Sub
    Si Quitter = false, Cancel = True -> La croix est inopérante
    Si Quitter = True, Cancel = False -> La croix est opérante
    Mais je ne suis pas certain que ce soit ça
    Ta ligne (inutile) Userform.Hide avant Unload Userform peut aussi avoir eu un effet pervers
    Tu dis

  15. #15
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Points : 2 416
    Points
    2 416
    Par défaut
    Bonjour, j'ai un peu galérer pour détecter et remédier au problème, en fait il est impossible de passer d'une forme à l'autre parce qu'un userForm ne peut s'ouvrir qu'en modal. Du moins c'est ce que j'ai constaté.
    Pour y remédier j'ai utiliser l'astuce suivante.

    Dans un module j'ai déclaré
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public Action as integer
    J'ai mis la 1ére partie dans l'évènement Form_Change mais il devrait se trouver à l'endroit d'où tu appel la feuille.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
        UserForm1.Show
    reco:
        Select Case Action
        Case 1
            UserForm1.Show
        Case 2
            UserForm2.Show
        End Select
        If Action <> 0 Then GoTo reco
    End Sub
    Dans chaque UserForm - 2 boutons avec les libellés
    Userform1
    Bt1.caption="Vers Form2" : nom =VersUser2
    Bt2.caption="Termine" : nom FiniTout
    avec le code suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Private Sub FiniTout_Click()
        Action = 0
        Unload Me
    End Sub
     
    Private Sub VersUser2_Click()
        Action = 2
        Label1.Caption = "" 
        Unload Me
    End Sub
     
    Private Sub UserForm_Initialize()
        Label1.Caption = "Initialise 1" 'pour bien contrôlé que je passe par initialize
        Action = 0
    End Sub
    UserForm2
    Bt1.caption="Vers Form1" : nom =VersUser1
    Bt2.caption="Termine" : nom FinTout
    Avec le code suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Private Sub FinTout_Click()
        Action = 0
        Unload Me
    End Sub
     
    Private Sub VersUser1_Click()
        Action = 1
        Label1.Caption = "" 
        Unload Me
    End Sub
     
    Private Sub UserForm_Initialize()
        Label1.Caption = "Initialise 2" 'pour bien contrôlé que je passe par initialize
        Action = 0
    End Sub
    Les boutons termine peuvent êtres remplacés par la croix, ça fonctionne aussi.

    Tu pourras peut-être te débrouillés avec cela.
    A+

  16. #16
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Citation Envoyé par LeForestier
    Bonjour, j'ai un peu galérer pour détecter et remédier au problème, en fait il est impossible de passer d'une forme à l'autre parce qu'un userForm ne peut s'ouvrir qu'en modal. Du moins c'est ce que j'ai constaté.
    NON ! On peut parfaitement passer d'un userform à un autre ! Et revenir sur l'userform appelant si celui-ci a été masqué avec .Hide. Nous sommes nombreux à le faire depuis une décennie avec VBA et depuis bien plus longtemps avec VB sans pb. Ce n'est qu'une question de syntaxe.
    Enfin, ce que j'ai mis fonctionne.

  17. #17
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Points : 2 416
    Points
    2 416
    Par défaut
    Citation Envoyé par ouskel'n'or
    NON ! On peut parfaitement passer d'un userform à un autre ! Et revenir sur l'userform appelant si celui-ci a été masqué avec .Hide. Nous sommes nombreux à le faire depuis une décennie avec VBA et depuis bien plus longtemps avec VB sans pb. Ce n'est qu'une question de syntaxe.
    Enfin, ce que j'ai mis fonctionne.
    Bonjour Ouskel’n’or ,
    Il est évident qu’avec l’expérience de nombreux utilisateurs et depuis une dizaine d’année cela fait une super expérience, mais je suis toujours disposé à apprendre avec seulement mes 20 ans d’expérience en VB.

    Mais si je peu me permettre, je rappel que la question de pm2036 est :
    Un "UserForm_Initialize()" se lance-t-il à chaque fois qu'on appelle un userform?
    Car dans mon cas ça ne fonctionne pas... uniquement lors du premier lancement.
    Ci dessous un exemple de l'ouverture du uf "admin_liste_a_faire" depuis l'uf "admin_voir_a_faire"

    1ére constatation : Pour répondre à cette question, un UF ne passe par l’initialisation qu’à la 1ére fois qu’il est appelé. D’ ou le système de Unload et Show que j’ai employé qui réinitialise l’UF à chaque fois.
    2em constatation : UF1 = show – Appel UF2 - UF1=hide : UF1 perd le focus MAIS EST TOUJOUR VISIBLE
    Si vous n’avez pas spécifié d’emplacement sur l’écran l’UF1 est juste en dessous de UF2, déplacez UF2 pour contrôler.
    3em constatation : Dans la suite d’action décrite ci-dessus UF2 action = UF1.show (pour revenir sur UF1 et l’erreur suivante survient.

    Erreur d’exécution’400’ :
    Feuille déjà affichée ; affichage modal impossible

    Seule possibilité que j’ai trouvé c’est de décharger UF2 (unload) - UF1 (toujours visible) reprend normalement le focus mais ne repasse pas par initialize.

    Mais je suis toujours preneur si vous pouvez m’expliquer comment passer d’un UF à l’autre en les mettant Hide.
    Cordialement

  18. #18
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Tu me laisses une minute et je te montre qu'il s'agit bien d'un problème de syntaxe, rien d'autre. Comme je t'ai dit...

    Edit
    Ou alors on ne parle pas de la même chose...

    Je te joins le fichier. J'ai utiliser l'heure afin de bien montrer que la donnée se ré-initialise.
    Tu me dis si j'interprète mal le problème mais c'est ce que j'en ai compris.
    Pièce jointe 14819
    A+

  19. #19
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Points : 2 416
    Points
    2 416
    Par défaut
    Citation Envoyé par ouskel'n'or
    NON ! On peut parfaitement passer d'un userform à un autre ! Et revenir sur l'userform appelant si celui-ci a été masqué avec .Hide. Nous sommes nombreux à le faire depuis une décennie avec VBA et depuis bien plus longtemps avec VB sans pb. Ce n'est qu'une question de syntaxe.
    Enfin, ce que j'ai mis fonctionne.
    J'ai effectivement chargé ton Zip, il répond à l'affirmation que tu donne ci- dessus avec .Hide , MAIS....

    Essaye de faire : monter jusque Monter3 appuyer sur la croix et ensuite sauver le fichier ?? , les UF sont toujours chargées et de plus occupe inutilement de la mémoire.
    J'ai également essayè les autres possibilités. Comme de redescendre jusqu'à effacement complet.
    Est-ce que ta démonstration est toujours valable ? et si oui, comment contourner ce Pb.
    j'ai également essayé celà

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub ouvrir()
        Load UserForm1
        UserForm1.Show
        Unload UserForm1
        Unload UserForm2
        Unload UserForm3
    End Sub
    Cordialement.

  20. #20
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Le dernier exemple que tu donnes ne pourras jamais fonctionner. Tu es dans le module quand tu fais ça, pas dans un userform, et en outre, certainement pas dans cet ordre. Pour que ça fonctionne, je regarde mais j'ai déjà fait ça. J'utilise un boolean déclaré en public. Je fais ça et je te joins le fichier.
    A+

Discussions similaires

  1. [XL-2013] Problème d'ouverture d'Userform
    Par Patouillou dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 23/05/2015, 14h47
  2. Ouverture de userform par clic sur un bouton de formulaire
    Par karlgina dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 02/06/2011, 20h29
  3. Comment executer à l'ouverture un userform
    Par popsmelove dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 17/01/2008, 18h42
  4. [VBA-E]Combobox reste vide à l'ouverture du Userform
    Par cacolac78 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 20/02/2007, 13h00
  5. VBA : ouverture d'un Userform sans passer par excel
    Par jemigo dans le forum Macros et VBA Excel
    Réponses: 28
    Dernier message: 23/11/2005, 17h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo