MAcro conso Données
Bonjour à vous,
J'ai 3 classeurs excel avec des données différentes d'un fichier à l'autre . Mon but est de créer une macro qui va :
ouvrir les 3 fichiers classeurs et copier/coller les données vers le fichier ConsoBFC.xls
Chemin pour accéder aux 3 fichiers classeurs ( classeur 1, classeur 2, classeur 3)
T:\Administratif & Financier\VBA
Par contre la macro doit copier les données les unes après les autres en laissant au moins une ligne vide entre chaque pavet
Merci par avance
Bonjour,
un premier jet rapide
indique où sont rassemblés tes fichiers source et modifie ici
chemin = ThisWorkbook.Path & "\test\"
Option Explicit
Dim wbk1 As Workbook, wbk2 As Workbook
Dim ws1 As Worksheet, ws2 As Worksheet
Dim rng1 As Range, rng2 As Range
Dim chemin$, monFichier$, onglet$
Sub collecter()
chemin = ThisWorkbook.Path & "\test\"
Set wbk1 = ThisWorkbook
Set ws1 = wbk1.Sheets(1)
ws1.Cells(1).CurrentRegion.Offset(1, 0).ClearContents
monFichier = Dir(chemin & "*.xlsx")
Do While monFichier <> ""
Set wbk2 = Workbooks.Open(chemin & monFichier)
Set ws2 = wbk2.Sheets(1)
Set rng2 = ws2.UsedRange
rng2.Copy
Set rng1 = ws1.Cells(Rows.Count, 1).End(xlUp).Offset(2, 0)
rng1.PasteSpecial Paste:=xlPasteValuesAndNumberFormats
Application.CutCopyMode = False
wbk2.Close False
monFichier = Dir
Loop
End Sub
merci Steelson pour ta proposition . Je dévoute sur VBA , donc est il possible de me documenter davantage le code afin que je comprenne les différentes étapes
Option Explicit
Dim wbk1 As Workbook, wbk2 As Workbook
Dim ws1 As Worksheet, ws2 As Worksheet
Dim rng1 As Range, rng2 As Range
Qu'est ce que tu entends par wbk1, wbk2
Qu'est ce que tu entends par ws1, ws2
Qu'est ce que tu entends par rng1 , rng2
Dim chemin$, monFichier$, onglet$
Idem pour cette syntaxe
chemin = ThisWorkbook.Path & "\test\" il faut que je mettre quoi à la place de test ?
demain la partie du code qui suit je ne la comprends pas , je crois comprendre qu'il s'agit d'une boucle
Merci
Set wbk1 = ThisWorkbook
Set ws1 = wbk1.Sheets(1)
ws1.Cells(1).CurrentRegion.Offset(1, 0).ClearContents
monFichier = Dir(chemin & "*.xlsx")
Do While monFichier <> ""
Set wbk2 = Workbooks.Open(chemin & monFichier)
Set ws2 = wbk2.Sheets(1)
Set rng2 = ws2.UsedRange
rng2.Copy
Set rng1 = ws1.Cells(Rows.Count, 1).End(xlUp).Offset(2, 0)
rng1.PasteSpecial Paste:=xlPasteValuesAndNumberFormats
Application.CutCopyMode = False
wbk2.Close False
monFichier = Dir
Loop
End Sub
Je dévoute sur VBA , donc est il possible de me documenter davantage le code afin que je comprenne les différentes étapes
ok
Qu'est ce que tu entends par wbk1, wbk2
Qu'est ce que tu entends par ws1, ws2
Qu'est ce que tu entends par rng1 , rng2
Pour clarifier un code, il vaut mieux donner des "noms" aux objets (fichier, feuille, cellules) que l'on manipule. Ces objets sont toujours définis moyennant l'instruction Set
wbk1 et wkb2 sont les noms que j'ai donnés aux fichiers respectivement résultat et source
ws1 et ws2 ... idem pour les feuilles ou onglets (sheet en anglais)
rng1 rng2 ... idem pour les cellules (range en anglais)
Dim chemin$, monFichier$, onglet$
il s'agit de déclarer les variables, ... quand on met $ à la fin cela signifie que ce sont ds variables texte (string)
chemin = ThisWorkbook.Path & "\test\" il faut que je mettre quoi à la place de test ?
le nom du dossir dans lequl tu as regroupés les fichiers source (ce dossier étant ici un sous-dossier du dossier dans lequel on trouve l fichier qui regroupe les données
je définie le fichier cible
Set wbk1 = ThisWorkbook
Set ws1 = wbk1.Sheets(1)
j'efface les données éventuelles - j'aurais du mettre plutôt ws1.cells.clear
ws1.Cells(1).CurrentRegion.Offset(1, 0).ClearContents
il s'agit en effet d'une boucle où tant que je trouve un fichier dans le répertoire, je copie les données et je les colle dans le fichier cible, puis je ferme le fichier t je passe au suivant ... je te laisse étudier plus en détail les instructions
monFichier = Dir(chemin & "*.xlsx")
Do While monFichier <> ""
Set wbk2 = Workbooks.Open(chemin & monFichier)
Set ws2 = wbk2.Sheets(1)
Set rng2 = ws2.UsedRange
rng2.Copy
Set rng1 = ws1.Cells(Rows.Count, 1).End(xlUp).Offset(2, 0)
rng1.PasteSpecial Paste:=xlPasteValuesAndNumberFormats
Application.CutCopyMode = False
wbk2.Close False
monFichier = Dir
Loop
Top ! Merci Camarade .
Par contre si j'ai bien compris jai 3 fichiers
Sources ( classeur 1, classeur 2, classeur 3 ) et un fichier résultat ou cible ( fichier conso Bfc )
Est bien cela ?
En revanche je n'ai bien cerné l'utilité de l'instruction set
Merci à toi
Par contre si j'ai bien compris jai 3 fichiers
Sources ( classeur 1, classeur 2, classeur 3 ) et un fichier résultat ou cible ( fichier conso Bfc )
C'est ce que tu avais donné ... tu as d'ailleurs autant de fichier source qu tu as de fichiers dans ton sous-répertoire
En revanche je n'ai bien cerné l'utilité de l'instruction set
https://docs.microsoft.com/fr-fr/office/vba/language/reference/user-interface-help/set-statement
On emploie set pour définir un objet, mais s'il s'agit d'une simple variable ce n'est pas nécessaire.
Bonjour Steelson
Je m'excuse par avance mais j'ai encore des zones de doute pour bien saisir ce code .
Mes commentaires ci-dessous à chaque étape
merci encore
Option Explicit
Dim classeur1 As Workbook, classeur2 As Workbook,classeur3 As Workbook, est ce bien cela ?
Dim ws1 As Worksheet, ws2 As Worksheet, ws3 As Worksheet ( feuille 1 du classeur 1 ouvert , feuille 2 du classeur 2 ouvert, feuille 3 du classeur 3 ouvert) est ce bien cela ?
Dim rng1 As Range, rng2 As Range, rng3 As Range ( définition des plages du classeur 1 ouvert , du classeur 2 ouvert, du classeur 3 ouvert) est ce bien cela ?
Dim chemin as string, monFichier as string, onglet as string
Sub collecter()
chemin = ThisWorkbook.Path & "\VBA\" ( c'est le chemin du fichier ouvert ConsoBFC.xls qui va recevoir les imputs des 3 classeurs )
Set wbk1 = ThisWorkbook ( je declare la variable objet le fichier wbk1 (le fichier cible) c'est a dire le fichier ConsoBFC.xls)
Set ws1 = wbk1.Sheets(1) (je n'ai pas compris cette partie la ?)
ws1.cells.clear ( j'efface les données s'il y en a dans le fichier cible ConsoBFC.xls au cas ou )
monFichier = Dir(chemin & "*.xlsx") ( je definie le nom de mon fichier ) instruction qui va lire ThisWorkbook.Path & \VBA\classeur*.xlsx
monFichier = Dir(chemin & "*.xlsx")
Do While monFichier <> "" ( tant qu'il ya fichier qui est dans le repertoire qui est ouvert à savoir T:\Administratif & Financier\VBA et qui contient le mot classeur
Set wbk2 = Workbooks.Open(chemin & monFichier) (ouvre alors le 1er fichier soit classeur 1 et va sur la feuille 1 de ce fichier et selectionne les cellules avec des données et copie les mais je ne vois pas le référence au fichier destinataire ???
Set ws2 = wbk2.Sheets(1)
Set rng2 = ws2.UsedRange
rng2.Copy
Set rng1 = ws1.Cells(Rows.Count, 1).End(xlUp).Offset(2, 0)
rng1.PasteSpecial Paste:=xlPasteValuesAndNumberFormats
Application.CutCopyMode = False
wbk2.Close False
monFichier = Dir
Loop
Bonjour,
d'abord, mets les portions de code avec les balises </> sinon ce n'est pas lisible
Bonjour Steelson
Je m'excuse par avance mais j'ai encore des zones de doute pour bien saisir ce code .
Mes commentaires ci-dessous à chaque étape
merci encore
Option Explicit Dim classeur1 As Workbook, classeur2 As Workbook,classeur3 As Workbook Dim ws1 As Worksheet, ws2 As Worksheet, ws3 As Worksheet '( feuille 1 du classeur 1 ouvert , feuille 2 du classeur 2 ouvert, feuille 3 du classeur 3 ouvert) Dim rng1 As Range, rng2 As Range, rng3 As Range '( définition des plages du classeur 1 ouvert , du classeur 2 ouvert, du classeur 3 ouvert)
est ce bien cela ?
Oui et non !!!
Pas la peine de définir 3 classeurs, 3 feuilles, 3 zones .... 2 suffisent, par exemple pour les classeurs ...
Dim classeurchapeau as workbook
dim classeurbase as workbook
que j'avais appelés wbk1 et WBK2 en fait
mais classeurbase ou bien wbk2 ou ce-que-tu-veux sera successivement le premier fichier, le second, le troisième, voire aussi tous les autres trouvés dans le sous-dossier sans avoir à donner un nouveau nom à chaque fois.