Comparaison de 2 fichiers

Bonsoir,

J'ai besoin d'aide sur VBA (help please !!), je dois comparait 2 fichiers xls contenant tous les deux des données dont un matricule sur la colonne E pour le 1er fichier et la colonne I du second fichier.
En suite, vérifier pour chaque ligne du fichier 1 (clé = matricule) sont existence dans le fichier 2 (colonne I), en là parsant de haut vert le bas, si valeur existe au moins une fois, prendre la dernière valeur et copier la valeur de la colonne A de cette même ligne dans la colonne A du 1er fichier.

merci d'avance pour votre aide.

14 réponses

  1. Bonjour,

    Quelques questions:

    - Il y a t'il un titre dans tes colonnes E du fichier 1 et I du fichier 2 ?
    - Dans quel fichier se trouve la macro que tu veux faire ?
    - Qu'est ce qui déclenche la macro ?

    A+
    «Ce que l'on conçoit bien s'énonce clairement, Et les mots pour le dire arrivent aisément.»
    Nicolas Boileau
    1. Bonjour,

      Merci d'avance pour votre aide.

      -Les deux colonnes s'appellent Matricule dans les deux fichiers.
      -LA Macro doit être sur le fichier principal (fichier 1).
      -Le declancheur peut-être à l'ouverture du fichier prencipal ou bien dans une feuille avec un bouton.

      Merci encore.

      Martin.
      1. Re

        Copier le code ci dessous dans un module et affecter la fonction au déclancheur:

        Option Explicit
        
        '-- /!\ NE PAS OUBLIER DE COCHER LA REFERENCE Microsoft ActiveX Data Object xx Library
        
        Public Sub CompareChampMatricule()
        Dim Cn As ADODB.Connection
        Dim Rst As ADODB.Recordset
        Dim Cd As ADODB.Command
        Dim fichier As String
        Dim feuille As String
        Dim wk As Workbook
        Dim ws As Worksheet
        Dim ligne As Long
        Dim newLigne As Long
        
            '--- Initialisation ---
            Set Cn = New ADODB.Connection
            Set wk = ThisWorkbook
            Set ws = wk.Worksheets("Feuil1")  'A adapter ...
            fichier = "D:\CCM\monFichier2.xlsx"  'A adapter ...
            feuille = "Feuil1"
            ligne = 2
            '------------------
            
            '--- Connexion au fichier source ---
            With Cn
                .Provider = "Microsoft.Jet.OLEDB.4.0"
                .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" _
                    & fichier & ";Extended Properties=""Excel 12.0;HDR=YES;"""
                .Open
            End With
            '-----------------
            
            '--- Traitement -----
            While ws.Range("E" & ligne).Value <> ""
                Set Cd = New ADODB.Command
                Cd.ActiveConnection = Cn
                Set Rst = New ADODB.Recordset
                Cd.CommandText = "SELECT Matricule FROM [" & feuille & "$] WHERE Matricule = '" & ws.Range("E" & ligne).Value & "'"
                Rst.Open Cd, , adOpenKeyset, adLockOptimistic
                Rst.MoveFirst
                If Rst.RecordCount > 0 Then
                    Rst.MoveLast
                    newLigne = ws.Range("A" & Rows.Count).End(xlUp).Row
                    ws.Range("A" & newLigne + 1).CopyFromRecordset Rst
                    Set Rst = Nothing
                    Set Cd = Nothing
                    Query = ""
                End If
                ligne = ligne + 1
            Wend
            '-----------
            
            '--- Libération des objets et de la mémoire
            Set wk = Nothing
            Set ws = Nothing
            Cn.Close
            Set Cn = Nothing
            '-------------------------
            
        End Sub
        


        ;0)

        «Ce que l'on conçoit bien s'énonce clairement, Et les mots pour le dire arrivent aisément.»
        Nicolas Boileau
        1. Bonjour,

          Merci pour votre aide,

          comment faire cette action ?
          '-- /!\ NE PAS OUBLIER DE COCHER LA REFERENCE Microsoft ActiveX Data Object xx Library

          Martin
          1. Dans l'éditeur VB -> Outils -> Références ... chercher dans la liste et cocher la référence.

            ;0)
        2. Bonjour,

          Après des recherches sur le NET j'ai fini par trouvé.
          Au lancement du VBA, j'ai eu une erreur sur une variable non initialisée:

          Erreur de compilation : variable non définie :

          (ligne Query = "")

          Martin
          1. Oups !!! c'est une erreur de ma part ... tu peux suprimer cette ligne
        3. Bonjour,

          Erreur d'exécution:

          -2147217904 (80040e10)
          Erreur Automation

          je ne comprends rien !!

          Martin
          1. Bonjour,

            Je viens de faire du pas-à-pas et ça bloque à la ligne :

            Rst.MoveFirst

            Martin
            1. Tu as modifié les 2 lignes :

              Set ws = wk.Worksheets("Feuil1")  'A adapter ...
              fichier = "D:\CCM\monFichier2.xlsx"  'A adapter ...


              Assures toi de l'extension du fichier Excel ...

              «Ce que l'on conçoit bien s'énonce clairement, Et les mots pour le dire arrivent aisément.»
              Nicolas Boileau
              1. Bonjour,

                Oui j'ai bien changé les valeurs :

                    Set ws = wk.Worksheets("Suivi")  'A adapter ...
                fichier = "Liste mensuelle des effectifs en 10_13.xlsx" 'A adapter ...
                feuille = "Base mensuelle"

                Martin
                1. Bonjour,

                  Pouvez-vous l'expliquer les deux lignes suivantes SVP ?

                  newLigne = ws.Range("A" & Rows.Count).End(xlUp).Row
                              ws.Range("A" & newLigne + 1).CopyFromRecordset Rst


                  Martin
                  1. Ca permet de copier le contenu de la colonne I du fichier 2 dans la colonne A du fichier 1 ...

                    Je viens de voir que j'ai mal interperté la demande ...

                    Quel est l'entête de la colonne A dans le Fichier 2 ?

                    Il faut mettre le chemin complet ici :

                    fichier = "Liste mensuelle des effectifs en 10_13.xlsx"
                    'Par exemple : "C:\MonDossier\MonRepertoire\Liste mensuelle des effectifs en 10_13.xlsx"
                  2. Le fichier 2 est un fichier mensuel qui permettra de mettre à jour le fichier 1.
                    Exemple :

                    Dans le fichier 2 je peux avoir plusieurs lignes du même matricule (mois m-1, m-2, ...etc) et je dois parser le fichier pour prendre la valeur (colonne A) du mois m dans le fichier 1 colonne A.

                    Je mets à jour et je test

                    Marin
                2. Bonjour,

                  Pour être sûr que mon fichier 2 est bien sélectionné, j'ai modifié la ligne :

                  fichier = "C:\Users\mmeguellati\Downloads\VBA-natacha\Liste mensuelle des effectifs en 10_13.xlsx"  'A adapter ...


                  en

                  fichier = Application.GetOpenFilename("Fichiers Excels, *.xls*")


                  toujours la même erreur :

                  -2147217904 (80040e10)
                  Erreur Automation

                  Martin
                  1. l'erreur vient de cette ligne :

                      Rst.Open Cd,  ,adOpenKeyset, adLockOptimistic

                    entre Cd et la seconde virgule j'ai un vide . Est-ce normal ?

                    Martin
                    1. Faudrait-il pas ajouter Cn dans Cd,[ICI] , ?
                  2. Tu as cocher quelle référence ?

                    Et il me faudrait l'entête de la colonne A du fichier 2 !!!
                    1. J'ai mis Microsoft ActiveX Data Objects 6.1 Library;

                      l'entête de la colonne A du fichier 2 est Date_de_naissance

                      Martin
                    2. Tu as quelle version d'Excel ? J'ai 2007 et ça fonctionne chez moi. J'ignore s'il y a des modif au niveau du Provider ...

                      Remplace :
                      Cd.CommandText = "SELECT Matricule FROM [" & feuille & "$] WHERE Matricule = '" & ws.Range("E" & ligne).Value & "'"

                      Par
                      Cd.CommandText = "SELECT Date_de_naissance FROM [" & feuille & "$] WHERE Matricule = '" & ws.Range("E" & ligne).Value & "'"
                    3. J'ai la version 2010

                      toujours la même erreur !

                      Martin
                    4. Je dois faire quelque chose ? une conf à modifier ?

                      Martin
                  3. Bonjour,

                    J'essaie de faire une macro qui fait la même chose que le votre mais ça bloque :

                    Option Explicit
                    
                    Sub ImporterColonnes()
                    Dim Fichier, WbkCopy As Workbook, WbkColle As Workbook
                    Dim Colonnes(), col As Integer, Resultat As Variant
                    Dim NWbkColle As Integer, MWbkCopy As Integer, DWbkColle As Integer
                    
                    
                    
                      'On attribue à la variable WbkColle le fichier actuel (celui qui contient la macro)
                      Set WbkColle = ThisWorkbook
                      'A adapter : Nom des entêtes de colonnes à importer
                      Colonnes = Array("Matricule")
                      
                      'Sélection du fichier
                      Fichier = Application.GetOpenFilename("Fichiers Excels, *.xls*")
                      'En cas de clic sur "ANNULER"
                      If Fichier <> False Then
                        'On ouvre le fichier en question
                        Set WbkCopy = Workbooks.Open(Fichier)
                        
                        With WbkCopy.Sheets("Base mensuelle") '==> ADAPTER NOM de la feuille
                          'Boucle sur toutes les entêtes des colonnes
                          For col = 2 To .Cells(2, .Cells.Columns.Count).End(xlToLeft).Column
                            'teste si l'entête correspond à un des noms des colonnes à copier
                            Resultat = Application.Match(.Cells(2, col), Colonnes, 0)
                            'Si l'entête est trouvée (colonne à copier)
                            If Not IsError(Resultat) Then
                              'Copié - Collé ==> ADAPTER NOM de la feuille ou coller ("TRUC" à remplacer)
                              '.Columns(Col).Copy WbkColle.Sheets("COLLER").Cells(1, Cells.Columns.Count).End(xlToLeft).Offset(0, 1)
                              'impression pop-up les colonnes Matricule sont bien là
                            
                            End If ' si l'entête existe bien
                          Next col
                                
                        'rechercher avec mise-à-jour correspendance valeur
                            
                        For NWbkColle = 4 To WbkColle.Sheets("Suivi").Range("E65536").End(xlUp).Row
                        For MWbkCopy = 4 To WbkCopy.Sheets("Base mensuelle").Range("I65536").End(xlUp).Row
                        For DWbkColle = 4 To WbkColle.Sheets("Suivi").Range("M65536").End(xlUp).Row
                        
                        If InStr(WbkCopy.Sheets("Base mensuelle").Range("I" & MWbkCopy), WbkColle.Sheets("Suivi").Range("E" & NWbkColle)) <> 0 Then
                            'Copié - collé
                             WbkCopy.Sheets("Base mensuelle").Range("I" & MWbkCopy).Copy WbkColle.Sheets("Suivi").Range("M" & DWbkColle)
                        
                        End If
                       Next NWbkColle
                       Next MWbkCopy
                       Next DWbkColle
                        
                        End With
                           
                        WbkCopy.Close
                      End If
                    Set WbkCopy = Nothing
                    Set WbkColle = Nothing
                    End Sub
                    
                    


                    J'ai une erreur de compilation :

                    référence de validation de contrôle
                    1. J'ai une erreur de compilation :

                      référence de validation de contrôle incorrecte dans Next ; Next NWbkColle