Compiler plusieurs onglets dans un seul

Bonjour à tous,

J'ai regardé en long, en large et en travers dans le forum (ici et ailleurs) pour trouver une solution à mon problème... mais rien d'exploitable à mon niveau en VBA !

Je vous sollicite donc...

J'ai besoin de compiler dans un seul onglet excel (pour pouvoir faire des TCD ensuite) plusieurs bases de données (identiques en colonnes mais variables en nb de lignes)

A l'aide d'une macro, j'ai déjà réussi à copier la base de données contenues dans 22 fichiers différents sur 1 onglet différent de mon fichier de consolidation.

Je me retrouve donc avec un fichier excel qui contient 22 onglets et je souhaiterais compiler les données de ces 22 onglets sur un seul.

La difficulté (pour moi en tout cas) réside dans le fait que chaque onglet ne contient pas le même nombre de lignes et que forcément, j'ai besoin, dans mon onglet de consolidation, de copier toutes les données les unes après les autres.

Je vous joins un exemple que je viens de construire pour que cela soit plus clair (les données de 3 filiales dans 3 onglets différents et un onglet conso qui compile le tout)

Que dire de plus ? un grand merci d'avance à tous ceux qui voudront bien prendre un peu de leur temps pour m'aider à finir ce travail !

Carole

2'248exemple-excel.xls (14.50 Ko)

Bonsoir Carole,

A mettre dans un module standard du VBE et exécuter, les commentaires sont dans le code :

Sub Recup()

    Dim Fe As Worksheet
    Dim Plage As Range

    'parcour la collection en évitant kla feuille
    'de consolidation
    For Each Fe In ThisWorkbook.Worksheets

        If Fe.Name <> "CONSO" Then

            With Fe
    'définie la plage sans la ligne de titres
                Set Plage = .Range(.Cells(2, 1), _
                            .Cells( _
                            .Cells.Find("*", .[A1], -4123, , _
                            1, 2).Row, _
                            .Cells.Find("*", .[A1], -4123, , _
                            2, 2).Column))

            End With
    'colle les valeurs dans la feuille de consolidation
    'après la dernière ligne non vide
            Plage.Copy _
            Worksheets("CONSO").Range("A65536").End(xlUp).Offset(1, 0)

        End If

    Next Fe

End Sub

Il est préférable d'effectuer un test sur une copie du classeur pour voir si cela convient.

Hervé.

Merci Hervé,

Je teste demain et te fais un retour.

Bonne soirée

-- 27 Jan 2011, 09:29 --

Bonjour Hervé

La macro fonctionne bien, merci beaucoup !

J'aimerais y apporter 2 petites modifications :

  • j'ai 2 onglets à éviter "CONSO" et "INSTRUCTIONS".... j'ai cherché mais je ne trouve pas le code pour éviter 2 onglets dans la boucle
  • la 2nde est un peu moins simple : comment faire pour éviter que la macro recopie la ligne de titre de chaque onglet ? Je peux peut-être avoir en dur cette ligne de titre dans mon onglet "CONSO" et ensuite ne recopier les données de chaque onglet qu'à partir de la 2nde ligne ? Bon OK c'est facile à dire surtout quand on se sait pas faire

Bonne journée

Carole

-- 27 Jan 2011, 11:49 --

Up !

-- 27 Jan 2011, 11:52 --

Marche pas le up.... dommage que le sujet reste dans le bas lorsqu'on répond à son propre message.

Si qqn pouvait écrire un petit mot pour faire remonter le sujet dans la liste...

-- 27 Jan 2011, 13:19 --

-- 27 Jan 2011, 13:22 --

Bonsoir Carole,

Pour la question n° 1, j'ai modifié le code afin d'éviter la feuille "INSTRUCTIONS" de la façon suivante :

If Fe.Name <> "CONSO" And Fe.Name <> "INSTRUCTIONS" Then

Par contre, pour la question n° 2 je suis surpris que la ligne de titre soit copié car la plage est définie à partir de A2 jusqu'à la dernière cellule de la dernière colonne par ".Cells(2, 1)" ou le 2 indique bien que c'est à partir de la deuxième ligne (le 1 indiquant la première colonne) ? A moins que tu es deux lignes d'entêtes ? Dans ce cas, change 2 par 3 dans ".Cells(2, 1)".

Je te joins le code modifié avec une ligne qui sera à supprimée (indiquée dans la code) une fois le test réalisé. Pour chaque page, l'adresse de la plage te sera indiquée dans un MsgBox, reviens pour me dire si ça commence bien à A2 ou non et je chercherai l'erreur.

Sub Recup()

    Dim Fe As Worksheet
    Dim Plage As Range

    'parcour la collection en évitant kla feuille
   'de consolidation
   For Each Fe In ThisWorkbook.Worksheets

        If Fe.Name <> "CONSO" And Fe.Name <> "INSTRUCTIONS" Then

            With Fe
    'définie la plage sans la ligne de titres
               Set Plage = .Range(.Cells(2, 1), _
                            .Cells( _
                            .Cells.Find("*", .[A1], -4123, , _
                            1, 2).Row, _
                            .Cells.Find("*", .[A1], -4123, , _
                            2, 2).Column))

            End With

    MsgBox Plage.Address '<-ligne à supprimer après le test

    'colle les valeurs dans la feuille de consolidation
   'après la dernière ligne non vide
           Plage.Copy _
            Worksheets("CONSO").Range("A65536").End(xlUp).Offset(1, 0)

        End If

    Next Fe

End Sub

Hervé.

Bonjour Hervé,

J'ai testé rapidement, peu de temps aujourd'hui...

Bizarrement, la macro ne donne pas la même chose sur le fichier exemple que j'ai mis en pj que sur mon fichier réel.

Effectivement, sur le fichier exemple, la macro ne recopie pas la ligne de titre.

Je n'ai pas 2 lignes d'entête dans mon fichier (d'ailleurs, lorsque je change le 2 par 3, la macro "oublie" bien de copier la 1ere ligne de la base de données)

J'avoue que j'y perds un peu mon latin !

Je regarde plus précisément lundi, j'aurais plus de temps.

J'essaierai d'anonymiser mon fichier pour l'envoyer

Bon week-end !

Rechercher des sujets similaires à "compiler onglets seul"