Réconciliation/comparaison de deux fichiers

Bonjour,

Je recois deux fichiers de données de deux sources differentes et je souhaite verifier si il y a des differences entre les deux pour certaines colonnes bien précises.

J’ai un premier fichier qui se trouve dans un dossier précis contenant plusieurs colonnes avec X lignes. Il y a seulement 6 colonnes qui m’interessent.

J’aimerais donc une macro qui:

1- m’extrait dans un troisième fichier les colonnes qui m’interessent provenant de mon premier fichier.

2- une fois extrait, que ces données soient classées/ordonnées.

3- une fois les données extraites de mon premier fichier il faut intégrer les données de certaines colonnes de mon second fichier qui ensuite seront à comparer (ligne par ligne) avec celles du premier fichier

En gros: de la colonne A à F = colonnes du 1er fichier.

De la colonne H à M = colonnes du second fichier.

De la colonne O à Q les colonnes qui permettront de comparer mes deux sources de données et voir si il y a des écarts de montant par exemple.

4- enregistrer ce troisième fichier créé.

Auriez vous des pistes? Des bouts de codes existant à adapter ?

Merci de m’avoir lu.

Cdlt

Bonjour D10

Est-ce que tu pourrais nous donner un exemple de tes 2 fichiers(même un extrait anonymisé, mais dont la structure est respectée), ainsi qu'idéalement le résultat à obtenir ?

Bonjour et merci de m’avoir lu ET répondu.

Je vous ecris de mon téléphone...en esperant etre le plus clair.

Premier fichier: j’ai une 20aines de colonnes mais seulement quelques une m’interessent qui sont:

1ere colonne: équipe

2eme colonne: nom du joueur

3eme colonne: nbre de buts

4eme colonne: nbre de passes decisives

5eme colonne: nbre de matchs joués

Deuxieme fichier:

J’ai aussi un certain nombre de colonnes mais je veux en sélectionner certaines. À vrai dire les colonnes me donnant l’équipe, le nom du joueur, nbre de buts, nbre de passes et matchs joués. Chose importante, ces données ne sont pas classés dans le même ordre que ceux du 1er fichier.

Dans le 3eme fichier j’aimerais donc rassembler ces données et les comparer ligne par ligne. Donc si y’a les stats du joueur X du premier fichier, j’aimerai mettre cote à cote les stats de ce joueur mais provenant du second fichier. Donc faut que la macro classe bien les données donc en classant par équipe puis par nom de joueur. Pour que les données du second fichier se classent de la même façon. Pour les avoir en face de l’autre. Donc pour comparer stats du joueur X du fichier 1 avec en face stats de ce joueur X du fichier 2 etcc..

Donc si le joueur X est à la ligne 8, faut que les données du second fichier de ce joueur soit aussi en ligne 8...

A à F = colonnes du 1er fichier.

De la colonne H à M = colonnes du second fichier classés dans le meme ordre.

De la colonne O à Q les colonnes qui permettront de comparer mes deux sources de données et voir si il y a des écarts par exemple.

Excusez moi si ce n’est pas clair..sur un téléphone c’est un peu compliqué.

Un énorme merci d’avance!

Passez une bonne journée.

(..)

NCC 1701 a écrit :

Est-ce que tu ne pourrais pas plutôt nous donner un exemple de tes 2 fichiers(même un extrait anonymisé, mais dont la structure est respectée), ainsi qu'idéalement le résultat à obtenir ?

Bonsoir,

vous trouverez en pièce jointe un exemple.

J’espère que ce fichier rendra mon explication un peu plus clair.

Merci encore

96exemple.xlsx (14.17 Ko)

ce n'est toujours pas clair ?

Bonjour D10

Je ne sais pas encore... je regarde ta PJ et je reviens...

Pas de soucis ! Merci encore

(..)

De rien...

Je viens de jeter un œil à ton fichier... quelques questions :

1) le 3ème onglet est-il bien la copie conforme du résultat à obtenir ? en terme de colonage (avec une séparation colonne 6 et 12) ?

2) quelles sont les formes (excel, texte, autre...) des fichiers 1 et 2 dont tu veux obtenir la comparaison ?

1) oui le 3éme onglet est bien le 3éme fichier que je souhaiterais avoir. Avec les séparations permettant de délimiter les données du fichier 1 et celle du fichier 2. Et ensuite les colonnes permettant de faire ressortir les écarts.

2) les fichiers 1 et 2 sont des données textes et chiffrés. En gros comme l’exemple que j’ai envoyé .

N’hesite pas si tu as d’autres questions.

(..)

Ok pour le point 1

Pour le point 2 quelle est l'extension (la source) des fichiers : texte (csv,txt, doc...), Excel (xls) ou autre ?

Le fichier 1 est un .xls.

Le fichier 2 est un .csv

et dans les deux il y a du texte comme le nom des équipes et des joueurs, et des chiffres comme le nombre de buts etc..

Mais pars du principe que le 2 aussi est un .xls si c'est plus simple pour toi.

(..)

Ce n'est ni plus simple, ni plus compliqué pour moi...

La vraie question est comment tu veux toi qu'ils soient traités

Je peux tout à fait "mixer" du CSV et du XLS le fait de traiter "directement" le CSV comme tel t'évites une manipulation de copie dans Excel, ce n'est peut-être pas négligeable ? à toi de voir...

Alors je confirme:

Le fichier 1 est un .xls.

Le fichier 2 est un .csv

