Parcourir les fichiers d'un dossier et faire une rechercheV

Fermé
senecartour Messages postés 325 Date d'inscription dimanche 12 mai 2013 Statut Membre Dernière intervention 29 octobre 2020 - 18 juin 2019 à 23:21
 loic841 - 29 avril 2020 à 23:00
Bonjour à tous,

Je me permets de vous solliciter pour m'aider à résoudre un problème.
J'ai plusieurs fichiers dans un dossier et j'ai mon fichier principal dans le quel j'ai des données dans la colonne "A" de l'onglet "Feuil1".
Je cherche une macro, qui permets de parcourir un à un les fichiers de mon répertoire, de faire la rechercheV par rapport au données de la colonne "A" de l'onglet "A" de mon classeur principal et d'afficher les résultats dans la colonne B.

Je vous remercie énormément pour votre aide.

Cordialement,

A voir également:

3 réponses

ThauTheme Messages postés 1442 Date d'inscription mardi 21 octobre 2014 Statut Membre Dernière intervention 29 juillet 2022 160
19 juin 2019 à 12:15
Bonjour Senecartrour, bonjour le forum,

Manque de renseignements pour pouvoir t'aider :

- Les autres fichiers se trouvent-ils dans le même dossier que le fichier principal ?
- Le dossier contient-il d'autres fichiers qui n'ont rien à voir ?
- Quelle extension des fichiers ?
- Chemin d'accès complet du dossier ?
- Les données commencent-elles toutes dans la cellule A1 ?

En attendant ta réponse je te prépare un code et te l'envoie plus tard...
0
ThauTheme Messages postés 1442 Date d'inscription mardi 21 octobre 2014 Statut Membre Dernière intervention 29 juillet 2022 160
19 juin 2019 à 14:32
Re,

Essaie ce code à placer dans le fichier principal :
Sub Macro1()
Dim CD As Workbook 'déclare la variable CD (Classeur Destination)
Dim CA As String 'déclare la variable CA (Chemin d'Accès)
Dim OD As Worksheet 'déclare la variable OD (Onglet Destination)
Dim DL As Integer 'déclare la variable DL (Dernière Ligne)
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Dim F As String 'déclare la variable F (Fichier)
Dim CS As Workbook 'déclare la variable CS (Classeur Source)
Dim OS As Worksheet 'déclare la variable OS (Onglet Source)
Dim TVS As Variant 'déclare la variable TVS (Tableau des Valeurs de la Source)

Set CD = ThisWorkbook 'définit le classeur destination CD
CA = CD.Path & "\" 'définit le chemin d'accès CA
Set OD = CD.Worksheets("Feuil1") 'définit l'onglet destination OD
DL = OD.Cells(Application.Rows.Count, "A").End(xlUp).Row 'définit la dernière ligne éditée DL de la colonne A de l'onglet OD
TV = OD.Range("A1:A" & DL) 'définit le tableau des valeurs TV
F = Dir(CA & "*.xls") 'définit le premier fichier F ayant CA comme chemin d'accès et .xls comme extension
Do While F <> "" 'exécute tant qu'il existe des fichiers F
    Set CS = Workbooks.Open(CA & F) 'définit le classeur source CS (en l'ouvrant)
    Set OS = CS.Worksheets(1) 'définit l'onglet source OS (1er onglet du classeur source CS)
    TVS = OS.Range("A1").CurrentRegion 'définit le tableau des valeur de la source TVS
    For I = 1 To DL 'boucle 1 : sur toutes les lignes I du tableau des valeurs TV
        For J = 1 To UBound(TVS, 1) 'boucle 2 : sur toutes les lignes J du tableau des valeurs de la sources TVS
            If TV(I, 1) = TVS(J, 1) Then 'condition : si les deux données en colonne 1 sont identiques
                OD.Cells(I, "B").Value = TVS(J, 2) 'renvoie dans le cellule ligne I colonne B de l'onglet OD, la valeur de la donnée ligne J colonne 2 du tableau des valeurs TVS
                Exit For 'sort de la boucle 2
            End If 'fin de la condition
        Next J 'prochaine ligne de la boucle 2
    Next I 'prochaine ligne de la boucle 1
    CS.Close False 'ferme le classeur source sans enregistrer
    F = Dir 'définit le fichier suivant F ayant CA comme chemin d'accès et .xls comme extension
