Consolidation de classeur

Résolu
Lovamavi -  
eriiic Messages postés 24603 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

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
eriiic Messages postés 24603 Date d'inscription   Statut Contributeur Dernière intervention   7 276
 
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

 
Je ne vois vraiment pas l'utilité de passer par VBA pour un calcul aussi simple !
0
eriiic Messages postés 24603 Date d'inscription   Statut Contributeur Dernière intervention   7 276
 
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
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
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
eriiic Messages postés 24603 Date d'inscription   Statut Contributeur Dernière intervention   7 276
 
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
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
eriiic Messages postés 24603 Date d'inscription   Statut Contributeur Dernière intervention   7 276
 
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
lovamavi
 
Cela peut-il une nouvelle fois venir de la protection de la feuille ?
0
eriiic Messages postés 24603 Date d'inscription   Statut Contributeur Dernière intervention   7 276
 
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
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
eriiic Messages postés 24603 Date d'inscription   Statut Contributeur Dernière intervention   7 276
 
Bonne continuation :-)
eric
0