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
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
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
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 !