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 :

UserForm bloquante et éxécution de fonction


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 103
    Par défaut UserForm bloquante et éxécution de fonction
    Bonjour à tous,

    J'ai une question à laquelle je n'arrive pas trouvé de réponse.

    J'ai un onglet excel qui contient des données sur plusieurs lignes. Je parcours cet onglet grâce à une fonction contenue dans un "module". A chaque ligne je remplie une userform que je n'affiche pas car j'en ai pas besoin. Par contre dans certains cas je dois modifier cette UserForm, dans ce cas je l'affiche grâce à la fonction .Show.

    Mon problème est que quand j'affiche cette UserForm cela ne bloque pas l’exécution de la fonction de recherche. Je voudrais qu'une fois la UserForm affichée la fonction de recherche attende que celle-ci soit ressortie pour continuer le parcours de l'onglet. Sachant qu'à la sortie de la UserForm une autre fonction est appelée et que donc il faudrait que la fonction de recherche attende la fin de l'exécution de cette fonction pour continuer.

    Voici un exemple de mon code :

    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
    16
    17
     
            For TrainGOV = 2 To NbTrainGOV
                NumTrainGOV_AR = SheetDonnees.Cells(TrainGOV, col_trainAR)
                'On test si le train existe
                If NumTrainCRITER_AR = NumTrainGOV_AR Then 'And NumTrainCRITER_DEP = NumTrainGOV_DEP Then
                    'Remplissage de la UserForm sans l'afficher
                    Call RecupTrainComplet(TrainGOV, SheetDonnees, "non")
     
                    If HeureTrainCRITER_AR <> HeureTrainGOV_AR Or HeureTrainCRITER_DEP <> HeureTrainGOV_DEP Then
                        a = MsgBox("Train n°" & NumTrainCRITER_AR & " / " & NumTrainCRITER_DEP & " : les heures d'arrivées et de départ ne correspondent pas !", vbCritical, "Différence Import CRITER")
                        SheetGOV.Select
                        Modifier.Show
                    Else
     
                    End If
                End If
            Next TrainGOV
    Si l'un d'entre vous à une idée ?

  2. #2
    Membre expérimenté
    Homme Profil pro
    Ingénieur commercial
    Inscrit en
    Février 2015
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur commercial

    Informations forums :
    Inscription : Février 2015
    Messages : 118
    Par défaut
    Bonsoir,

    Idée ?

    Met un Flag=True avant ton .show

    Boucle ensuite avec un while en attendant Flag=False. (met au minimum un DoEvents dans ta boucle d'attente while).

    A la fin de la fonction applelée à la fermeture du UserFom, met Flag=False.

    A+

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 103
    Par défaut
    Ah ouais c'est tout bête mais ça marche. Merci .

  4. #4
    Membre expérimenté
    Homme Profil pro
    Ingénieur commercial
    Inscrit en
    Février 2015
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur commercial

    Informations forums :
    Inscription : Février 2015
    Messages : 118
    Par défaut
    Contenu du message :
    ***************
    Bon finalement ça ne marche comme je voudrais.

    J'ai fait comme tu m'as proposé, j'ai créé un variable EndModifier dans Modifier.
    Je l'initialise à false dans la fonction Modifier.UserForm_Initialize()
    Et je la met à true à la sortie de ma userform par appui sur le bouton enregistrer.

    Bon là j'ai plusieurs problèmes :
    - Si la fonction sort de la userform par un autre bouton que le bouton enregistrer (la croix par exemple) je ne met pas mon flag à true et donc je reste bloqué dans mon while. Il existerait pas une fonction OnClose de la userform ?
    - Ensuite je me rend compte que le code (oui il est pas de moi à la base je le reprend ) quand on clique sur le bouton enregistrer ne "kill" pas la userform il fait seulement un me.hide. Résultat si je l'appel plusieurs fois d'affilé ca marche le premier coup, mais après elle ne repasse jamais dans la fonction initialize ou la fonction activate et donc ne remet jamais mon flag à false.

    Donc là je vois comment faire de manière bien crade en appelant mon flag partout ou j'en ai besoin dans le code même si je ne suis pas dans le même module mais je me demande si il n'y a pas une manière plus propre de faire ce que j'essai de faire ?
    ***************

    Salut,

    utilise :
    et non le .hide

    et utilise cette fonction :_QueryClose pour passer ton Flag de fermeture.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    MsgBox ("Fermé")
    End Sub
    A+

    Et je me rends compte que je réponds à un message qui a été supprimé !?

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 103
    Par défaut
    Oui désolé j'ai supprimé mon message après l'avoir et être tombé sur un tuto qui expliquait j'ai eu honte d'avoir posé des questions aussi basiques donc j'ai supprimé le message avant que quelqu'un ne perde du temps à me répondre alors que les réponses étaient dans le premier tuto sur les userform, mais tu as été trop rapide.

    Et puis bon finalement je n'arrive pas à faire ce que je veux.

    Je suis effectivement passé à Unload Me pour fermé la userform, le problème que j'ai c'est que avant de fermer ma form je met mon flag à true dans la fonction terminate mais quand ma form se ferme ça kill aussi mon flag. Donc mon while qui check le flag recrée une nouvelle instance de ma userform et ce qui rappel la fonction activate qui me réinitialise mon flag à false et donc mon while ne s’arrête pas.

  6. #6
    Membre expérimenté
    Homme Profil pro
    Ingénieur commercial
    Inscrit en
    Février 2015
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur commercial

    Informations forums :
    Inscription : Février 2015
    Messages : 118
    Par défaut
    Souhaites-tu persévérer ?

    Si oui, dit le, je t'aiderai.

    A+

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 103
    Par défaut
    Oui je le souhaite .

  8. #8
    Membre expérimenté
    Homme Profil pro
    Ingénieur commercial
    Inscrit en
    Février 2015
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur commercial

    Informations forums :
    Inscription : Février 2015
    Messages : 118
    Par défaut
    Salut,

    Excellent choix.

    Reprenons donc le problème.

    'ai fait comme tu m'as proposé, j'ai créé un variable EndModifier dans Modifier.
    Je l'initialise à false dans la fonction Modifier.UserForm_Initialize()
    Et je la met à true à la sortie de ma userform par appui sur le bouton enregistrer.
    Tu as donc déclaré EndModifier au niveau de ton Userform n'est-ce pas ?
    Le problème est que ton module ne connait pas EndModifier.
    Il faut modifier la portée de EndModifier et le déclarer en Global (à la place de DIM).
    Pour cela, il faut faire la déclaration au niveau de ton module.

    Je suis effectivement passé à Unload Me pour fermé la userform, le problème que j'ai c'est que avant de fermer ma form je met mon flag à true dans la fonction terminate mais quand ma form se ferme ça kill aussi mon flag. Donc mon while qui check le flag recrée une nouvelle instance de ma userform et ce qui rappel la fonction activate qui me réinitialise mon flag à false et donc mon while ne s’arrête pas.
    Ok pour le Unload Me.
    Personnellement, j'utilise plutôt _QueryClose(Cancel As Integer, CloseMode As Integer) et non "Terminate".

    Ton problème vient seulement de la porté "Locale" de ton Flag.

    Dans le Module :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    ' Variables globales : vues aussi par le UserForm
    Global Flag As Boolean
    Global Compteur As Integer
     
    Sub Boucle_a_mettre_en_pause()
        For Compteur = 1 To 3
            Flag = True
            UserForm1.Show
            Do
                DoEvents
            Loop While Flag = True
        Next Compteur
    End Sub
    Dans le UserForm:
    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 CommandButton1_Click()
        'Bouton pour fermer
        Unload Me
    End Sub
     
    Private Sub UserForm_Activate()
        'Juste pour l'exemple pour vérifier le passage des variables et l'attente dans la boucle
        Label1.Caption = Compteur
    End Sub
     
    Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
        'Sortie du UserForm commande la sortie de la boucle
        Flag = False
    End Sub
    A+

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 103
    Par défaut
    Merci pour ton aide, ça fonctionne parfaitement.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2013] Userform : bloquer l'éxécution de la macro
    Par Pix_elle dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 19/09/2016, 17h05
  2. [XL-2013] Affichage d'une image .bmp impossible dans une userform (erreur d'éxécution 481)
    Par juliien dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 11/03/2015, 09h46
  3. [E-03] Rafraichissement userform durant l'éxécution
    Par toinou28 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 09/02/2009, 17h37
  4. [C#][ACCESS] éxécution de fonction
    Par ALCINA dans le forum C++/CLI
    Réponses: 3
    Dernier message: 30/11/2006, 15h52
  5. USER DEFINE FONCTION : PB éxécution requête
    Par juelo dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 26/01/2004, 11h12

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