Copier coller à partir de plusieurs fichier
Bonjour,
j'ai 180 fichier appelé "diagramme __ du collecteur.xlsx" (le "__" c'est le chiffre du fichier)
Dans chacun de ces fichier seul la la colonne I m'intéresse
Objectif: créer une macro
ce que je veux que la macro fasse:
dans un nouveau fichier Excel il faut que :
1) choisir où se trouve les 180 fichiers
2) le titre de la colonne A (du nouveau fichier) soit le nom du 1er fichier (le titre de la colonne B soit le nom du 2ème fichier, etc...)
3) copier la colonne I du 1er fichier dans la colonne A dans notre nouveau fichier (copier la colonne I du 2ème fichier dans la colonne B du nouveau fichier, etc...)
Merci d'avance pour votre aide
- Messages
- 1'794
- Excel
- 2010
- Inscrit
- 25/08/2014
- Emploi
- Consultant VB6 / SQL / VBA / Excel / Access
Bonsoir,
Ci-joint une proposition.
Après sélection du répertoire :
> ouverture de tous les fichiers avec un nom "diagramme __ du collecteur.xlsx"
> copie de la colonne I (toute la colonne de la 1ère ligne à la dernière ligne de la colonne)
(non précisé : onglet à prendre en compte => premier onglet du fichier)
(non précisé : première ligne à prendre en compte => première ligne de la colonne I)
> colle dans l'onglet résultat, dans une nouvelle colonne pour chaque fichier
> titre de la colonne (onglet résultat) : nom du fichier
A tester
Bouben
Bonjour Bouben
je te remercie pour ton code, j'essaie de le comprendre mais j'ai beaucoup de mal
peut tu m'expliquer d'avantage le code que tu as fait stp,
Option Explicit
Public Sub Importer()
Dim oFSO As FileSystemObject
Dim oShR As Worksheet
Dim sRep As String
Dim oRep As Folder
Dim oFic As File
Dim oWBx As Workbook
Dim oShx As Worksheet
Dim iDerLig As Long
Dim iColEcr As Integer 'colonne d'écriture
Dim iAvanc As Integer 'avancement
ici tu met les variable jusqu'ici ok
cette partie là je ne vois pas sa fonction, sRep signifie que tu fais appel a la fonction ChoixDossier mais après...
sRep = ChoixDossier()
If sRep = "" Then
Exit Sub
End If
Set oFSO = New FileSystemObject
Set oRep = oFSO.GetFolder(sRep)
Set oShR = Worksheets("Resultat")
'efface le résultat
oShR.Cells.ClearContents
'parcours des fichiers
iColEcr = 1
iAvanc = 1
Application.ScreenUpdating = Falseici tu nettoie le classeur avec clearcontents
dis moi si j'ai juste; "iColEcr' te permet de balayer l'ensemble des cellules de la colonne I
"IAvanc" te permet d'avancer dans le numéros de mon document
peut tu expliquer chaque terme de la boucle "For" stp
For Each oFic In oRep.Filesde même cette fonction je ne comprend pas
modProgress.ShowProgress iAvanc, oRep.Files.Countest-ce ici que tu fait invoquer la fenêtre ou tu cherche le dossier ou ya tous les document appelé diagramme __ du collecteur?
"*" représente le chiffre
If oFic.Name Like "diagramme * du collecteur.xlsx" Then
'ouverture du fichier
Set oWBx = Workbooks.Open(oFic.Path, , True)
Set oShx = oWBx.Worksheets(1) 'premier onglet du fichierla fonction iDerLig m'est aussi difficil, je connais la fonction range mais c'est la parite "End(xlUp).Row" que je ne comprend pas
iDerLig = oShx.Range("I" & Rows.Count).End(xlUp).Row
'nom du fichier
oShR.Cells(1, iColEcr).Value = oWBx.Name
'copie
oShx.Range("I1:I" & iDerLig).Copy
'colle
oShR.Cells(2, iColEcr).PasteSpecial xlPasteAll
'vide presse-papier
Application.CutCopyMode = False
Set oShx = Nothing
'fermeture du fichier
oWBx.Close
Set oWBx = Nothing
iColEcr = iColEcr + 1
End If
iAvanc = iAvanc + 1
Next oFicla fonction "Application.ScreeUpdating" signifie quoi?
Application.ScreenUpdating = True
Set oShR = Nothing
Set oRep = Nothing
Set oFSO = Nothing
End Subcette partie fait sortir le chemin du dossier, mais pourrais tu l'expliquer un stp
Private Function ChoixDossier() As String
With Application.FileDialog(msoFileDialogFolderPicker)
.InitialFileName = ActiveWorkbook.Path & "\"
.Show
If .SelectedItems.Count > 0 Then
ChoixDossier = .SelectedItems(1)
Else
ChoixDossier = ""
End If
End With
End Functionmerci encore pour toute ton aide
- Messages
- 1'794
- Excel
- 2010
- Inscrit
- 25/08/2014
- Emploi
- Consultant VB6 / SQL / VBA / Excel / Access
Bonjour,
Ci-joint le fichier avec toutes les lignes commentées (module "modMain"), ça devrait t'aider.
Le module "modProgress" et le Userform "ufProgress" servent uniquement pour la barre de progression, ne t'en préoccupe pas !
Utilisé par la ligne suivante :
modProgress.ShowProgress iAvanc, oRep.Files.CountBouben
merci bouben
malheureusement cela ne marche pas, il efface bien la feuille mais ne copie rien, la barre de progression s'arrète à 95% quand j'essaie avec 18 fichiers.
as tu une idée du blocage?
- Messages
- 1'794
- Excel
- 2010
- Inscrit
- 25/08/2014
- Emploi
- Consultant VB6 / SQL / VBA / Excel / Access
Bonsoir,
1 : vérifier le nom des fichiers :
nom attendu précisément : "diagramme xxx du collecteur.xlsx"
exemple : "diagramme 2 du collecteur.xlsx"
2 : pour chaque fichier, on copie les données du premier onglet
comme indiqué plus haut : préciser le nom de l'onglet à traiter
Et on copie la colonne I
En prenant en compte ces 2 points, cela doit fonctionner !
Bouben
j'ai trouvé le truc pour pouvoir rentrer dans la boucle if:
If Left(oFic.Name, 9) = "diagramme" And Right(oFic.Name, 18) = "du collecteur.xlsx" Thenceci est la solution pour rentrer dans la boucle
du coup le programme marche mais pas comme il faut
1) il ne colle pas dans l'ordre des fichiers, (j'ai un pas de 2°)
si je prend 30 fichiers voici ce que cela donne:
en colonne A il met "diagramme 02° du collecteur"
en colonne B il met "diagramme 04° du collecteur"
en colonne C il met "diagramme 06° du collecteur"
en colonne D il met "diagramme 08° du collecteur"
en colonne E il met "diagramme 0° du collecteur"
en colonne F il met "diagramme 10° du collecteur"
en colonne G il met "diagramme 12° du collecteur"
autrement dit il trie pas correctement, j'ai rajouter le "0" devant sinon il classait encore pire mes fichiers mais cela ne consernerait qu'un seul fichier si je m'arrêtait à 99 fichiers or ici je vais jusqu'à 180 donc il me les classes par de chiffre, il commence avec les fichiers avec un 0 puis avec les fichier avec des 1 (0,02,04,06,08,100,102,104,106,108,10,110,112,114,...1
2) quand je fais fonctionner la macro pour chaque fichier il me met 1 boite de dialogues:
voir l'image
alors que j'ai mis en plus cette ligne de code
Application.DisplayAlerts = Falsecomment supprimer cette boite de dialogue, cette fenêtre met juste à jour le graphique de chaque fichier
Pour le tri
en fait j'ai compris le pb mais j'ai pas trouvé la solution,
le pb vient du contenu chaque titre de cellule (normalement à trier) est sous format texte. en effet le titre des colonnes à trier est "diagramme 10° du collecteur" le chiffre qui normalement sert de référencement n'est pas compris comme un chiffre mais comme un caractère.
des idées?
le pb de la boite de dialogue persiste