Comparaison de deux cfeuilles Excel

Bonjour,

Tout d'abord un grand merci pour vos aides et vos réponses très détaillées. Je vous suis très reconnaissant pour ce que vous avez fait. J'aurai une dernière question concernant ton code h2so4:

Pourquoi seules les premières lignes affichent la ligne à laquelle une différence est trouvée? Est-il possible d'afficher toutes les lignes des erreurs trouvées par la macro?

Très cordialement

capture

bonjour,

ajout du numéro de ligne pour les lignes présentes dans un fichier et absentes dans l'autre.

Option Explicit
Private Sub cmdAnalyse_Click()
    Dim strRepFicA As String, strRepFicB As String
    Dim wbFicA As Workbook, wbFicB As Workbook, wbFicAna As Workbook
    Dim wsFicA As Worksheet, wsFicB As Worksheet, wsFicAna As Worksheet
    Dim lgLig As Long, lgCol As Long, lgLigB As Long, lgColB As Long
    Dim lgLigDeb As Long
    Dim dicoA, dicoB
    Dim key
    Dim dla, dlb

    ' Répertoire et Fichier
   strRepFicA = Application.GetOpenFilename
    strRepFicB = Application.GetOpenFilename

    ' Classeur d'analyse
   Set wbFicAna = ThisWorkbook
    Set wsFicAna = wbFicAna.ActiveSheet

    ' Vérifier que les fichiers A et B se trouvent dans le répertoire
   If Dir(strRepFicA) = "" Or Dir(strRepFicB) = "" Then
        MsgBox "Le fichier A et/ou le fichier B sont introuvables", vbCritical + vbOKOnly, "Problème de fichiers..."
        Exit Sub
    End If

    Application.ScreenUpdating = False

    ' Ouverture du fichier A et définition de la feuille de traitement
   Set wbFicA = Workbooks.Open(Filename:=strRepFicA)
    Set wsFicA = wbFicA.Worksheets("A")

    ' Ouverture du fichier B et définition de la feuille de traitement
   Set wbFicB = Workbooks.Open(Filename:=strRepFicB)
    Set wsFicB = wbFicB.Worksheets("A")

    ' Vider les lignes du fichier d'analyse
   wsFicAna.Range("A2:BN" & Cells.Rows.Count).ClearContents

    ' Première ligne d'affichage des résultats dans le fichier d'analyse
   lgLigDeb = 10 - 1

    ' Traitement des lignes des 2 fichiers
   Set dicoA = CreateObject("scripting.dictionary")
    Set dicoB = CreateObject("scripting.dictionary")
    ' on crée une entrée dans le dictionnaire pour chaque ligne unique de B
   dla = wsFicA.Cells(Rows.Count, 1).End(xlUp).Row
    dlb = wsFicB.Cells(Rows.Count, 1).End(xlUp).Row
    For lgLig = 2 To dlb
        ' on construit la clé du dictionnaire en faisant parcourir à la boucle toutes les colonnes du 2eme fichier de A à BN
       key = ""
        For lgCol = 1 To 67
            key = key & wsFicB.Cells(lgLig, lgCol)
        Next lgCol
        ' si la clé n'existe pas on la sauve
       If key <> "" Then
            If Not dicoB.exists(key) Then
                dicoB.Add key, lgLig
            Else    'doublon détecté dans B
               lgLigDeb = lgLigDeb + 1
                lgLigB = dicoB.Item(key)
                wsFicAna.Range("A" & lgLigDeb).Value = wbFicB.Name & " ligne " & lgLigB & "/" & lgLig
                ' Copier la ligne du fichier B dans le fichier d'analyse
               wsFicB.Range("A" & lgLigB & ":" & "BO" & lgLigB).Copy
                wsFicAna.Range("B" & lgLigDeb).PasteSpecial xlPasteValues
            End If
        End If
    Next lgLig
    ' on crée une entrée dans le dictionnaire pour chaque ligne unique de A
   ' on regarde si la ligne existe dans B, via le dictionnaire B
   For lgLig = 2 To dla
        ' on construit la clé du dictionnaire en faisant parcourir à la boucle toutes les colonnes du 1er fichier de A à BN
       key = ""
        For lgCol = 1 To 67
            key = key & wsFicA.Cells(lgLig, lgCol)
        Next lgCol
        If key <> "" Then
            If Not dicoA.exists(key) Then
                dicoA.Add key, lgLig
            Else    'doublon détecté dans A
               lgLigDeb = lgLigDeb + 1
                lgLigB = dicoA.Item(key)
                wsFicAna.Range("A" & lgLigDeb).Value = wbFicA.Name & " ligne " & lgLigB & "/" & lgLig
                ' Copier la ligne du fichier B dans le fichier d'analyse
               wsFicA.Range("A" & lgLigB & ":" & "BO" & lgLigB).Copy
                wsFicAna.Range("B" & lgLigDeb).PasteSpecial xlPasteValues
            End If

            If Not dicoB.exists(key) Then    'ligne de A n'existe pas dans B
               lgLigDeb = lgLigDeb + 1
                wsFicAna.Range("A" & lgLigDeb).Value = wbFicA.Name & " ligne " & lgLig
                ' Copier la ligne du fichier A dans le fichier d'analyse
               wsFicA.Range("A" & lgLig & ":" & "BO" & lgLig).Copy
                wsFicAna.Range("B" & lgLigDeb).PasteSpecial xlPasteValues
            End If
        End If
    Next lgLig
    For Each key In dicoB.keys    'on vérifie si les lignes de B existent dans A via le dictionnaire
       If Not dicoA.exists(key) Then    'ligne de B n'existe pas dans A
           ' Affichage du nom du fichier en colonne A
           lgLigDeb = lgLigDeb + 1
            wsFicAna.Range("A" & lgLigDeb).Value = wbFicB.Name & " ligne " & dicoB.Item(key)
            ' Copier la ligne du fichier B dans le fichier d'analyse
           lgLigB = dicoB.Item(key)
            wsFicB.Range("A" & lgLigB & ":" & "BO" & lgLigB).Copy
            wsFicAna.Range("B" & lgLigDeb).PasteSpecial xlPasteValues
        End If

    Next key

    ' Fermer les fichiers A et B
   wbFicA.Close savechanges:=False
    wbFicB.Close savechanges:=False

    MsgBox "Traitement terminé"

    Application.ScreenUpdating = True
End Sub

C'est parfait! je te remercie énormément pour le temps que tu as passé sur cette macro.

Bien cordialement

Rechercher des sujets similaires à "comparaison deux cfeuilles"