Serait-il plus simple de créer au départ, un code copiant les colonnes en fonction du nom de celle-ci ? Sachant que les colonnes, que ça soit du fichier 1 et du fichier 2 auront toujours les même noms, mais pas de noms identiques entre les fichiers.

Je m'explique:

Le fichier 1 que je reçois aura toujours les mêmes noms de colonnes qui seront toujours placées de la même façon (c'est à dire colonne des noms des équipes toujours en colonne A etc..)

Le fichier 2 que je reçois d'une autre source, aura aussi toujours les mêmes noms de colonnes aussi et seront toujours placées de la même façon. (c'est à dire colonne des noms des équipes toujours en colonne B etc..)

MAIS par exemple, dans le fichier 1 la colonne des équipes s'appellera "Nom des équipes"

Alors que dans le fichier 2, la colonne des équipes s'appelle "Équipes"

Du coup un code qui:

1- cherche dans le fichier 1 des colonnes portant des noms bien précis et les places dans le fichier 3.

2- Une fois ces colonnes dans le fichier 3, classement par équipe puis par nom de joueur

2- cherche dans le fichier 2 des colonnes portant des noms bien précis et les places dans le fichier 3 suivant le même ordre des colonnes . Puis le but est que le joueur Lambda du fichier 1 soit en face du joueur Lambda du fichier 2.

3. puis ensuite faire la différence et en voir les écarts

Tu vois plus clair ?

Je te laisse voir

Bonsoir NCC 1701, D10 le forum

Je suis parti sur le fichier fourni au post #5 8)

A tester :

Attention au nom des feuilles

Option Explicit
Sub test()
Dim a, w(), i As Long, ii As Long, n As Long, dico As Object
    Set dico = CreateObject("Scripting.Dictionary")
    dico.CompareMode = 1
    With Sheets(1) 'la 1ere feuille du classeur
        With .Range("a5", .Range("a" & .Rows.Count).End(xlUp)).Resize(, 10)
            a = Application.Index(.Value, Evaluate("row(1:" & _
                                                   .Rows.Count & ")"), Array(1, 3, 6, 8, 10))
        End With
        For i = 1 To UBound(a, 1)
            If Not dico.exists(a(i, 1)) Then
                Set dico(a(i, 1)) = CreateObject("Scripting.Dictionary")
                dico(a(i, 1)).CompareMode = 1
            End If
            dico(a(i, 1))(a(i, 2)) = VBA.Array(a(i, 1), a(i, 2), a(i, 3), a(i, 4), _
                                               a(i, 5), Empty, a(i, 1), a(i, 2), Empty, _
                                               Empty, Empty, Empty, Empty, Empty, Empty)
        Next
    End With
    With Sheets(2) 'la 2eme feuille du classeur
        With .Range("b5", .Range("b" & .Rows.Count).End(xlUp)).Resize(, 9)
            a = Application.Index(.Value, Evaluate("row(1:" & _
                                                   .Rows.Count & ")"), Array(1, 2, 7, 9, 5))
        End With
        For i = 1 To UBound(a, 1)
            If dico.exists(a(i, 1)) Then
                w = dico(a(i, 1))(a(i, 2))
                w(8) = a(i, 3): w(9) = a(i, 4): w(10) = a(i, 5)
                w(12) = w(2) - w(8): w(13) = w(3) - w(9): w(14) = w(4) - w(10)
                dico(a(i, 1))(a(i, 2)) = w
            End If
        Next
    End With
    Application.ScreenUpdating = False
    'Restitution dans la 3eme feuille du classeur
    With Sheets(3).Range("a4")
        .Offset(2).CurrentRegion.Resize(, 15).ClearContents
        If dico.Count > 0 Then
            n = 2
            For i = 0 To dico.Count - 1
                For ii = 0 To dico.items()(i).Count - 1
                    With .Offset(n).Resize(1, UBound(dico.items()(i).items()(ii), 1) + 1)
                        .Value = dico.items()(i).items()(ii)
                    End With
                    n = n + 1
                Next
            Next
        End If
    End With
    Set dico = Nothing
    Application.ScreenUpdating = True
End Sub

On peut remplacer la dernière boucle par celle-ci :

'Restitution dans la 3eme feuille du classeur
With Sheets(3).Range("a4")
    .Offset(2).CurrentRegion.Resize(, 15).ClearContents
    If dico.Count > 0 Then
        n = 2
        For i = 0 To dico.Count - 1
            With .Offset(n).Resize(UBound(Application.Transpose(dico.items()(i).items), 2), _
                                   UBound(Application.Transpose(dico.items()(i).items), 1))
                .Value = Application.Transpose(Application.Transpose(dico.items()(i).items))
            End With
            n = n + UBound(Application.Transpose(dico.items()(i).items), 2)
        Next
    End If
End With

klin89

@Klin89: Merci ! mais ça ne fait rien..j'ai renommé mes feuilles comme dans ton code pourtant.

(..)

@Klin89

Je ne suis pas certain que D10 comprenne la notion de Dico

@D10

Peux-tu envoyer les fichiers 1 et 2 même tronqués ?

NCC 1701 a écrit :

(..)

Peux-tu envoyer les fichiers 1 et 2 même tronqués ?

Ah..je ne les ai pas ici..Voilà pourquoi j'ai du en créer un pour expliquer ce que je voulais.

(..)

Pas grave... du moment que les colonnes sont toujours aux mêmes emplacement cela me va...

c'est le cas

Rechercher des sujets similaires à "reconciliation comparaison deux fichiers"