Bonjour à tous,
Je sollicite votre aide.
J’ai un fichier contenant plusieurs onglets:
Synthèse; TPS; J.E.; M.S.; 12ème; CP1; CP2; CE; CM; 6ème; 5ème; 4ème; 3ème; 2ndeS; 1ère L, 1ère S, T.L. ,T.S.
Je voudrais avoir: dans l’onglet synthèse, on crée un bouton, et on lançant le bouton, toutes les données des autres onglets(T.P.S. à T.S) sont consolidées dans cette feuille synthèse.
A noter qu’il y a d’autres onglets à part ceux cités ci-dessus.
Vous trouvez ci-joint le fichier.
Vous remerciant par avance et espérant votre aide.
Cordialement! consolidé.xlsx (144,4 Ko)
Oui, il est possible de regrouper vos onglets.
Avant de vous donner la solution, je me permets quelques remarques:
pourquoi vous casser la tête avec autant d’onglets alors que vous indiquez déjà une colonne avec le nom de classe (qui est aussi celui de l’onglet) ? Un seul onglet suffirait, les filtres feront le reste, non ?
j’espère que ce ne sont pas des vraies données qu’il y a dans votre fichier
(sinon à l’avenir, changer par du fake, c’est plus sécure )
Enfin, voici le bout de code qui va fusionner vos onglets
Sub RestezGroupir() 'dans « Copie »
Dim Lg&, Sh As Worksheet, f As Worksheet
Set f = Sheets(« Copie »)
f.Range(« B2:AB » & f.[a65000].End(xlUp).Row).ClearContents 'efface Copie
For Each Sh In Worksheets
If Sh.Name <> f.Name And Sh.Name <> « Recettes » And Sh.Name <> « Dépenses » And Sh.Name <> « Base de données » And Sh.Name <> « Recherche » And Sh.Name <> « Param » Then 'Ici on exclut les onglets qu’on ne veut pas
Lg = Sh.Range(« a » & Rows.Count).End(xlUp).Row
Sh.Range(« C5:AB100 » & Lg).Copy Destination:= _
f.Range(« a » & Rows.Count).End(xlUp)(2)
End If
Next
End Sub
Pour ce faire:
Créez un onglet « Copie »
ALT+F11 dans votre fichier, puis Insertion → module
Copier/coller le code ci-dessus, puis F5
Il vous faudra rajouter vos intitulées de colonnes avec un bon vieux copier/coller la ligne (j’avais un peu la flemme de rajouter la ligne de code, dsl)
On pourrait créer un bouton pour le faire à volonté.
Bonjour Nono,
Merci beaucoup pour votre remarque. Merci aussi pour le temps que vous avez consacré pour moi.
Je vais essayer le code et je reviendrai vers vous!
Bien cordialement!
Bonjour Nono,
J’ai suivi votre instruction et en lançant le bouton, il y a une erreur.
Je vous envoie ci-joint le fichier avec le code.
Merci à vous
=>consolidé (2).xlsm (152,9 Ko)
L’erreur venait d’un mauvais formatage de copier-coller
Voici qui devrait aller mieux
EDIT (12h00): CODE PLUS SYMPA
Sub RestezGroupir() 'dans "Copie"
Dim Lg&, Sh As Worksheet, f As Worksheet
Application.ScreenUpdating = False
Set f = Sheets("Copie")
Cells.Clear 'efface Copie
For Each Sh In Worksheets
On Error Resume Next
If Sh.Name <> f.Name And Sh.Name <> "Recettes" And Sh.Name <> "Dépenses" And Sh.Name <> "Base de données" And Sh.Name <> "Recherche" And Sh.Name <> "Param" Then 'Ici on exclut les onglets qu’on ne veut pas
Lg = Sh.Range("a" & Rows.Count).End(xlUp).Row
Sh.Range("C5:AB100" & Lg).Copy Destination:= _
f.Range("a" & Rows.Count).End(xlUp)(2)
End If
Next
Sheets("TS").Select
Range("C4:AB4").Select
Selection.Copy
Sheets("Copie").Select
Range("A1").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
Range("A1").Select
Range(Selection, Selection.End(xlToRight)).Select
Range(Selection, Selection.End(xlDown)).Select
Application.CutCopyMode = False
Selection.AutoFilter
Range("A1").Select
Application.ScreenUpdating = True
MsgBox "Fait !", vbOKOnly + vbInformation, "Information"
End Sub
Re Nono,
Le code a marché mais une dernière demande, est-ce possible que dans l’onglet copie, les données sont collées à partir de la cellule C5?
Encore merci!
Une petite contraction de la macro
(les . select sont à éviter au max)
Sub RestezGroupir() 'dans "Copie"
Dim Lg&, Sh As Worksheet, f As Worksheet
Application.ScreenUpdating = False
Set f = Sheets("Copie")
Cells.Clear 'efface Copie
For Each Sh In Worksheets
On Error Resume Next
If Sh.Name <> f.Name And Sh.Name <> "Recettes" And Sh.Name <> "Dépenses" And Sh.Name <> "Base de données" _
And Sh.Name <> "Recherche" And Sh.Name <> "Param" Then 'Ici on exclut les onglets qu’on ne veut pas
Lg = Sh.Range("a" & Rows.Count).End(xlUp).Row
Sh.Range("C5:AB100" & Lg).Copy Destination:=f.Range("a" & Rows.Count).End(xlUp)(2)
End If
Next
Sheets("TS").Activate
Sheets("TS").Range("C4:AB4").Copy Sheets("Copie").Range("A1").Paste
Range("C4").CurrentRegion.AutoFilter
MsgBox "Fait !", vbOKOnly + vbInformation, "Information"
Set f = Nothing
End Sub
Et cela pourrait être encore plus condensé avec un WITH et END WITH pour la feuille TS
De plus, prend le principe d’indenter la/les macro(s) quand il y a boucle ou autre correspondant à un END …
cela rend le code facile à lire et corriger
et pour éviter les variables non déclarées, depuis VBA - menu / outils / options / éditeur
cocher --> déclaration des variables obligatoire
ainsi tu auras toujours OPTION EXPLICIT sur les feuilles ou Modules
Encore une fois merci pour tes conseils! Bien que calé sur les formules, le vba est encore un grand champs à explorer pour moi
Tu viens de m’apprendre un super truc avec OPTION EXPLICIT!! Merci beaucoup!
Je pense que je vais souvent venir vers toi avec moult questions
Bonjour Nono, Bonjour Mimimathy,
Le code a marché mais seul les données de l’onglet TS sont rapportées dans l’onglet copie. Le but c’est que toutes les données de J.E. à TS sont à consolider dans l’onglet copie.
Merci à vous
Re,
Ta formule marche mais les données sont collées dans A1 mais il vaut mieux dans C4.
La formule de Mimimathy marche et collées dans C4mais seul les données du TS sont prises en compte.
Merci à vous
Sub RestezGroupir() 'dans "Copie"
Dim Lg&, Dl&, Sh As Worksheet, f As Worksheet
Application.ScreenUpdating = False
Sheets("Copie").Activate
Set f = Sheets("Copie")
Cells.Clear 'efface Copie
Sheets("TS").Range("C4:AB4").Copy Sheets("Copie").Range("C4") 'Copie de l'entête
For Each Sh In Worksheets 'Boucle sur les onglets sauf certaines
On Error Resume Next
If Sh.Name <> f.Name And Sh.Name <> "Recettes" And Sh.Name <> "Dépenses" And Sh.Name <> "Bases de données" _
And Sh.Name <> "Recherche" And Sh.Name <> "param" Then 'Ici on exclut les onglets qu’on ne veut pas
Lg = Sh.Range("c" & Rows.Count).End(xlUp).Row ''Dernière ligne de feuille à copier
Dl = f.Range("C" & Rows.Count).End(xlUp).Row + 1 'Première ligne vide de feuille COPIE
Sh.Range("C5:AB" & Lg).Copy f.Range("C" & Dl)
End If
Next
Range("F5").Select
ActiveWindow.FreezePanes = True
Range("C4").CurrentRegion.AutoFilter
Application.ScreenUpdating = True 'réactive le rafraichissement d'écran
MsgBox "Fait !", vbOKOnly + vbInformation, "Information"
Set f = Nothing
End Sub
Re,
Je viens pour vous demander un truc. Dans l’onglet copie, les données des différents onglets sont copié mais il vaut mieux si elles sont copié avec valeur donc pas de formule.
S’il vous plaît.
Encore merci !
Re,
Plus précisément, c’est depuis le fichier de Nono que j’ai du faire la remarque, les fichiers sources ont des formules et lors du regroupement dans Copie, on utilise collage valeur au lieu de collage simple.
Cordialement,
Bonjour,
Oui, les fichiers sources contiennent des formules mais si possible lorsqu’elles sont regroupées dans l’onglet Copie, on a des valeurs au lieu de formules.
Merci