VBA pour comparer les lignes de deux tableaux en fonction d'une colonne

Bonjour à tous,

Après pleins de test je vosu écrit car je ne trouve pas la solution et que peut être je pourrais bénéficier de vos lumières. Vous trouverez ci joint mon fichier ainsi que le code.

La macro compare deux feuilles dans une feuille de synthèse :

-Copie les lignes de la feuille 1 sur la feuille Synthèse si elles n'existent pas sur la feuille 2

- Si les lignes de f2 existent sur f1 on recopie sur Synthèse les ligne de f2 et on y colore les cellules différentes

-Si les lignes de f2 n'existent pas sur f1, on les recopie telles qu'elles sur Synthèse

Mon problème concerne la partie ou les écarts sont colorés sur la feuille de synthèse car elle compare les lignes une à une , or je souhaiterai que celle ci compare les lignes en fonction de l'ID en colonne "K" mais je ne trouve pas comment faire .... :(

Merci de m'avoir lu , à votre dispo pour tout renseignement complémentaire
!

Bonne journée

A.

Option Explicit

Dim u, v, I, j, dico1, dico2, lgn

Sub Synthèse()

   Dim Cel As Range

    Sheets("Synthèse").Range("A1").CurrentRegion.Offset(1, 0).Interior.Color = xlNone
    Sheets("Synthèse").Range("A1").CurrentRegion.Offset(1, 0).ClearContents
    Application.ScreenUpdating = False

    u = Sheets("PDC").Range("A2:CF" & Sheets("PDC").Range("A" & Rows.Count).End(xlUp).Row)
    v = Sheets("PDC_en cours").Range("A2:CF" & Sheets("PDC_en cours").Range("A" & Rows.Count).End(xlUp).Row)

    Set dico1 = CreateObject("Scripting.Dictionary")
    Set dico2 = CreateObject("Scripting.Dictionary")

    For I = 1 To UBound(u, 1)
        dico1(u(I, 11)) = I
    Next I

    For I = 1 To UBound(v, 1)
        dico2(v(I, 11)) = ""
    Next I

    For I = 1 To UBound(u, 1)
        'on recopie les ligns de la feuille 1 sur la feuille Synthèse si elles n'existent pas sur la feuille 2
        If dico2.exists(u(I, 11)) = False Then
            lgn = Sheets("Synthèse").Range("A" & Rows.Count).End(xlUp)(2).Row
            For j = 1 To UBound(u, 2)
                Sheets("Synthèse").Cells(lgn, j) = u(I, j)
            Next j
        End If
    Next I

    For I = 1 To UBound(v, 1)
        lgn = Sheets("Synthèse").Range("A" & Rows.Count).End(xlUp)(2).Row
        If dico1.exists(v(I, 11)) Then

            'Si les lignes de f2 existent sur f1 on recopie sur Synthèse les ligne de f2 et on y colore les cellules différentes
            For j = 1 To UBound(v, 2)
                Sheets("Synthèse").Cells(lgn, j) = v(I, j)
                If u(I, j) <> v(I, j) Then
                    Sheets("Synthèse").Cells(lgn, j).Interior.Color = RGB(255, 255, 0)
                End If
            Next j

        Else
            'Si les lignes de f2 n'existent pas sur f1, on les recopie telles qu'elles sur Synthèse
             For j = 1 To UBound(v, 2)
                Sheets("Synthèse").Cells(lgn, j) = v(I, j)
            Next j

        End If
          Next I

End Sub
19pdc-test-v7.xlsm (62.75 Ko)

Bonjour Anais83, le forum,

Mon problème concerne la partie ou les écarts sont colorés sur la feuille de synthèse car elle compare les lignes une à une , or je souhaiterai que celle ci compare les lignes en fonction de l'ID en colonne "K" mais je ne trouve pas comment faire .... :(

Peut-être ainsi, en remplaçant j par 11 :

If u(I, 11) <> v(I, 11) Then

Cordialement,

Bonjour Xorsankukai,

Merci beaucoup pour ton aide, je viens d'essayer mais malheureusement ça ne fonctionne pas , elle colore 3 lignes identiques et plus les écarts :(

