MAcro conso Données

Y compris Power BI, Power Query et toute autre question en lien avec Excel
K
Krimo1973
Jeune membre
Jeune membre
Messages : 10
Inscrit le : 19 janvier 2020

Message par Krimo1973 » 24 janvier 2020, 16:24

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
ConsoBFC.xlsx
(9.54 Kio) Téléchargé 2 fois
Classeur3.xlsx
(26.93 Kio) Téléchargé 2 fois
Classeur2.xlsx
(29.87 Kio) Téléchargé 2 fois
Classeur1.xlsx
(22.41 Kio) Téléchargé 4 fois
Avatar du membre
Steelson
Fanatique d'Excel
Fanatique d'Excel
Messages : 13'489
Appréciations reçues : 752
Inscrit le : 13 octobre 2014
Version d'Excel : 2013 FR
Téléchargements : Mes applications

Message par Steelson » 24 janvier 2020, 16:56

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
ConsoBFC.xlsm
(18.47 Kio) Téléchargé 3 fois

O.o°• ♪♪♫ °º¤ø,¸¸,ø¤º°`°º¤ø,¸ O.o°• ♪♪♫ °º¤ø,¸¸,ø¤º°`°º¤ø,¸
PI = 3.14159 26535 89793 23846 26433 83279 50288 41971 69399 37510 58209 74944 59230 78164 06286 20899 86280

( ͡• ͜ʖ ͡• )
K
Krimo1973
Jeune membre
Jeune membre
Messages : 10
Inscrit le : 19 janvier 2020

Message par Krimo1973 » 24 janvier 2020, 17:16

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
Avatar du membre
Steelson
Fanatique d'Excel
Fanatique d'Excel
Messages : 13'489
Appréciations reçues : 752
Inscrit le : 13 octobre 2014
Version d'Excel : 2013 FR
Téléchargements : Mes applications

Message par Steelson » 24 janvier 2020, 20:42

Krimo1973 a écrit :
24 janvier 2020, 17:16
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

O.o°• ♪♪♫ °º¤ø,¸¸,ø¤º°`°º¤ø,¸ O.o°• ♪♪♫ °º¤ø,¸¸,ø¤º°`°º¤ø,¸
PI = 3.14159 26535 89793 23846 26433 83279 50288 41971 69399 37510 58209 74944 59230 78164 06286 20899 86280

( ͡• ͜ʖ ͡• )
K
Krimo1973
Jeune membre
Jeune membre
Messages : 10
Inscrit le : 19 janvier 2020

Message par Krimo1973 » 24 janvier 2020, 22:21

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
Avatar du membre
Steelson
Fanatique d'Excel
Fanatique d'Excel
Messages : 13'489
Appréciations reçues : 752
Inscrit le : 13 octobre 2014
Version d'Excel : 2013 FR
Téléchargements : Mes applications

Message par Steelson » 25 janvier 2020, 01:52

Krimo1973 a écrit :
24 janvier 2020, 22:21
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
Krimo1973 a écrit :
24 janvier 2020, 22:21
En revanche je n'ai bien cerné l'utilité de l'instruction set
https://docs.microsoft.com/fr-fr/office ... -statement
On emploie set pour définir un objet, mais s'il s'agit d'une simple variable ce n'est pas nécessaire.

O.o°• ♪♪♫ °º¤ø,¸¸,ø¤º°`°º¤ø,¸ O.o°• ♪♪♫ °º¤ø,¸¸,ø¤º°`°º¤ø,¸
PI = 3.14159 26535 89793 23846 26433 83279 50288 41971 69399 37510 58209 74944 59230 78164 06286 20899 86280

( ͡• ͜ʖ ͡• )
K
Krimo1973
Jeune membre
Jeune membre
Messages : 10
Inscrit le : 19 janvier 2020

Message par Krimo1973 » 25 janvier 2020, 11:44

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
Avatar du membre
Steelson
Fanatique d'Excel
Fanatique d'Excel
Messages : 13'489
Appréciations reçues : 752
Inscrit le : 13 octobre 2014
Version d'Excel : 2013 FR
Téléchargements : Mes applications

Message par Steelson » 25 janvier 2020, 11:52

Bonjour,

d'abord, mets les portions de code avec les balises </> sinon ce n'est pas lisible
Krimo1973 a écrit :
25 janvier 2020, 11:44
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.

O.o°• ♪♪♫ °º¤ø,¸¸,ø¤º°`°º¤ø,¸ O.o°• ♪♪♫ °º¤ø,¸¸,ø¤º°`°º¤ø,¸
PI = 3.14159 26535 89793 23846 26433 83279 50288 41971 69399 37510 58209 74944 59230 78164 06286 20899 86280

( ͡• ͜ʖ ͡• )
Répondre Sujet précédentSujet suivant
  • Sujets similaires
    Réponses
    Vues
    Dernier message