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 :

Enchainement de macros [XL-2016]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2017
    Messages
    1 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2017
    Messages : 1 291
    Par défaut Enchainement de macros
    Bonjour,

    j'ai un classeur "C" dans le lequel une macro "M1" s'exécute et lance une seconde macro "M2"

    Cette macro "M2" détecte une erreur, affiche une Msgbox et fait "Exit sub"

    Le problème est qu'on revient dans la macro"M1" qui continue de s'exécuter

    Je voudrai après la msgbox sortir de "M1" et de "M2" en restant sur le casseur "C"

    J'ai essayé "Quit" mais cette fonction quitte excel

    existe-t-il une solution ?

  2. #2
    Expert éminent

    Profil pro
    Conseil, Formation, Développement - Indépendant
    Inscrit en
    Février 2010
    Messages
    8 587
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Conseil, Formation, Développement - Indépendant

    Informations forums :
    Inscription : Février 2010
    Messages : 8 587
    Par défaut
    Bonjour

    Il faut prévoir une variable pour tester la bonne exécution de M2 (ou bien faire de M2 une fonction qui retourne une valeur)

    Par exemple :
    Dans M1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    MM2=True
    Call M2
    Il MM2=False then exit sub (intercaler éventuellement des lignes qui ne laissent pas Excel dans une état instable)
    Dans M2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ...Msgbox...
    MM2=false 
    Exit Sub
    Déclarer la variable en Public

  3. #3
    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 184
    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 184
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Si ta procédure nommée M2 est une Sub, transforme la en Function qui renvoie une valeur booléenne et au retour dans M1, tu testes si la valeur renvoyée est True ou False
    Exemple du code de la procédure Main qui invoque trois procédures Function
    Les procédures se succèdent mais s'interrompent si l'une d'elles renvoie False
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub Main()
      If Process1 Then
         If Process2 Then
            Process3
         End If
      End If
    End Sub
    Exemple de trois fonctions nommées Process1, 2 & 3 dont la deux renvoie False
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Function Process1() As Boolean
      MsgBox "Process 1"
      Process1 = True
    End Function
    Function Process2() As Boolean
      MsgBox "Process 2"
      Process2 = False
    End Function
    Function Process3() As Boolean
      MsgBox "Process 3"
      Process3 = True
    End Function
    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

  4. #4
    Membre éprouvé
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2017
    Messages
    1 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2017
    Messages : 1 291
    Par défaut
    Merci à vous 2,

    j'ai un autre cas semblable mais sur 2 classeurs et auquel je n'avais pas pensé :

    Sur une feuille "F1" d'un classeur "C1", un bouton exécute une macro "M1" qui ouvre un classeur "C2"

    Dans "Thisworbook open" de C2 une erreur peut être détectée et est affichée dans une Msgbox avant de faire "Exit sub"

    Je voudrai après la msgbox sortir du classeur "C2" (Exit sub) mais aussi de la macro "M1" tout en restant sur la feuille "F1"

  5. #5
    Membre Expert Avatar de Transitoire
    Homme Profil pro
    Auditeur informatique
    Inscrit en
    Décembre 2017
    Messages
    733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Auditeur informatique

    Informations forums :
    Inscription : Décembre 2017
    Messages : 733
    Par défaut
    Bonjour, Exit Sub arrête la macro en cours, si vous voulez arrêter toutes les macros il faut mettre End, qui arrête toutes les macros en cours. attention, à l'état des choses en cours au moment de l'arrêt?
    Cordialement

  6. #6
    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 184
    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 184
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Plusieurs possibilités dont en voici une
    Dans la procédure événementielle Workbook_Open du classeur C2 (ici nommé Test Ouverture Classeur.xlsm), on place un On Error
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Public Sub workbook_Open()
     dim r as double 
     On Error Resume Next
     r = 10 / 0
    End Sub
    Dans la procédure nommée Main du classeur C1 (ici ThisWorkbook), on intercepte le numéro de l'erreur et on choisi l'option à prendre en fonction de ce numéro
    Exemple
    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
    Sub Main()
      Dim wkb As Workbook
      Dim appFolder As String, Fullname As String
      Dim errN As Long
      appFolder = ThisWorkbook.Path
      Fullname = appFolder & "\" & "Test Ouverture Classeur.xlsm"
      Set wkb = Workbooks.Open(Fullname)
      errN = Err.Number
      On Error GoTo 0
      If errN Then
          MsgBox "La procédure doit s'arrêter"
          wkb.Close
        Else
         MsgBox "On continue"
      End If
    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

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Salut

    Citation Envoyé par Philippe Tulliez Voir le message
    [...]
    Le périmètre de la gestion d'une exception est la procédure dans laquelle le gestionnaire a été installé et sa pile d'appel. Une erreur ne remonte donc jamais au delà de la procédure qui la gère. Il n'est pas possible de propager l'erreur dans une autre procédure, et il n'est donc pas possible, dans la procédure Main, de récupérer le numéro d'une erreur survenue dans une autre procédure, a fortiori d'un autre classeur. C'est dans la procédure Main que l'on doit placer le gestionnaire d'erreurs, dans le cas illustré.

    [EDIT] Mal lu la réponse de Philippe
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Salut.

    Une autre solution est de générer une nouvelle erreur dans la procédure qui l'a interceptée.

    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 Main()
      On Error Resume Next
      Proc2
      If Err = 0 Then
        MsgBox "On continue"
      Else
        MsgBox "On arrête"
      End If
     
    End Sub
     
    Sub Proc2()
      On Error Resume Next
      Debug.Print 5 / 0
      If Err <> 0 Then
        MsgBox "Erreur: " & Err.Description
        Err.Raise Err.Number
      End If
    End Sub
    Cela étant dit, il me semblerait a priori plus simple et surtout plus correct de ne pas gérer l'erreur dans la Proc2 et de le faire uniquement dans la proc 1. Ce genre de montage révèle régulièrement un problème d'architecture de code.

    Si besoin de gérer l'erreur dans la proc2 (fichier ou connexion à refermer, ...), cette gestion d'erreur dans Proc2 devrait être transparente pour l'utilisateur, et la proc2 devrait alors être transformée en fonction pour renvoyer une valeur qui sera gérée dans la procédure appelante, comme Philippe l'a montré au #3. Dans ce cas, on utilise souvent Function ...(...) As Long et on renvoie soit 0 (tout s'est bien passé), soit une valeur qui permet au code appelant de gérer le problème rencontré.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  9. #9
    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 184
    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 184
    Billets dans le blog
    53
    Par défaut
    Bonjour Pierre,
    Le périmètre de la gestion d'une exception est la procédure dans laquelle le gestionnaire a été installé. Il n'est pas possible de propager l'erreur dans une autre procédure, et il n'est donc pas possible, dans la procédure Main, de récupérer le numéro d'une erreur survenue dans une autre procédure, a fortiori d'un autre classeur. C'est dans la procédure Main que l'on doit placer le gestionnaire d'erreurs, dans le cas illustré.
    C'est ce que je pensais également mais comme je ne publie jamais un code sans l''avoir testé, je poeux te confirmer que dans ce cas d'espèce, j'ai bien la valeur 11 renvoyée comme erreur et lorsqu'il n'y a pas d'erreur j'ai bien 0
    Ceci étant dit, personnellement je gère tout dans un seul classeur ou depuis un xlam et les classeurs supplémentaires que je dois ouvrir ne contiennent que des données.
    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

  10. #10
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Mea Culpa, Philippe

    Et en fait, c'est effectivement le comportement tout à fait normal puisque l'erreur remonte la pile d'appels si le gestionnaire n'est pas remis à 0. C'est d'ailleurs ce que j'explique dans mon message suivant.

    A mon avis, je n'avais pas ma dose de café lorsque j'ai répondu à ton message. Encore désolé pour la méprise. Du coup,

    Et le pire, c'est que sachant que tu testes toujours tes solutions, je l'avais testée aussi (j'ai pas dû bien ouvrir les yeux...)
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

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

Discussions similaires

  1. Principe d'enchainement des macros dans VBA
    Par doctornono dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 18/09/2017, 14h32
  2. [XL-2003] Enchainer les macros les unes à la suite des autres
    Par Vincent32 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 29/09/2011, 15h55
  3. enchainement de macro
    Par braquin dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 08/06/2011, 11h31
  4. [AC-2007] enchainer plusieures macros
    Par nabou dans le forum Access
    Réponses: 7
    Dernier message: 28/01/2011, 17h46
  5. Peut-on enchainer plusieurs Macros ?
    Par malabarbe dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 12/08/2007, 23h18

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