13pdc-test-v8.xlsm (62.75 Ko)
'Si les lignes de f2 existent sur f1 on recopie sur Synthèse les ligne de f2 et on y colore les cellules différentes

            For j = 1 To UBound(v, 2)
                Sheets("Synthèse").Cells(lgn, j) = v(I, j)
                If u(I, 11) <> v(I, 11) Then
                    Sheets("Synthèse").Cells(lgn, j).Interior.Color = RGB(255, 255, 0)
                End If
            Next j
 

Bonjour

Une proposition avec PowerQuery (intégré à Excel 2016 et +, en add on sur 2010)

A priori aucune différence en dehors de ID35 et ID40 qui ne figurent chacun que dans une table

Le tableau résultat contient des colonnes supplémentaires indiquant la présence d'écart et alimentant les MFC.

On pourrait les mettre sur un autre onglet...

15compare-pq.xlsx (99.96 Ko)

Bonjour,

@78chris, merci pour ton aide, je ne pense pas à utiliser puisque je ne maitrise pas bien mais c'est une bonne idée ! :)

Avec l'aide d'autres personnes j'ai résolu mon pb je vous communique la macro qui fonctionne si ça peut aider quelqu'un !

Option Explicit

Sub Synthèse()
    Dim u, v, Cel As Range
    Dim dico1 As Object, dico2 As Object
    Dim i As Long, j As Long, lgn As Long, k As Long

    Sheets("Synthèse").Select
    Range("A2:CF" & Rows.Count).Clear
    Application.ScreenUpdating = False
    u = Sheets("PDC").Range("A2:CF" & Sheets("PDC").Range("A" & Rows.Count).End(xlUp).Row)
    v = Sheets("PDC_en cours").Range("A2:CF" & Sheets("PDC_en cours").Range("A" & Rows.Count).End(xlUp).Row)

    Set dico1 = CreateObject("Scripting.Dictionary")
    For i = 1 To UBound(u, 1)
        dico1(u(i, 11)) = i
    Next i

    Set dico2 = CreateObject("Scripting.Dictionary")
    For i = 1 To UBound(v, 1)
        dico2(v(i, 11)) = i
    Next i

    lgn = 1
    For i = 1 To UBound(u, 1)
        'recopie les lignes de la feuille 1 sur la feuille Synthèse si elles n'existent pas sur la feuille 2
        If dico2.exists(u(i, 11)) = False Then
            Debug.Print "Ajout de 1: " & u(i, 11)
            lgn = lgn + 1
            For j = 1 To UBound(u, 2)
                Sheets("Synthèse").Cells(lgn, j) = u(i, j)
            Next j
        End If
    Next i

    For i = 1 To UBound(v, 1)
        If v(i, 11) <> "" Then  '--- contient un ID
            lgn = lgn + 1
            If dico1.exists(v(i, 11)) Then
                k = dico1(v(i, 11)) '--- n° ligne dans feuil1
                Debug.Print u(k, 11) & "<>" & v(i, 11), dico1(v(i, 11)) & "<>" & dico2(v(i, 11))
                'Si les lignes de f2 existent sur f1 on recopie sur Synthèse les ligne de f2 et on y colore les cellules différentes
                For j = 1 To UBound(v, 2)
                    Sheets("Synthèse").Cells(lgn, j) = v(i, j)
                    If u(k, j) <> v(i, j) Then
                        Debug.Print "-- " & u(k, j) & " --> " & v(i, j)
                        Sheets("Synthèse").Cells(lgn, j).Interior.Color = RGB(255, 255, 0)
                    End If
                Next j
            Else
                'Si les lignes de f2 n'existent pas sur f1, on les recopie telles qu'elles sur Synthèse
                Debug.Print "Ajout de 2: " & v(i, 11)
                For j = 1 To UBound(v, 2)
                    Sheets("Synthèse").Cells(lgn, j) = v(i, j)
                Next j
            End If
        End If
    Next i
    Application.ScreenUpdating = True
End Sub

Bonne journée !

A.

Rechercher des sujets similaires à "vba comparer lignes deux tableaux fonction colonne"