Consolidation de classeur

Résolu
Lovamavi -  
eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour à tous et avant toutes choses bonne année.

Voilà je suis novice en vba et je n'arrive pas à trouver et à adapter un code source me permettant de répondre à mes attentes qui sont les suivantes :

J'ai un répertoire qui comporte plusieurs classeur (Agent1.xls, Agent2.xls, ...) avec pour chacun un onglet par mois (JANVIER, FEVRIER, ...) ayant tous la même structure (même position de cellule)
J'ai créé un classeur SYNTHESE.xls ayant la même structure que les fichiers agents et j'aimerai récupérer par VBA dans chacune des cellules de ce fichier la somme des données de chaque cellule des différents classeurs du répertoire (cellule E12 de Agent1.xls + cellule E12 de Agent3.xls + cellule E12 de Agent3.xls, ...)
J'espère avoir été assez clair pour bénéficier de votre génie dans le domaine de la vba

Lovamavi

8 réponses

  1. lovamavi
     
    Merci ERIIC pour ta réponse.
    J'ai testé le code, mais cela bloque à la ligne "shDest.Range(plageRecup).ClearContents" !
    Cela peut-il venir du fait que les feuilles sont protégées ?
    1
    1. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
       
      Ah ben oui, pour écrire dessus c'est impératif qu'elles ne le soient pas.
      Je supprime tout le contenu de la plage indiquée avant de faire les sommes.

      Ajouter ces lignes avant et après traitement de chaque feuille :
      shDest.Unprotect Password:="pw"
      shDest.Protect Password:="pw"

      eric
      0
  2. Raymond PENTIER Messages postés 58213 Date d'inscription   Statut Contributeur Dernière intervention   17 482
     
    Je ne vois vraiment pas l'utilité de passer par VBA pour un calcul aussi simple !
    0
    1. Lovamavi
       
      Bonjour a vous aussi ...
      Bien entendu, les formules fonctionnent mais le nom des fichiers excel vont changer et il faudra à ça moment la changer les formules ... Voilà le pourquoi de la VBA.
      0
    2. Raymond PENTIER Messages postés 58213 Date d'inscription   Statut Contributeur Dernière intervention   17 482
       
      Alors ça, c'est une information qui nous manquait ...
      0
  3. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     
    Bonjour,

    une proposition :
    Sub Synthese()
        ' adapter la plage à sommer sur tous les fichiers
        Const plageRecup As String = "B2:C3"
        '
        Dim chemin As String, Fichier As String
        Dim wb As Workbook, shDest As Worksheet, shSource As Worksheet
        Dim c As Range
    
        Set wb = ThisWorkbook
        chemin = wb.Path + "\"
        Application.ScreenUpdating = False
        ' nettoyage
        For Each shDest In wb.Worksheets ' pour chaque feuille
            shDest.Range(plageRecup).ClearContents
        Next shDest
        '
        ' pour chaque fichier
        Fichier = Dir(chemin & "*.xl*")    ' 1er fichier
        Do While (Len(Fichier) > 0)
            If Fichier <> ThisWorkbook.Name Then
                Workbooks.Open chemin & Fichier
                ' traitement
                For Each shDest In wb.Worksheets ' pour chaque feuille
                    Set shSource = Worksheets(shDest.Name)
                    For Each c In shDest.Range(plageRecup)
                        c = c + shSource.Range(c.Address)
                    Next c
                Next shDest
                ActiveWorkbook.Close
            End If
            Fichier = Dir()    ' fichier suivant
        Loop
        Application.ScreenUpdating = True
    End Sub 

    https://www.cjoint.com/c/CAmg00n6DJn
    à tester... tous les fichiers y compris Synthèse.xls doivent être dans le même répertoire
    La plage à additionner est fixe (B2:C3 ici, à adapter).
    Peut-être faudrait-il la rendre dynamique selon la feuille mais je manque d'éléments.

    eric
    0
  4. lovamavi
     
    Bonjour Eric,

    Je viens de ré-adapter le code avec tes conseils et cela fonctionne à merveille.
    Je te remercie pour ton aide qui me permet de progresser un peu plus ... Toutefois je ne doute pas un instant avoir encore de tes compétences lors de mes futurs développement d'outil

    Merci

    Laurent
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. lovamavi
     
    Je viens de faire tourner la macro qui fonctionne parfaitement, je voudrais abuser encore un peu de tes conseils car compte tenu que ladite macro risque de durer tres longtemps (15 fichiers ayant 12 oglets !), je pense que je vais mettre un bouton sur chaque feuille du fichier synthèse =afin que la mise à jour soit faite uniquement mois par mois (ex : je clique sur le bouton janvier et la macro va chercher les données des feuilles "janvier" des différents fichiers.
    Peux-tu me dire ce que je dois changer dans ton code pour réussir cela ?

    NB : De plus peux-tu m'indiquer comment on met un fil en "RESOLU" sur ce forum ?

    Merci d'avance
    0
    1. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
       
      Bonjour,

      J'ai modifié le code. Un double-clic sur A1 lance la mise à jour de la feuille active.
      Il y a une procédure en plus dans ThisWorkbook.
      https://www.cjoint.com/c/CAnq2oOV4px

      Pour mettre en résolu c'est en haut vers ton titre.

      eric
      0
  7. lovamavi
     
    Je viens de lancer la macro et ca bloque sur SheetBeforeDoubleClick notamment sur Target. Le message me dit que" la fonction n'est pas définie".
    Avec un bouton cela fonctionne donc pas de problème :) mais au titre de ma montée en compétence, pourquoi cela bloque t-il ?
    0
    1. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
       
      Bizarre...
      J'ai fait sur excel 2003 et je viens de tester sur 2010, pas de pb.
      Peut-être as-tu une autre macro qui bloque les évènements et ne les restaure pas ?

      Sinon essaie avec :
      Then Call Synthese
      ou au pire avec :
      Then Call Module1.Synthese mais ça serait bien la 1ère fois que j'utiliserais cette syntaxe.

      eric

      PS: tu n'as pas renommé le Sub Synthese() autrement sur ton fichier ?
      0
  8. lovamavi
     
    Cela peut-il une nouvelle fois venir de la protection de la feuille ?
    0
    1. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
       
      normalement non, ça n'empêche pas l'appel.
      Mais tu n'as pas renommé le Sub Synthese() autrement sur ton fichier et il est bien dans un module standard ?
      0
  9. lovamavi
     
    Bien joué Eric,

    J'avais effectivement renommer Synthèse, tout fonctionne parfaitement ...
    Merci beaucoup pour le temps que tu m'as consacré

    Au plaisir de recroiser ta route
    0
    1. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
       
      Bonne continuation :-)
      eric
      0