Nommer feuille suivant cellule et rassembler données
Bonsoir à tous,
J'ai trouvé un classeur qui permet de rassembler plusieurs fichiers excel sous plusieurs onglets. Jusque là tout va bien mais je souhaite que le 'nom" de ces feuilles soit nommés automatiquement suivant une cellule bien définie ce celles-ci
Je vous joint le fichier pour explication.
Les onglets pièce n°1, pièce n°2 et pièce n°3 doivent se nommer 60,61 et 62 suivant la cellule F8 de chaque onglet.
Par la suite, je souhaite qu'un dernier onglet soit nommé "bilan" et centralise les valeurs de la colonne B à partir de B14 et jusqu'a la derniere valeur trouvée car je peux avoir + ou - de valeurs dans ma colonne B.
Voici mon fichier tel que je voudrais qu'il soit en exécutant la macro.
Je vous remercie de m'aider
Bonjour,
Pour ta demande concernant les noms des feuilles, tu peux (par exemple) remplacer les deux lignes suivantes dans ton code:
classeurMaitre.Sheets(classeurMaitre.Sheets.Count).Name = "Piece n°" & compteur
compteur = compteur + 1Par celle-ci:
classeurMaitre.Sheets(classeurMaitre.Sheets.Count).Name = classeurMaitre.Sheets(classeurMaitre.Sheets.Count).[F8]Pour ta question relative à la "consolidation", il faudrait que tu précises si le contenu de la colonne A de chaque feuille reprend précisément les mêmes items et dans le même ordre?
Bonjour,
Je viens de remplacer les 2 lignes de la macro actuelle et tout fonctionne correctement.. Les feuilles sont bien nommées suivant la cellule F8 de chaque feuille.
Plus qu'une étape et ma macro sera fonctionnelle.
Alors, pour ce qui concerne la colonne A, j'ai actuellement sur cette pièce des noms dans la cellule A14 à A19 mais sur une autre référence pièce, je peux avoir de A14 à A30 par exemple et bien évidemment les cellules ne comportent pas le même nom. J'aurai autant de valeurs dans la colonne B que de désignation dans la colonne A, le but étant de pouvoir récupérer toutes les désignations de la colonne A uniquement sur la première Feuille puis toutes les données de la colonne B de mes X feuilles.
Par contre effectivement, pour la colonne A, toutes les feuilles sont identiques.
J'espère avoir était à peu près clair.
En tout cas merci beaucoup pour votre aide.
Cordialement
champi87 a écrit :J'espère avoir était à peu près clair
... On va dire "à peu près", oui
Ajoute, entre le Loop et le End Sub, ces quelques lignes:
Sheets("Bilan").[A2].CurrentRegion.ClearContents
For Each f In ThisWorkbook.Sheets
If LCase(f.Name) <> "accueil" And LCase(f.Name) <> "bilan" Then
derlig = f.Cells(Rows.Count, 1).End(xlUp).Row
pos = 0
col = Sheets("bilan").Cells(1, Columns.Count).End(xlToLeft).Column + 1
Sheets("bilan").Cells(1, col) = f.Name
For lig = 14 To derlig
pos = Application.Match(f.Cells(lig, 1), Sheets("bilan").[A:A], 0)
If Not IsNumeric(pos) Then
Sheets("bilan").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0) = f.Cells(lig, 1)
Sheets("bilan").Cells(Rows.Count, 1).End(xlUp).Offset(0, col - 1) = f.Cells(lig, 2)
Else
Sheets("bilan").Cells(pos, col) = f.Cells(lig, 2)
End If
Next lig
End If
Next f... il faudra, si elle n'existe pas, créer la feuille "Bilan".
Si, en fin de compte, je n'ai rien compris, redépose un classeur avec des exemples de ce que tu aurais en réalité dans tes feuilles à consolider: le premier fichier ne semble pas correspondre à ce que tu expliques.
re!
Je viens de rajouter les lignes entre le LOOP et le END SUB !
Par contre cela ne fonctionne pas en créant la feuille bilan
je me retrouve avec ce code maintenant
Sub consolide()
ChDir ActiveWorkbook.Path
Set classeurMaitre = ActiveWorkbook
sup
compteur = 1
nf = Dir("*.xls")
Do While nf <> ""
If nf <> classeurMaitre.Name Then
Workbooks.Open Filename:=nf
For k = 1 To Sheets.Count
Sheets(k).Copy After:=classeurMaitre.Sheets(classeurMaitre.Sheets.Count)
classeurMaitre.Sheets(classeurMaitre.Sheets.Count).Name = classeurMaitre.Sheets(classeurMaitre.Sheets.Count).[F8]
Next k
Workbooks(nf).Close False
End If
nf = Dir
Loop
Sheets("Bilan").[A2].CurrentRegion.ClearContents
For Each f In ThisWorkbook.Sheets
If LCase(f.Name) <> "accueil" And LCase(f.Name) <> "bilan" Then
derlig = f.Cells(Rows.Count, 1).End(xlUp).Row
pos = 0
col = Sheets("bilan").Cells(1, Columns.Count).End(xlToLeft).Column + 1
Sheets("bilan").Cells(1, col) = f.Name
For lig = 14 To derlig
pos = Application.Match(f.Cells(lig, 1), Sheets("bilan").[A:A], 0)
If Not IsNumeric(pos) Then
Sheets("bilan").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0) = f.Cells(lig, 1)
Sheets("bilan").Cells(Rows.Count, 1).End(xlUp).Offset(0, col - 1) = f.Cells(lig, 2)
Else
Sheets("bilan").Cells(pos, col) = f.Cells(lig, 2)
End If
Next lig
End If
Next f
End Sub
Sub sup()
Application.DisplayAlerts = False
If Sheets.Count > 1 Then
Sheets("Accueil").Move before:=Sheets(1)
Sheets(2).Select
For i = 2 To Sheets.Count
ActiveSheet.Delete
Next i
End If
End Subvoila la feuille bilan que je souhaite en fait
Attention au fait qu'il y a, au début du code, un appel à la procédure sup ... qui supprime toutes les feuilles sauf la feuille Accueil. Si tu avais créé la feuille Bilan, elle est supprimée au passage. Je te suggère de lancer la procédure sup seule (ou de supprimer à la main, les feuilles en dehors d'Accueil et Bilan).
Utilise ensuite ce code: (j'ai mis l'appel à sup en commentaire, ai précisé la référence au classeur ouvert et ajouté un petit ScreenUpdating=False pour le confort des yeux
Sub consolide()
ChDir ActiveWorkbook.Path
Set classeurMaitre = ActiveWorkbook
'sup
Application.ScreenUpdating = False
compteur = 1
nf = Dir("*.xls")
Do While nf <> ""
If nf <> classeurMaitre.Name Then
Set cl = Workbooks.Open(Filename:=nf)
For k = 1 To cl.Sheets.Count
cl.Sheets(k).Copy After:=classeurMaitre.Sheets(classeurMaitre.Sheets.Count)
classeurMaitre.Sheets(classeurMaitre.Sheets.Count).Name = classeurMaitre.Sheets(classeurMaitre.Sheets.Count).[F8]
Next k
Workbooks(nf).Close False
End If
nf = Dir
Loop
Sheets("Bilan").[A2].CurrentRegion.ClearContents
For Each f In ThisWorkbook.Sheets
If LCase(f.Name) <> "accueil" And LCase(f.Name) <> "bilan" Then
derlig = f.Cells(Rows.Count, 1).End(xlUp).Row
pos = 0
col = Sheets("bilan").Cells(1, Columns.Count).End(xlToLeft).Column + 1
Sheets("bilan").Cells(1, col) = f.Name
For lig = 14 To derlig
pos = Application.Match(f.Cells(lig, 1), Sheets("bilan").[A:A], 0)
If Not IsNumeric(pos) Then
Sheets("bilan").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0) = f.Cells(lig, 1)
Sheets("bilan").Cells(Rows.Count, 1).End(xlUp).Offset(0, col - 1) = f.Cells(lig, 2)
Else
Sheets("bilan").Cells(pos, col) = f.Cells(lig, 2)
End If
Next lig
End If
Next f
Application.ScreenUpdating = True
End SubBonjour et bonne année, j'ai eu l'occasion d'essayer tout ça.. C'est super j'arrive au résultat attendu !!
Juste pour l'optimisation si je clique sur la macro "SUP" celle-ci ne fonctionne plus, comment la réactiver pour que toutes les feuilles soient supprimées sauf "ACCUEIL" et "BILAN" du coup ?
Je n'ai pas bien saisi l'histoire du ScreenUpdating=False pour le confort des yeux
Encore une question, lorsque je clique sur la macro pour regrouper tous mes classeurs, j'ai un message d'erreur qui apparaît, je dois cliquer sur OK à chaque fois, que signifie ce message ?
Comment annuler ce message ?
On touche presque au but
Merci de m'aider en tout cas et bonne année.
Bonjour,
Pour la procédure sup, il me semble que ceci devrait fonctionner:
Sub sup()
Application.DisplayAlerts = False
If Sheets.Count > 1 Then
Sheets("Accueil").Move before:=Sheets(1)
For i = Sheets.Count To 2 Step -1
If Sheets(i).Name <> "Bilan" Then Sheets(i).Delete
Next i
End If
End SubLe Application.ScreenUpdating=False permet de suspendre momentanément le rafraîchissement de l'écran ... tu ne vois donc pas les fichiers s'ouvrir et se refermer (c'est pour ça que je parlais de "confort"). Cette même instruction fait également gagner un peu de temps à l'exécution.
Quant à ton message d'erreur, il ne semble pas être lié à la macro. Si tu le lis attentivement, tu constateras qu'Excel cherche (au démarrage) un fichier nommé ReportINI, qui figurerait dans le dossier XLSTART
Bonsoir,
SUPER tout fonctionne correctement !!!!
Meilleurs voeux !
A bientôt