Regroupement de fichiers Excel

Crysta17 Messages postés 19 Date d'inscription   Statut Membre Dernière intervention   -  
Crysta17 Messages postés 19 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour à tous,

Je suis actuellement en stage et ma mission est de regrouper plusieurs fichiers Excel dans un seul. Je m'explique. J'ai une vingtaine de fichiers Excel contenant chacun plusieurs onglets. Chaque onglet possède un tableau de la même structure. Je dois regrouper dans un fichier récapitulatif tous les tableaux de tous les fichiers dans un seul grand tableau commun.
Après de nombreuses recherches et à force de persévérance je suis arrivée au code suivant :
Sub CreationSynthese()
Dim Ws As Worksheet
Dim collectivite As Range

' Parcours de tous les fichiers
' -----------------------------
ChDir "I:\Volumes de données" 'Chemin d'accès au répértoire
LesFichiers = Dir("I:\Volumes de données\*.xlsx") 'Récupère le premier fichier
While Len(LesFichiers) > 0 'Tant que le nom du ficher a plus de 0 caractères
Workbooks.Open LesFichiers
For Each Ws In ActiveWorkbook
collectivite = Range("A1").Value
AvantDerniereLigne = ActiveSheet.UsedRange.Rows.Count
Range("A15:W" & AvantDerniereLigne).Copy
Workbooks("Récapitulatif.xlsm").Activate 'Activation du fichier récap
DebutNomFichier = ActiveSheet.UsedRange.Rows.Count + 1
Range("A" & DebutNomFichier).Select
ActiveSheet.Paste
Range("A2:A" & ActiveSheet.UsedRange.Rows.Count) = collectivite
Workbooks(LesFichiers).Close
LesFichiers = Dir 'Passage au fichier suivant
Next Ws
Wend

End Sub

Néanmoins ce programme ne marche pas, et je suis totalement à cours d'idée ! Quelqu'un aurait-il la gentillesse de bien vouloir essayer de m'aider ? :)
A voir également:

7 réponses

Polux31 Messages postés 6917 Date d'inscription   Statut Membre Dernière intervention   1 204
 
Bonjour,

Le
Next Ws
est mal placé...

Il faut le mettre juste avant
Workbooks(LesFichiers).Close

0
Crysta17 Messages postés 19 Date d'inscription   Statut Membre Dernière intervention  
 
Je te remercie de ta réponse si rapide.
Après application de ta solution le débogueur m'indique :

For Each Ws In ActiveWorkbook -> Propriété ou méthode non gérée par cet objet

Aurais-tu une idée ?

Encore merci !
0
Polux31 Messages postés 6917 Date d'inscription   Statut Membre Dernière intervention   1 204
 
Essaie en ajoutant

Dim Wk as Workbook
Dim Ws

'...

Set WK = Workbooks.Open(LesFichiers)
For Each Ws In Wk.Worksheets
'.....


«Ce que l'on conçoit bien s'énonce clairement, Et les mots pour le dire arrivent aisément.»
Nicolas Boileau
0
Crysta17 Messages postés 19 Date d'inscription   Statut Membre Dernière intervention  
 
C'est mieux ! Mon programme accepte ma boucle For Each avec ta solution.

Néanmoins lors de l'exécution, ma macro me copie en boucle infinie les entêtes de mes tableaux (qui sont tous les mêmes), et non leurs contenus...

Au moins quelque chose s'exécute, j'ai bon espoir ! ;)
Merci à toi !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Polux31 Messages postés 6917 Date d'inscription   Statut Membre Dernière intervention   1 204
 
Remplace
AvantDerniereLigne = ActiveSheet.UsedRange.Rows.Count
par
AvantDerniereLigne = ws.UsedRange.Rows.Count


Au début de ta Sub, ajoute
Dim WkRecap As Workbook
Dim WsRecap As Worksheet
Dim DerLigRecap as long

Set WkRecap = ThisWorkbook
Set WsRecap = WkRecap.Worksheets(1)


et modifie le code suivant dans ta boucle:
AvantDerniereLigne = ActiveSheet.UsedRange.Rows.Count 
 Range("A15:W" & AvantDerniereLigne).Copy 
 Workbooks("Récapitulatif.xlsm").Activate 'Activation du fichier récap 
 DebutNomFichier = ActiveSheet.UsedRange.Rows.Count + 1 
 Range("A" & DebutNomFichier).Select 
 ActiveSheet.Paste 
 Range("A2:A" & ActiveSheet.UsedRange.Rows.Count) = collectivite 
 Workbooks(LesFichiers).Close


Par
DerLigRecap = WsRecap.UsedRange.Rows.Count + 1
Ws.Range("A15:W" & AvantDerniereLigne).Copy WsRecap.Range("A" & DerLigRecap)
WsRecap.Range("A2:A" & WsRecap.UsedRange.Rows.Count) = collectivite
Wk.Close
Set Wk = Nothing



«Ce que l'on conçoit bien s'énonce clairement, Et les mots pour le dire arrivent aisément.»
Nicolas Boileau
0
Crysta17 Messages postés 19 Date d'inscription   Statut Membre Dernière intervention  
 
J'ai remplacé mon code par les éléments que tu m'as donné. Et nouvelle erreur, qui à mon avis n'a absolument rien à voir avec ta solution.

Erreur D'exécution 1004, fichier untel.xls introuvable.

Pourtant ce fichier est bien présent dans mon dossier. J'ai tenté de le supprimer pour essayer ta solution sur les autres, mais toujours la même erreur, avec un autre fichier...

C'est vraiment à y perdre la tête !...

Merci de prendre sur ton temps pour me répondre, c'est vraiment gentil de ta part.

Crysta
0
Polux31 Messages postés 6917 Date d'inscription   Statut Membre Dernière intervention   1 204
 
Voilà la fonction que j'utilise pour récupérer tous les fichiers d'un répertoire connu:

Public Sub RecupFichiers(Byval Chemin As String, Byref mTab())
Dim Fichier As String
Dim i as long
 
    Fichier = Dir(Chemin & "*.xls*")
 
    Do While Len(Fichier) > 0
        Redim Preserve mTab(i)
        mTab(i) = Chemin & Fichier
        i = i + 1
        Fichier = Dir()
    Loop

End Sub


Je passe le chemin du dossier et un tableau par référence que je vais utiliser pour boucler sur mes fichiers.

Ce qui donne pour ton cas

Sub CreationSynthese()
Dim mTab()
Dim i As Long
Dim Wk as Workbook
Dim Ws

'.....

     Call RecupFichiers("I:\Volumes de données\", mTab)

     For i = LBound(mTab()) to UBound(mTab())
          Set Wk = Workbooks.Open(mTab(i)
'.......
    Next i

End Sub


PS: J'ai fait ça de mémoire, il y a peut être des erreurs de syntaxe, mais c'est le principe que j'utilise.
0
Crysta17 Messages postés 19 Date d'inscription   Statut Membre Dernière intervention  
 
Je vais tenter cette solution.

Que signifient LBound et Ubound ?
0
Polux31 Messages postés 6917 Date d'inscription   Statut Membre Dernière intervention   1 204
 
LBound() est l'indice le plus bas du tableau et UBound() est l'indice le plus haut.
0
Crysta17 Messages postés 19 Date d'inscription   Statut Membre Dernière intervention  
 
J'ai pu tester ta solution. Malheureusement, toujours la même erreur qui persiste...
0