Votre question
Résolu

Fusionner plusieurs classeurs en une seule feuille

Tags :
  • Programmation
Dernière réponse : dans Programmation
25 Octobre 2016 17:47:52

bonjour,
J'ai un dossier appelé "Total" qui comporte plusieurs autres dossiers, chacun comprte des classeurs excel.
y a t-il une macro VBA qui me permet de regrouper toutes les feuilles de tout ces classeurs en une seule feuille, en gardant leurs noms et en supprimant celles qui sont vides.
Sachant que les feuilles ont la même entête, comment peut-on les fusionner en les séparant par une ligne vide et en gardant qu'une seule entête à la première ligne?

Autres pages sur : fusionner plusieurs classeurs seule feuille

a b L Programmation
25 Octobre 2016 20:13:36

Salut, il n'y a pas "une" macro qui permette de faire ça, mais si tu le désires, on va la créer ensemble ;) 
Quelle version de excel ?
m
0
l
26 Octobre 2016 09:29:37

Bonjour Drul,
avant tout merci pour ta réponse.
Je travaille avec excel 2010.
Comme étant novice en VBA, j'ai essayé 2 macros: l'une pour consolider les classeurs en un seul, l'autre pour réunir les feuilles de ce dernier en une seule.
mais elles me donnent pas les résultats désirées.
m
0
l
Contenus similaires
a b L Programmation
26 Octobre 2016 09:38:26

Publie le code ici, et on verra ce qu'on peut en tirer ;) 
m
0
l
26 Octobre 2016 10:14:25

La première:
Sub consolide()
ChDir ActiveWorkbook.Path
Set MonClasseur = ActiveWorkbook
compteur = 1
nf = Dir("*.xls")
Do While nf <> ""
If nf <> MonClasseur.Name Then
Workbooks.Open Filename:=nf
For k = 1 To Sheets.Count
Sheets(k).Copy After:=MonClasseur.Sheets(MonClasseur.Sheets.Count)
compteur = compteur + 1
Next k
Workbooks(nf).Close False
End If
nf = Dir
Loop
End Sub

La deuxième:

Sub FusionFeuille()

Dim ws As Worksheet

For Each ws In Worksheets

If ws.Name <> "Fusion" Then

ws.Activate

Range("A1:" & [a1].SpecialCells(xlCellTypeLastCell).Address).Copy

Sheets("Fusion").Activate

Range("A65536").End(xlUp).Offset(1, 0).Select

ActiveSheet.Paste

Application.CutCopyMode = False

End If

Next ws

End Sub
m
0
l
26 Octobre 2016 10:46:10

J'ai pas pu joindre des fichiers, alors je dois m'exprimer autrement:
Dossier TOTAL:=>[sous-dossiers(ADM, DEM, ENT,FMT, CDVU)]
Chaque sous dossier contient les classeurs concernés avec d'autres fichiers de differents types.
Le dernier dossier (CDVU) contient un seul fichier excel dont la première page est "CDVU". Je veux rassembler (dans la deuxième feuille de ce classeur) les feuilles non vides de tout les classeurs en ajoutant une ligne ou colonne qui m'indique le nom de la feuille original.
j'espère que c'est assez clair
m
0
l
a b L Programmation
26 Octobre 2016 12:11:34

Je regarde tout à l'heure.
m
0
l
a b L Programmation
26 Octobre 2016 13:36:37

ça me semble pas trop mal ce que tu as fais, c'est quoi qui joue pas ? (à part le fait que ça ne va pas lire dans les sous dossier)
m
0
l
26 Octobre 2016 14:27:28

Ce code a bien marché avec ma base initiale mais dés les changement saisonnier des données, il vient de me montrer des erreurs. Donc je dois, à chaque mis à jour, l'adopter.
Ainsi, lors du rassemblement, je veux ajouter une colonne qui prend le nom de chaque feuille comme identificateur. Et ce, pour arriver finalement (çàd après la phase du traitement) à arrêter les résultats de chaque de chaque département (ADM, DEM, ENT,FMT....) distinguables dans la même feuille "TOTAL".
Outre, il tient compte des feuilles vides à supprimer manuellement et ça ce que me gène le plus.
m
0
l
a b L Programmation
26 Octobre 2016 14:44:35

Pour tester si une feuille est vide, tu utiliser ça:
  1. WorksheetFunction.CountA(Cells) = 0

Et tu ne copies que si cette condition est false ...

Pour la colonne supplémentaire c'est pas trop compliqué,
Le plus pénible reste d'aller chercher tous les fichiers dans tes différents sous répertoire ...
Le nombre de répertoire est fixe et connu ?
m
0
l
26 Octobre 2016 15:06:48