Loop 'boucle
End Sub

0
senecartour Messages postés 325 Date d'inscription dimanche 12 mai 2013 Statut Membre Dernière intervention 29 octobre 2020 3
20 juin 2019 à 17:54
Bonjour ThauTheme ,
Merci beaucoup pour ton aide. C'est exactement ce que je voulais. Mais juste un petit point à corriger !
Les autres fichiers sont dans le même répertoire que le fichier principal et je ne veux pas que le fichier principal soit pris en compte dans la boucle.

Pourrais-tu adapter la macro pour que seuls les fichiers à traiter soient pris en compte dans la boucle ?

Si vous arrivez à me corriger cela, c'est génial!!
En tout cas merci infiniment!
Cordialement,
0
ThauTheme Messages postés 1442 Date d'inscription mardi 21 octobre 2014 Statut Membre Dernière intervention 29 juillet 2022 160
21 juin 2019 à 08:37
Re,

Le code corrigé :
Sub Macro1()
Dim CD As Workbook 'déclare la variable CD (Classeur Destination)
Dim CA As String 'déclare la variable CA (Chemin d'Accès)
Dim OD As Worksheet 'déclare la variable OD (Onglet Destination)
Dim DL As Integer 'déclare la variable DL (Dernière Ligne)
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Dim F As String 'déclare la variable F (Fichier)
Dim CS As Workbook 'déclare la variable CS (Classeur Source)
Dim OS As Worksheet 'déclare la variable OS (Onglet Source)
Dim TVS As Variant 'déclare la variable TVS (Tableau des Valeurs de la Source)

Set CD = ThisWorkbook 'définit le classeur destination CD
CA = CD.Path & "\" 'définit le chemin d'accès CA
CA = "Z:\poubelle\CharlieB\"
Set OD = CD.Worksheets("Feuil1") 'définit l'onglet destination OD
DL = OD.Cells(Application.Rows.Count, "A").End(xlUp).Row 'définit la dernière ligne éditée DL de la colonne A de l'onglet OD
TV = OD.Range("A1:A" & DL) 'définit le tableau des valeurs TV
F = Dir(CA & "*.xls") 'définit le premier fichier F ayant CA comme chemin d'accès et .xls comme extension
Do While F <> "" 'exécute tant qu'il existe des fichiers F
    If Not F = CD.Name Then
        Set CS = Workbooks.Open(CA & F) 'définit le classeur source CS (en l'ouvrant)
        Set OS = CS.Worksheets(1) 'définit l'onglet source OS (1er onglet du classeur source CS)
        TVS = OS.Range("A1").CurrentRegion 'définit le tableau des valeur de la source TVS
        For I = 1 To DL 'boucle 1 : sur toutes les lignes I du tableau des valeurs TV
            For J = 1 To UBound(TVS, 1) 'boucle 2 : sur toutes les lignes J du tableau des valeurs de la sources TVS
                If TV(I, 1) = TVS(J, 1) Then 'condition : si les deux données en colonne 1 sont identiques
                    OD.Cells(I, "B").Value = TVS(J, 2) 'renvoie dans le cellule ligne I colonne B de l'onglet OD, la valeur de la donnée ligne J colonne 2 du tableau des valeurs TVS
                    Exit For 'sort de la boucle 2
                End If 'fin de la condition
            Next J 'prochaine ligne de la boucle 2
        Next I 'prochaine ligne de la boucle 1
        CS.Close False 'ferme le classeur source sans enregistrer
    End If
    F = Dir 'définit le fichier suivant F ayant CA comme chemin d'accès et .xls comme extension
Loop 'boucle
End Sub


0
Bonjour,

Merci pour cette réponse qui m'a également était utile.

Je me permets du coup de vous solliciter pour mon propre besoin :

Dans le fichier principal, je souhaite faire apparaître une colonne par fichier. Il ne faut donc pas reporter à chaque fois dans la colonne B mais décaler au fur et à mesure. Pourriez-vous m'aider ? J'ai réussi a faire apparaître le nom du fichier en colonne mais dans la macro actuelle, les valeurs sont écrasées puisque reportées dans la même colonne.

Autre difficulté que vous pourriez peut être m'aider à résoudre, mais là j'en demande peut-être trop : j'ai parfois plusieurs fois un champs identique dans mes fichiers sources. Peut-on reporter la somme des champs identique dans le fichier principale.

