Recuperer des donnees de plusieurs classeurs vers un fichier synthese
Bonjour à toutes et tous,
Nouveau sur ce forum, je viens vous exposer mon problème.
Pour comprendre, le travail que je cherche à faire consiste à travailler avec plusieurs fichiers excel ouverts:
- Un fichier xlsm qui contient déjà quelques macros, et dans lequel je veux ajouter cette macro VBA dans un nouveau module que je cherche à créer. (fichier à exclure de la boucle)
- Un fichier excel xls que je nommerais SSE (synthese), qui est le fichier de récupération de données issues des autres classeurs, au format xls également.
- Et enfin des fichiers sources, aussi au format xls, qui sont téléchargés et ouverts avant d'exécuter la macro. Ces dernier sont au nombre de 8 à 12 selon les périodes.
J'ai constitué un code que l'on peut qualifier de très basique, répétitif. Il a le mérite de fonctionner, (environ 15 secondes d'excecution) mais il prends en compte le nom de chaque classeur, ce qui peut poser problème si un classeur dans la liste du code n'est pas ouvert (comprendre par là, pas de données pour cette reference de classeur pour la période en cours) par exemple.
Chaque classeur source contient une seule feuille ("Feuil1"). Tous ces classeurs ont la même structure. Les données à copier vont de la cellule A10 jusqu'à la la cellule T xx, je dis xx car cela peut être T21, comme T37.... à savoir la dernière valeur existante en colonne T.
* Pour infos, il n'y a pas de ligne ou de cellule vide dans la plage à copier . Et concernant la plage à copier, elle varie aussi (en terme de nombre de ligne), d'un classeur source à l'autre...., et d'une période T à T+1) .
C'est déjà là le premier problème à résoudre afin de pouvoir incorporer cette plage variable de données et être certain de copier toutes les cellules remplies de la plage "variable" , ceci pour tous les classeurs sources ouverts, et pour aller coller chaque plage les unes à la suite des autres dans le classeur SSE "synthese" comprenant lui aussi qu'une seule feuille "Total"
Dans le code que j'utilise actuellement, cela donne cà:
Windows("100104.xls").Activate '1er fichier source d'une liste pouvant aller de 8 à 10 ou plusDim Alban As Integer Alban = Range("T9").End(xlDown).Row Range("A10:T" & Alban & "").Select Selection.Copy Windows("SSE.xls").Activate Range("A" & Range("A16000").End(xlUp).Row + 1).Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Application.CutCopyMode = False '------------------------------- Windows("100467.xls").ActivateDim Bene As Integer Bene = Range("T9").End(xlDown).Row Range("A10:T" & Bene & "").Select Selection.Copy Windows("SSE.xls").Activate Range("A" & Range("A16000").End(xlUp).Row + 1).Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Application.CutCopyMode = False '------------------------------------------- et cela répété pour 8 classeurs
Il est de ce fait normal que le code soit long, répétitif et disgracieux aux yeux de certains d'entre vous....
Je cherche à faire quelque chose de plus court, avec une boucle et qui ne prendrais en compte que les Worbooks ouvert(i).Count
excluant le fichier xlsm.
Donc pour résumer, récuperer une plage variable sur tous les fichier sources ouverts, et coller ces plages copiées les unes à la suite des autres....
Je ne vous cache pas que je patauge dans la réalisation de ce code.
Comment déclarer les plages variables "source" et "récup" et les classeur "sources" et "récup..." comme variable...
Je rajoute ce bout de code qui correspond à la déclaration des 2 plages que je pensais utiliser en les déclarant comme variable...
Et ensuite, je ne sais pas si on doit déclarer le fichier SSR.xls (fichier qui doit récuperer les donnees) d'un type particulier?
Dans l'attente de vos conseils avisés
Le code:
Dim LRSOD As Range 'La Range Source de DonneeSet LRSOD = Range("A10", Range("T65536").End(xlUp)) 'plage que je qualifie de variable A10:Txx que je souhaite recuperer par copie 'pour la coller ensuite dans le fichier SSE.xls à la premiere cellule vide en colonne ADim MRSR As Range 'Ma Range Source RécupéréeSet MRSR = Range("A" & Range("A16000").End(xlUp).Row + 1 'plage qui va determiner ou aller coller les valeurs récupérées
Bonjour
Avec 2010 tu peux télécharger et installer l'add on PowerQuery (totalement intégré à Excel à partir de 2016) et synthétiser un dossier de fichiers par une simple requête.
Pourquoi utiliser le format xls périmé depuis 15 ans ?
bonjour,
un boucle avec seulement les fichiers ouverts
Option Compare Text '1ière ligne du module
Sub Copier()
For Each wb In Workbooks 'boucle les fichiers ouverts
If wb.Worksheets.Count = 1 Then 'seulement les fichiers avec une feuille
Select Case wb.Name 'le nom du fichier
Case ThisWorkbook.Name, "SSE.xls" 'ces 2 fichiers = rien faire
Case Else 'les autres fichiers
With wb.Sheets(1) '1ière feuille (ik n'y a qu'une)
.Range(.Range("A10"), .Range("T" & Rows.Count).End(xlUp)).Copy 'plage que je qualifie de variable A10:Txx que je souhaite recuperer par copie 'pour la coller ensuite dans le fichier SSE.xls à la premiere cellule vide en colonne ADim MRSR As Range 'Ma Range Source RécupéréeSet MRSR = Range("A" & Range("A16000").End(xlUp).Row + 1 'plage qui va determiner ou aller coller les valeurs récupérées
End With
Workbooks("SSE.xls").Range("A" & Rows.Count).End(xlUp).PasteSpecial xlPasteValues
Application.CutCopyMode = Fals
End Select
End If
Next
End SubBonjour 78Chris
je cherche à me faire cette macro, car sur nos poste de travail il n'est pas, à ce jour possible d'utiliser PowerQuerry.
Un peu pour comme dire, pourquoi faire simple, quand on peut faire compliqué...
et oubli de ma part, fichier xls téléchargé depuis un serveur... ouvert avec la modification possible pour pouvoir travailler dessus
On est équipé très basiquement sur le plan informatique ;-)
Bonjour BsAlv
j'ai regardé ta proposition et l'ai testé sur mes fichiers.
Pour le monde l'execution du code copie la premiere plage du 1er classeur xls mais stoppe avec le message suivant
Erreur d'excecution '1004':
erreur définie par l'application ou par l'objet et surligne en jaune la ligne suivante
à End With soit le classeur ou doit se coller cette copie
re, la feuille manquait. J'ai l"idée que le fichier qui contient la macro n'est pas "SSE.xls", c'est vrai ?
Workbooks("SSE.xls").sheets("ABC").Range("A" & Rows.Count).End(xlUp).PasteSpecial xlPasteValues
Re BsAlv
oui, c'est exact, le fichier qui contient les macros, et donc la tienne est un fichier xlsm ("RECREER FICHIER SSE.xlsm");
Au niveau de ton code, il semble reconnu par le ThisWorbooks.Name
Re bonsoir tout le monde, donc pour le moment cela bloque toujours au niveau de la ligne ou est indiquée de faire la copie des données copiées...
la feuille dans le fichier Workbooks("SSE.xls"), elle s'appèle "ABC" ? Si c'est différent, il faut le changer dans VBA ou sur la feuille.
Workbooks("SSE.xls").sheets("ABC").......
Bsr à tous
bsr BsAlv
les essais restent infructueux. Concernant ton dernier message, la référence au classeur était correct.
J'ai essayé plusieurs fois, en essayant de corriger selon le type de message affiché, par exemple
"Erreur d'excecution '13' Incompatibilité de type"
"Erreur de compilation Membre de méthode ou de données introuvable" : nom de la Su surligné en jaune et ligne Wb whorsheets.count en bleu