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 :

Macros et poupées russes : exécuter une macro une seule fois [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2016
    Messages : 14
    Par défaut Macros et poupées russes : exécuter une macro une seule fois
    Bonjour,

    J'ai des macros structurées comme ceci :
    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
    18
    19
    sub macro1()
    ....
    call macro2
    call macro 3
    end sub
     
    sub macro2()
    ...
    call macro4
    end sub
     
    sub macro3()
    ...
    call macro4
    end sub
     
    sub macro4()
    ...
    end sub
    Quand je lance la macro 1, la macro 4 est donc exécutée deux fois.
    Mais les macros 2 et 3 doivent pouvoir être exécutée indépendamment et dans ce cas elles doivent bien exécuter la macro 4 (si je lance seulement la macro 2, la macro 4 doit bien être appelée à la fin de la macro 2, idem quand je lance la macro 3).

    J'ai bien lu les aides sur les appels de macros, mais n'y ai malheureusement pas trouvé le meilleur moyen de gérer mon cas.
    Pourriez-vous m'aiguiller vers la meilleure pratique possible pour gérer au mieux cette situation et ne pas appeler deux fois la macro 4 quand je lance la macro 1 s'il vous plait ?

  2. #2
    Expert confirmé Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Par défaut
    Bonjour,
    pour le peu que tu montres, je dirais, ré-organises tes macros, sers-toi de variables en "Boolean",...
    Cordialement,
    Dom
    _____________________________________________
    Vous êtes nouveau ? pour baliser votre code, cliquer sur cet exemple : Anomaly
    pensez à cliquer sur :resolu: si votre problème l'est
    Par contre, il est désagréable de voir une discussion résolue sans message final du demandeur (satisfaction, désarroi, remerciement, conclusion...)

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2016
    Messages : 14
    Par défaut
    Merci pour la piste.
    Comme ceci cela semble fonctionner :

    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
    18
    19
    sub macro1()
    ....
    call macro2(false)
    call macro 3
    end sub
     
    sub macro2(optional GoMacro as boolean)
    ...
    If GoMacro <> False Then call macro4
    end sub
     
    sub macro3()
    ...
    call macro4
    end sub
     
    sub macro4()
    ...
    end sub
    Est-ce bien comme ça qu'il faut procéder ?

  4. #4
    Expert confirmé Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Par défaut
    à ce stade, je dirais pourquoi pas, le "Optional" n'est peut-être pas forcément requis mais on ne voit pas tes macros alors....
    mais l'idée des "Boolean" est bien celle-ci

    EDIT : j'aurais mis la variable "Gomacro" en "Public" en haut d'un module (avant les Sub)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public Gomacro as Boolean
    et aurais programmé en fonction
    Cordialement,
    Dom
    _____________________________________________
    Vous êtes nouveau ? pour baliser votre code, cliquer sur cet exemple : Anomaly
    pensez à cliquer sur :resolu: si votre problème l'est
    Par contre, il est désagréable de voir une discussion résolue sans message final du demandeur (satisfaction, désarroi, remerciement, conclusion...)

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2016
    Messages : 14
    Par défaut
    Je ne suis pas sûr de comprendre.
    C'est la macro 4 que tu aurais mis en fonction ?

  6. #6
    Expert confirmé Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Par défaut
    dans un module standard, avant les procédures si il y en a
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Public Gomacro As Boolean
    Sub machin()
    ...
    et en fonction de tes besoins
    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
    sub macro1()
    Gomacro = False
    ....
     
    call macro2()
    If Gomacro = True'à toi de voir quand remettre à True
    call macro 3
    end sub
     
    sub macro2()
    ...
    If GoMacro <> False Then call macro4
    end sub
     
    sub macro3()
    Cordialement,
    Dom
    _____________________________________________
    Vous êtes nouveau ? pour baliser votre code, cliquer sur cet exemple : Anomaly
    pensez à cliquer sur :resolu: si votre problème l'est
    Par contre, il est désagréable de voir une discussion résolue sans message final du demandeur (satisfaction, désarroi, remerciement, conclusion...)

  7. #7
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 173
    Billets dans le blog
    53
    Par défaut
    Bonjour Dominique,
    EDIT : j'aurais mis la variable "Gomacro" en "Public" en haut d'un module (avant les Sub)
    Pour lancer ou pas une procédure, j'opterais plutôt pour un argument boolean et de préférence optionnel comme tu l'as proposé au lieu d'une variable publique.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  8. #8
    Expert confirmé Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Par défaut
    Bonjour Philippe (un petit coucou),

    Ok, j'en conviens mais maintenant il faudrait en savoir un peu plus à moins que le demandeur n'ai trouvé la solution entre temps
    Cordialement,
    Dom
    _____________________________________________
    Vous êtes nouveau ? pour baliser votre code, cliquer sur cet exemple : Anomaly
    pensez à cliquer sur :resolu: si votre problème l'est
    Par contre, il est désagréable de voir une discussion résolue sans message final du demandeur (satisfaction, désarroi, remerciement, conclusion...)

  9. #9
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2016
    Messages : 14
    Par défaut
    Bonjour,

    Je vous remercie pour vos réponses.

    En fait le code suivant me convient bien et fait son office (la macro 4 n'est bien appelée qu'une seule fois, je l'ai vérifié en ajoutant un bête msgbox dans la macro4, qui n'apparait maintenant qu'une fois quand je lance la macro 1) :
    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
    18
    19
    sub macro1()
    ....
    call macro2(false)
    call macro 3
    end sub
     
    sub macro2(optional GoMacro as boolean)
    ...
    If GoMacro <> False Then call macro4
    end sub
     
    sub macro3()
    ...
    call macro4
    end sub
     
    sub macro4()
    ...
    end sub
    Mais vous semblez suggérer qu'il peut avoir des inconvénients selon l'utilisation ?
    Dans mon cas, la macro 1 sert à appeler les autres macros.
    Les macros 2, 3 et 4 gèrent des affichages de zones dans ma feuille.
    Toutes ces macros ne sont appelées que très ponctuellement.

  10. #10
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 173
    Billets dans le blog
    53
    Par défaut
    Bonjour,

    Pour tester la valeur Booléenne True, il suffit d'écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If GoMacro Then call macro4
    et le Call n'est pas obligatoire lorsque l'on appelle une procédure Sub
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  11. #11
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2016
    Messages : 14
    Par défaut
    Je n’étais pas sûr qu'une variable boolean était par défaut à la valeur True. C'est plus simple avec ceci effectivement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If GoMacro Then call macro4
    En revanche je préfère personnellement conserver le "Call Macro" car je trouve que cela permet de bien voir qu'on appelle une macro dans le code.

    Cela fonctionne bien ainsi. Merci à vous tous :-) !!

  12. #12
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 173
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Je n’étais pas sûr qu'une variable boolean était par défaut à la valeur True. C'est plus simple avec ceci effectivement :
    Non, une variable booléenne est égal à False dès sa déclaration comme une variable numérique vaut 0 et une variable de type String est égal à ""

    Dans l'exemple ci-dessous, si l'on ne passe pas la valeur True à la procédure nommée Macro2, l'argument GoMacro sera égal à False
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub Main()
     Macro2 True
    End Sub
     
    Sub Macro2(Optional GoMacro As Boolean)
     If GoMacro Then Macro4
    End Sub
     
    Sub Macro4()
     MsgBox "Coucou"
    End Sub
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  13. #13
    Expert confirmé Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Par défaut
    en complément de Philippe, essayes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub essai()
    Dim Gomacro As Boolean
    If Gomacro Then MsgBox "je suis reconnu donc j'existe"
    If Not Gomacro Then MsgBox "Snif, personne ne m'aime"
    Gomacro = True
    If Gomacro Then MsgBox "je suis reconnu donc j'existe"
    If Not Gomacro Then MsgBox "Snif, personne ne m'aime"
     
    End Sub
    Cordialement,
    Dom
    _____________________________________________
    Vous êtes nouveau ? pour baliser votre code, cliquer sur cet exemple : Anomaly
    pensez à cliquer sur :resolu: si votre problème l'est
    Par contre, il est désagréable de voir une discussion résolue sans message final du demandeur (satisfaction, désarroi, remerciement, conclusion...)

  14. #14
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2016
    Messages : 14
    Par défaut
    Ah ok, merci pour cette dernière indication !

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

Discussions similaires

  1. Exécution élégante d'une macro
    Par CharlyH dans le forum Macro
    Réponses: 4
    Dernier message: 15/10/2008, 19h09
  2. Réponses: 0
    Dernier message: 28/05/2008, 15h15
  3. Syntaxe:Exécution automatique d'une macro
    Par bebertol dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 22/06/2007, 11h20
  4. [VBA-E] Copier une macro dans un fichier à l'aide d'une macro
    Par Capsule dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 09/01/2007, 20h05
  5. exécution automatique d'une macro
    Par faayy dans le forum Access
    Réponses: 12
    Dernier message: 15/06/2005, 14h52

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