Macro d'extraction de données

Tini3

XLDnaute Nouveau
Bonjour à tous,

Je viens à vous parce que je suis novice en macro excel et pourtant j'ai besoin de créer un macro d'extraction de données; je ne m'en sors pas.
J'ai des fichiers que je vais appeler "source1" , "source2", "source3" qui ont exactement les mêmes structures mais avec des données différentes. A partir de ces fichiers, je dois créer un autre fichier "résultat" qui doit résumer le tout en un seul tableau.
Je vous ai mis en pièces jointes les fichiers.
Est ce que vous pourriez m'aider à créer ce macro s'il vous plaît. Ça me dépannerait énormément.


Merci beaucoup de l'aide que vous pourriez m'apporter.

Tini
 

Pièces jointes

  • Source1.xlsx
    10.9 KB · Affichages: 66
  • Resultat.xlsx
    8.8 KB · Affichages: 76
  • Source1.xlsx
    10.9 KB · Affichages: 61
  • Resultat.xlsx
    8.8 KB · Affichages: 74
  • Source1.xlsx
    10.9 KB · Affichages: 61
  • Resultat.xlsx
    8.8 KB · Affichages: 71
  • Source3.xlsx
    10.9 KB · Affichages: 54
  • Source2.xlsx
    10.9 KB · Affichages: 55

DoubleZero

XLDnaute Barbatruc
Re : Macro d'extraction de données

Bonjour à toutes et à tous,

Bienvenue sur XLD, Tini3.

Un essai en pièce jointe.

Les quatre fichiers doivent se trouver dans le même répertoire.

A bientôt :)
 

Pièces jointes

  • 00 - Tini3 - Fichiers consolider.xlsm
    35.5 KB · Affichages: 54

Robert

XLDnaute Barbatruc
Repose en paix
Re : Macro d'extraction de données

Bonjour Tini est bienvenue, bonjour 00, bonjour le forum,

DoubleZero a été bien trop rapide pour moi mais comme j'ai aussi une solution je te la propose malgré tout...

Ce code, à placer dans le classeur Resultat (qui deviendra donc .xlsm), fonctionne si tous les classeurs sources et seulement eux se trouve dans le même dossier que le classeur Resultat.
Code:
Sub Macro1()
Dim cr As Workbook 'déclare la variable cr (Classeur Resultat)
Dim re As Object 'déclare la variable re (onglet REsumé)
Dim ch As String 'déclare la variable ch (CHemin)
Dim f As Variant 'déclare la variable f (Fichier)
Dim cd As Workbook 'déclare la variable cd (Classeur de Données)
Dim o As Object 'déclare la variable o (Onglets)
Dim rc As Range 'déclare la variable rc (Recherche de la Colonne)
Dim col As Byte 'déclare la variable col (COLonne)
Dim dl As Integer 'déclare la variable dl (Dernière Ligne)
Dim pl As Range 'déclare la variable pl (PLage)
Dim cel As Range 'déclare la variable cel (CELlule)
Dim rl As Range 'déclare la variable rl (Recherche de la Ligne)
Dim li As Integer 'déclare la variable li (LIgne)

Set cr = ThisWorkbook 'définit le classeur resultat cr
Set re = cr.Sheets("Resumé") 'définit l'onglet Resumé re
re.Range("A1").CurrentRegion.ClearContents 'efface d'éventuelles anciennes données du classeur resultat
ch = cr.Path 'définit la chemin
f = Dir(ch & "\*.xlsx") 'définit le premier fichier f (fichier dont l'extension est ".xlsx" dans le dossier ch)
Do While f <> "" 'boucle 1 : tant qu'il existe des fichiers avec les caractéristiques au-dessus
    Workbooks.Open f 'ouvre le fichier
    Set cd = ActiveWorkbook 'définit le classeur de données cd
    Set rc = re.Rows(1).Find(cd.Name, , xlValues, xlWhole) 'définit la recherche de la colonne (recherche le nom du fichier dans la première ligne [classeur cr, onglet re])
    'si aucune occurrence n'est trouvée, définit la colonne col comme la colonne de la première cellule vide de la ligne 1
    'sinon col est définie comme la colonne de la première occurrence trouvée
    If rc Is Nothing Then col = re.Cells(1, Application.Columns.Count).End(xlToLeft).Column + 1 Else col = rc.Column
    re.Cells(1, col).Value = cd.Name 'place le nom du fichier dans la cellule ligne 1, colonne col
    For Each o In cd.Sheets 'boucle 2 : sur tous les onglets du fichier cd
        dl = o.Cells(Application.Rows.Count, 1).End(xlUp).Row 'définit la dernière ligne éditée dl de la colonne 1 (=A) de l'onglet o
        Set pl = o.Range("A1:A" & dl) 'définit la plage pl
        For Each cel In pl 'boucle 3 : sur toutes les cellules de la plage pl
            Set rl = re.Columns(1).Find(cel.Value, , xlValues, xlWhole) 'définit la recherche de la ligne (recherche la valeur de la cellule cel dans la colonne A)
            'si aucune occurrence n'est trouvée, définit la ligne li comme la première ligne vide de la colonne A
            'sinon li est définie comme la ligne de la première occurrence trouvée
            If rl Is Nothing Then li = re.Cells(Application.Rows.Count, 1).End(xlUp).Row + 1 Else li = rl.Row
            re.Cells(li, 1).Value = cel.Value 'place la valeur de la colonne A
            re.Cells(li, col).Value = cel.Offset(0, 1).Value 'place la valeur de la colonne B
        Next cel 'prochaine cellule de la boucle 3
    Next o 'prochain onglet de la boucle 2
    cd.Close 'ferme le classeur de données
    f = Dir 'définit le prochain fichier dont l'extension est ".xlsx" dans le dossier ch
Loop 'boucle
End Sub
si il y a d'autres classeurs (que les classeurs sources) dans le dossier il faudra l'adapter...
 

Tini3

XLDnaute Nouveau
Re : Macro d'extraction de données

Bonjour,

Merci beaucoup DoubleZero, le macro marche bien. Je vais essayer de l'adapter à mes vrais fichiers. J'ai presque envie de te demander la signification de chaque ligne. :) Mais je vais me débrouiller pour tout comprendre.
En tout cas merci beaucoup .

Si je coince je reprendrais la discussion si tu permets.

Très bonne journée.
Tini
 

Tini3

XLDnaute Nouveau
Re : Macro d'extraction de données

Bonjour Robert,

Merci beaucoup, je vais aussi adapter ton macro à mes vrais fichiers. Merci pour les explications à chaque ligne, ça m'aide énormément.

Ce forum est juste magnifique.

Très bonne journée.
Tini
 

Tini3

XLDnaute Nouveau
Re : Macro d'extraction de données

Bonjour DoubleZero et Robert,
Est ce que l'un de vous pourrait me répondre s'il vous plaît?
Les macro que vous m'avez envoyé marchent très bien et je vous en remercie. Mais depuis hier, je coince parce-que dans certaines des cellules de mes données sources, j'ai des données calculées; du coup quand je les copie de la source vers le résultat, la copie considère la formule et le format. Ce qui donne (#REF!) une fois dans le fichier résultat.
Est ce qu'il y aurait une commande que je pourrais ajouter à la ligne de commande macro pour ne copier que la valeur des cellules, sans le formule et le format?
Merci d'avance
Tini3
 

Discussions similaires

Statistiques des forums

Discussions
312 321
Messages
2 087 251
Membres
103 497
dernier inscrit
FAHDE