Regroupement de fichiers Excel
Crysta17
Messages postés
19
Statut
Membre
-
Crysta17 Messages postés 19 Statut Membre -
Crysta17 Messages postés 19 Statut Membre -
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 ? :)
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 ? :)
7 réponses
-
Bonjour,
LeNext Ws
est mal placé...
Il faut le mettre juste avantWorkbooks(LesFichiers).Close
-
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 ! -
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 -
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 ! -
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question -
Remplace
AvantDerniereLigne = ActiveSheet.UsedRange.Rows.Count
parAvantDerniereLigne = ws.UsedRange.Rows.Count
Au début de ta Sub, ajouteDim 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
ParDerLigRecap = 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 -
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-
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.
-
-
Je vais tenter cette solution.
Que signifient LBound et Ubound ?