Résolu Fusionner plusieurs classeurs en une seule feuille

Japprends

Nouveau membre
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?
 

drul

Obscur pro du hardware
Staff
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 ?
 

Japprends

Nouveau membre
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.
 

Japprends

Nouveau membre
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
 

Japprends

Nouveau membre
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
 

drul

Obscur pro du hardware
Staff
ç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)
 

Japprends

Nouveau membre
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.
 

drul

Obscur pro du hardware
Staff
Pour tester si une feuille est vide, tu utiliser ça:
Code:
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 ?
 

drul

Obscur pro du hardware
Staff
Un peu à la bourre là, essaie déjà d'implémenter le control de feuille vide ...
 

Japprends

Nouveau membre
Voilà ce j'ai modifié:
Code:
Sub consolide()
  ChDir ActiveWorkbook.Path
  Set classeurMaitre = ActiveWorkbook

  nf = Dir("*.xls")
  Do While nf <> ""
    If nf <> classeurMaitre.Name Then
      If WorksheetFunction.CountA(Cells) <> 0 Then
        Workbooks.Open Filename:=nf
        For k = 1 To Sheets.Count
          Sheets(k).Copy After:=classeurMaitre.Sheets(classeurMaitre.Sheets.Count)
        Next k
        Workbooks(nf).Close False
      End If
    End If
    nf = Dir
  Loop
End Sub

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

drul

Obscur pro du hardware
Staff
Meilleure réponse
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:
Code:
Sub consolide()
  Dim classeurMaitre As Workbook
  Dim classeurSrc As Workbook
  
  ChDir ActiveWorkbook.Path
  Set classeurMaitre = ActiveWorkbook
 
  nf = Dir("*.xlsx")
  Do While nf <> ""
    If nf <> classeurMaitre.Name Then
      
        Set classeurSrc = Workbooks.Open(nf)
        For k = 1 To Sheets.Count
          If WorksheetFunction.CountA(classeurSrc.Sheets(k).Cells) <> 0 Then
             classeurSrc.Sheets(k).Copy After:=classeurMaitre.Sheets(classeurMaitre.Sheets.Count)
          End If
        Next k
        classeurSrc.Close False
      End If
    nf = Dir
  Loop
End Sub
 

Japprends

Nouveau membre
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.
 

drul

Obscur pro du hardware
Staff
C'est à dire n'a pas démarré ?
Tu as une erreur ? si oui laquelle ?
 

Japprends

Nouveau membre
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
 

drul

Obscur pro du hardware
Staff
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 ?
 

Japprends

Nouveau membre
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.
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 125
Messages
6 717 739
Membres
1 586 357
Dernier membre
Peg7
Partager cette page
Haut