Merci d'avance pour votre éclairage et vos précieux conseils.
0
yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476
28 avril 2020 à 16:18
peux-tu créer une nouvelle discussion, et y partager ton code?
pour contrôler la colonne de destination, il suffit de remplacer
Cells(I, "B")
par
Cells(I, lenumerodelacolonne)

si tu préservé la logique du code ci-dessus, il sera assez simple de faire les sommes.
0
loic841 > yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024
29 avril 2020 à 14:14
Bonjour,

merci pour votre réponse. Avec un peu de réflexion, j'ai modifié le code d'origine pour obtenir ce que je cherchais. je vous le laisse ci-dessous pour information. Si ce n'est vraiment pas la place, je pourrais le supprimer :



Sub Macro1()
Dim CD As Workbook 'déclare la variable CD (Classeur Destination)
Dim CA As String 'déclare la variable CA (Chemin d'Accès)
Dim OD As Worksheet 'déclare la variable OD (Onglet Destination)
Dim DL As Integer 'déclare la variable DL (Dernière Ligne)
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Dim F As String 'déclare la variable F (Fichier)
Dim COL As Integer 'variable pour dédier une collone au fichier F
Dim CS As Workbook 'déclare la variable CS (Classeur Source)
Dim OS As Worksheet 'déclare la variable OS (Onglet Source)
Dim TVS As Variant 'déclare la variable TVS (Tableau des Valeurs de la Source)
Dim SO As Currency ' XXdéclare la variable somme


Set CD = ThisWorkbook 'définit le classeur destination CD
CA = CD.Path & "\" 'définit le chemin d'accès CA
CA = "C:\Users\chery\Documents\Coût\"
Set OD = CD.Worksheets("Compilation") 'définit l'onglet destination OD
DL = OD.Cells(Application.Rows.Count, "B").End(xlUp).Row 'définit la dernière ligne éditée DL de la colonne A de l'onglet OD
TV = OD.Range("B1:B" & DL) 'définit le tableau des valeurs TV
F = Dir(CA & "*.xlsm") 'définit le premier fichier F ayant CA comme chemin d'accès et .xlsm comme extension
COL = 0 'Initialisation de Col
Do While F <> "" 'exécute tant qu'il existe des fichiers F
If Not F = CD.Name Then
Set CS = Workbooks.Open(CA & F) 'définit le classeur source CS (en l'ouvrant)
Set OS = CS.Worksheets(1) 'définit l'onglet source OS (1er onglet du classeur source CS)
TVS = OS.Range("A1:J" & DL) 'définit le tableau des valeur de la source TVS
OD.Cells(1, COL).Value = F 'renvoie en tête de colonne le nom du fichier
For i = 2 To DL 'boucle 1 : sur toutes les lignes I du tableau des valeurs TV
SO = 0 'Initialisation de la valeur colonne
For j = 1 To UBound(TVS, 1) 'boucle 2 : sur toutes les lignes J du tableau des valeurs de la sources TVS
If TV(i, 1) = TVS(j, 1) Then 'condition : si les deux données en colonne 1 sont identiques
SO = SO + TVS(j, 10) 'XX
End If 'fin de la condition
Next j 'prochaine ligne de la boucle 2
OD.Cells(i, COL).Value = SO 'XXrenvoie dans le cellule ligne I colonne B de l'onglet OD, la valeur de la donnée ligne J colonne 2 du tableau des valeurs TVS
Next i 'prochaine ligne de la boucle 1
CS.Close False 'ferme le classeur source sans enregistrer
End If
F = Dir 'définit le fichier suivant F ayant CA comme chemin d'accès et .xls comme extension
COL = COL + 4 'incrémentation de Col
Loop 'boucle
End Sub

0
yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476 > loic841
29 avril 2020 à 16:19
pour info, au lieu d'utiliser SO, tu aurais aussi pu faire ainsi:
OD.Cells(i, COL).Value = 0
' ...
OD.Cells(i, COL).Value = OD.Cells(i, COL).Value + TVS(j, 10) 
0
loic841 > yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024
29 avril 2020 à 23:00
Merci, effectivement je me suis compliqué la vie mais c'était ma première macro.
Bonne soirée.
0