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

6classeur1.xlsx (22.41 Ko)
5classeur2.xlsx (29.87 Ko)
3classeur3.xlsx (26.93 Ko)
5consobfc.xlsx (9.54 Ko)

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
6consobfc.xlsm (18.47 Ko)

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.

Rechercher des sujets similaires à "macro conso donnees"