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 :

Appel d'une macro d'un autre fichier Excel [XL-2013]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Avril 2013
    Messages : 10
    Par défaut Appel d'une macro d'un autre fichier Excel
    Bonjour à tous,

    Je trouve habituellement mes réponses dans les pages de cet excellent forum mais là, je suis dans une impasse…

    Au boulot, nous recevons quotidiennement des fichiers csv que nous retraitons pour nos besoins.
    Nous avons près de 150 ‘modèles’ en vba Excel qui fonctionnent tous sur le même principe:
    • On lance le modèle, qui lance la sub principale automatiquement :
    • le fichier csv source est identifié et traité (selon les cas : impression, envoi pas mail, enregistrement sur le réseau, application de filtre, etc)
      La sub principale en appelle d’autre en fonction des besoins.
    • puis le modèle se ferme après une demande de confirmation (‘Fermer le modèle ?’).


    Avec le ‘Grand Confinement’, je me retrouve à faire le travail de plusieurs personnes je souhaite donc gagner du temps en enchainent les différents modèles automatiquement.

    J’ai écrit une procédure ‘AllinOne’ qui doit lister les fichiers csv à traiter et appeler les modèles correspondants.

    La boucle d’appel des modèles de ma procédure ‘AllinOne’ :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    'A ce stade, les fichiers csv sont identifiés et listés sur une feuille du classeur.
    'Cells(i,3) contient le nom du modèle à appeler. Cells(i,4) indique si le modèle existe.
        i = 5
        Do While Cells(i, 3) <> ""
            If Cells(i, 4) = "connu" Then
                Modele = Thisworkbook.Path & "\MODELES\" & Cells(i, 3) & ".xlsm"
                Workbooks.Open Modele
     
                Cells(i, 4).Value = "Traité"
            End If
            i = i + 1
        Loop
    La macro du modèle appelé se déroule sans incident...

    MAIS, à la sortie du modèle, après avoir validé la demande de confirmation (‘Fermer le modèle ?’) la macro ‘AllinOne’ ne reprend pas.
    Pas de message d’erreur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    'Fin de la macro des modèles : 
                If MsgBox("Fermer ce modèle ?", vbYesNo) = vbYes Then
                Application.DisplayFullScreen = False
                With ThisWorkbook
                        .Saved = True
                        .Close
                 End With
    J’ai tenté d’utiliser la formulation ‘Application.Run Modele !Module.Procédure’ pour appeler le modèle mais le résultat est identique.

    L'execution pas à pas m'a permis de voir qu'après le .Close, je reviens sur le code de la macro 'AllinOne'.
    Le curseur clignote sous la ligne 'Workbooks.Open Modele' mais la macro est arrêtée.

    Avez-vous une idée pour me sortir de cette ornière ?

    Merci d'avance pour vos conseils.

  2. #2
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Citation Envoyé par Arakawa Voir le message
    La boucle d’appel des modèles de ma procédure ‘AllinOne’ :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    'A ce stade, les fichiers csv sont identifiés et listés sur une feuille du classeur.
    'Cells(i,3) contient le nom du modèle à appeler.
        Do While Cells(i, 3) <> ""
                Modele = ThisworkBook.Path & "\MODELES\" & Cells(i, 3) & ".xlsm"    
     
                Workbooks.Open Modele 
         End If
        i = i + 1
    C'est normal le End If sans If et le Do While sans Loop ?

    Pas de message d’erreur.
    As-tu un On Error dans ton code ?

  3. #3
    Membre habitué
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Avril 2013
    Messages : 10
    Par défaut
    Bonjour Menhir.

    Merci de ton aide.

    Citation Envoyé par Menhir Voir le message
    C'est normal le End If sans If et le Do While sans Loop ?
    Toutes mes excuses. J'ai voulu rendre le code plus clair en le nettoyant pour ne conserver que les lignes pertinentes mais j'ai été trop vite!
    Voila la portion de code correcte (j'ai corrigé également mon message initial):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    'A ce stade, les fichiers csv sont identifiés et listés sur une feuille du classeur.
    'Cells(i,3) contient le nom du modèle à appeler. Cells(i,4) indique si le modèle existe.
        i = 5
        Do While Cells(i, 3) <> ""
            If Cells(i, 4) = "connu" Then
                Modele = Thisworkbook.Path & "\MODELES\" & Cells(i, 3) & ".xlsm"
                Workbooks.Open Modele
     
                Cells(i, 4).Value = "Traité"
            End If
            i = i + 1
        Loop
    Citation Envoyé par Menhir Voir le message
    As-tu un On Error dans ton code ?
    Pas dans ma macro 'AllinOne'.
    Plusieurs dans les macros des modèles mais normalement je rétablis toujour le contrôle d'erreur par un 'On Error goto 0' une fois la zone critique passée.

  4. #4
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Citation Envoyé par Arakawa Voir le message
    MAIS, à la sortie du modèle, après avoir validé la demande de confirmation (‘Fermer le modèle ?’) la macro ‘AllinOne’ ne reprend pas.
    Pas de message d’erreur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    'Fin de la macro des modèles : 
                If MsgBox("Fermer ce modèle ?", vbYesNo) = vbYes Then
                Application.DisplayFullScreen = False
                With ThisWorkbook
                        .Saved = True
                        .Close
                 End With
    Sans certitude, je pense que le problème vient de là.
    Il n'est jamais bon de fermer par macro un fichier qui contient la macro elle-même.
    Pour le Saved=True, pas de problème.
    En revanche, à ta place, je déplacerais le Close dans la boucle de la macro appelante.
    Parce que ton Close va arrêter la macro de manière très brutale et non gérée. Du coup, peut-être que ça arrête complètement VBA en vol et qu'il n'a pas la possibilité de repasser la main à la macro appelante.

    Mais, en y réfléchissant un peu, je me rends compte que ce que tu fais ressemble à du multi-tâche et je ne suis pas sûr que VBA sache gérer ça.
    Je m'explique : Quand tu fais ton Open, comment peux-tu savoir ce que va faire VBA ensuite entre poursuivre la macro principale ou se lancer dans la macro Workbook_Open de ton fichier ouvert. Je ne suis pas sûr qu'il sache faire les deux en même temps.
    Bref, il doit s'emméler les crayons.

    A ta place, je transformerais la macro Workbook_Open de tes fichiers appelés en une macro classique.
    Dans la macro appelante, je mettrais trois lignes : le Open du fichier, un Call pour déclencher la macro du fichier appelé et un Close du fichier appelé.

  5. #5
    Membre habitué
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Avril 2013
    Messages : 10
    Par défaut
    J'ai fait quelques tests en commentant des le fichier modèle appelé par 'AllinOne'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    With ThisWorkbook
                        .Saved = True
                        .Close
    End With
    et effectivement ça solutionne le problème.
    Je vais travailler dans la direction que tu propose.
    Heureusement que j'ai déjà sous le coude un bout de code qui me permet de modifier le code des modèles en masse !

    Pour info, la fermeture du fichier qui contient la macro par la macro elle meme correspond à une demande des utilisateurs : on clique sur le fichier modèle, ça mouline, et ça se ferme.

    Encore merci pour ton aide.

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

Discussions similaires

  1. Appeler une macro d'un autre fichier excel correctement
    Par pboiteux dans le forum Général VBA
    Réponses: 2
    Dernier message: 23/06/2015, 18h12
  2. appel d'une sub d'un autre fichier xls (avec sorties)
    Par hector2 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 03/08/2007, 12h28
  3. [POO] appel d'une méthode d'un autre fichier, le tout objet
    Par aaaaaaaa dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 13/07/2007, 19h43
  4. appel d'une variable d'un autre fichier
    Par jmbonnaz dans le forum MATLAB
    Réponses: 1
    Dernier message: 18/04/2007, 12h08
  5. Réponses: 1
    Dernier message: 23/09/2006, 15h12

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