Oui le nombre de répertoire est fixe. Exactement comme c'est prédéfini.
m
0
l
a b L Programmation
26 Octobre 2016 16:24:07

Un peu à la bourre là, essaie déjà d'implémenter le control de feuille vide ...
m
0
l
27 Octobre 2016 10:29:23

Voilà ce j'ai modifié:
  1. Sub consolide()
  2. ChDir ActiveWorkbook.Path
  3. Set classeurMaitre = ActiveWorkbook
  4.  
  5. nf = Dir("*.xls")
  6. Do While nf <> ""
  7. If nf <> classeurMaitre.Name Then
  8. If WorksheetFunction.CountA(Cells) <> 0 Then
  9. Workbooks.Open Filename:=nf
  10. For k = 1 To Sheets.Count
  11. Sheets(k).Copy After:=classeurMaitre.Sheets(classeurMaitre.Sheets.Count)
  12. Next k
  13. Workbooks(nf).Close False
  14. End If
  15. End If
  16. nf = Dir
  17. Loop
  18. End Sub


Erreur à la ligne: [Sheets(k).Copy After:=classeurMaitre.Sheets(classeurMaitre.Sheets.Count)] àdéboguer
m
0
l

Meilleure solution

a b L Programmation
27 Octobre 2016 10:43:25

Ok, bon je ne sais pas pourquoi ça plante, mais en tous les cas tu as mal placé ton IF et trop de chose son faite sans spéciéfié le classeur, d'ou gros risque de mélange ...
Essaie ça:
  1. Sub consolide()
  2. Dim classeurMaitre As Workbook
  3. Dim classeurSrc As Workbook
  4.  
  5. ChDir ActiveWorkbook.Path
  6. Set classeurMaitre = ActiveWorkbook
  7.  
  8. nf = Dir("*.xlsx")
  9. Do While nf <> ""
  10. If nf <> classeurMaitre.Name Then
  11.  
  12. Set classeurSrc = Workbooks.Open(nf)
  13. For k = 1 To Sheets.Count
  14. If WorksheetFunction.CountA(classeurSrc.Sheets(k).Cells) <> 0 Then
  15. classeurSrc.Sheets(k).Copy After:=classeurMaitre.Sheets(classeurMaitre.Sheets.Count)
  16. End If
  17. Next k
  18. classeurSrc.Close False
  19. End If
  20. nf = Dir
  21. Loop
  22. End Sub
partage
27 Octobre 2016 11:05:02

L’exécution n'a même pas démarrée.
Alors que, quand j'ai réessayé mon code initial il s’exécute et encore une fois les feuilles vides.
m
0
l
a b L Programmation
27 Octobre 2016 11:10:50

C'est à dire n'a pas démarré ?
Tu as une erreur ? si oui laquelle ?
m
0
l
27 Octobre 2016 11:13:25

Quand j'ai légerement modifié ton code ( .xlsx --> .xls), il a démarré puis affiché :

(Erreur d’exécution
Erreur définie par l'application ou par l'objet)
et n'a copié que deux classeurs avec leurs feuilles vides
m
0
l
a b L Programmation
27 Octobre 2016 11:15:58

Il a copié les feuilles vide aussi ???

Damn pourtant ça marche chez moi ....
Elles sont vraiment vide ? (pas de mise en forme ou titre ou formule ?
m
0
l
27 Octobre 2016 12:30:29

Imagine!!
J'ai tout initialisé.
Je garde toujours à coté une copie des données originales (sans traitement), sur lesquelles ton code a fait un bon boulot.
il ne me reste alors qu'appeler les autres classeurs.
m
0
l
a b L Programmation
27 Octobre 2016 12:33:39

Si tu as besoin d'un coup de main pour ça aussi, dis le moi ;) 
m
0
l
27 Octobre 2016 12:39:27

Alors je le dis. :( 
Help!!!
Comment accéder aux autres dossiers? Et enfin, comment les fusionner en une seule feuille en ajoutant une colonne identifiante!!
m
0
l
a b L Programmation
27 Octobre 2016 13:07:06

Une chose à la fois ;) 

Pour les appelles dans les sous-dossiers, la première chose à faire est de trouver le nom du dossier parent
un truc du genre devrait le faire:
  1. dossierparent = Left(ThisWorkbook.Path, InStrRev(ThisWorkbook.Path, "\") - 1)


Ensuite construit un tableau contenant le nom des divers sous dossier à explorer, et finalement tu boucle autour de ta macro actuelle pour chaque dossier.

Essaie et si tu coinces reviens ;) 
m
0
l