Comparaison de 2 tableaux

[Résolu/Fermé]
Signaler
Messages postés
850
Date d'inscription
vendredi 13 février 2015
Statut
Membre
Dernière intervention
15 février 2019
-
Messages postés
850
Date d'inscription
vendredi 13 février 2015
Statut
Membre
Dernière intervention
15 février 2019
-
Bonjour,

Je souhaite comparer 2 tableaux, 1 sur la feuille 1 et 1 sur la feuille 2. Sachant que pour pouvoir comparer les lignes comme je le veux, j'ai besoin de comparer les colonnes C, E et J des 2 tableaux.

Voici mon code :

[/contents/446-fichier-sub Sub] COMPARATIF()
Dim DLig As Long
Dim DLig2 As Long
Dim DLig3 As Long
Dim DLig4 As Long
Dim DLig5 As Long
Dim DLig6 As Long
DLig = Sheets(1).Range("C5").End(xlDown).Row
DLig2 = Sheets(1).Range("E5").End(xlDown).Row
DLig3 = Sheets(1).Range("J5").End(xlDown).Row
DLig4 = Sheets(2).Range("C5").End(xlDown).Row
DLig5 = Sheets(2).Range("E5").End(xlDown).Row
DLig6 = Sheets(2).Range("J5").End(xlDown).Row
x = 3
'boucle sur les lignes de Feuil2
For t = 5 To DLig4
For u = 5 To DLig5
For v = 5 To DLig6
If Application.WorksheetFunction.CountIf(Sheets(1).Range("C:C"), Sheets(2).Range("C" & t)) = 0 And Application.WorksheetFunction.CountIf(Sheets(1).Range("E:E"), Sheets(2).Range("E" & u)) = 0 And Application.WorksheetFunction.CountIf(Sheets(1).Range("J:J"), Sheets(2).Range("J" & v)) Then
        x = x + 1
   For k = 1 To 10
        Sheets(4).Cells(x, k) = Sheets(2).Cells(t, k)
        Next
        Sheets(4).Range("K" & x) = "La référence n'est pas dans le tableau 1"
    End If
Next t
Next u
Next v

'boucle sur les lignes de Feuil1
For t = 5 To DLig
For u = 5 To DLig2
For v = 5 To DLig3
If Application.WorksheetFunction.CountIf(Sheets(2).Range("C:C"), Sheets(1).Range("C" & t)) = 0 And Application.WorksheetFunction.CountIf(Sheets(2).Range("E:E"), Sheets(1).Range("E" & u)) = 0 And Application.WorksheetFunction.CountIf(Sheets(2).Range("J:J"), Sheets(1).Range("J" & v)) = 0 Then
    x = x + 1
  For k = 1 To 10
        Sheets(4).Cells(x, k) = Sheets(2).Cells(t, k)
        Next
        Sheets(4).Range("K" & x) = "La référence n'est pas dans le tableau 2"
    End If
Next t
Next u
Next v
End Sub


De plus, le code ici ne fait que copier les lignes différentes sur une nouvelle feuille. En fait, j'aurais besoin que si la ligne est dans le tableau 1 et pas dans le tableau 2, la ligne en question soit créée sur le tableau 2. Si la ligne appartient au tableau 2 et pas au tableau 1, il faudrait que la ligne soit supprimée dans le tableau 2.
Si les lignes sont les mêmes, il ne faut rien faire.

Pour information, le tableau 1 est en fait amené à être modifié constamment donc aucune action n'est à prévoir dessus.

Merci d'avance de vous pencher sur mon problème.

Cordialement,

11 réponses

Messages postés
1412
Date d'inscription
mardi 21 octobre 2014
Statut
Membre
Dernière intervention
9 mars 2021
153
Bonjour kuartz, bonjour le forum,

Peut-être comme ça :
Sub COMPARATIF2()
Dim O1 As Worksheet 'déclare la variable O1 (Onglet 1)
Dim O2 As Worksheet 'déclare la variable O1 (Onglet 1)
Dim TC1 As Variant 'déclare la variable TC1 (Tableau de Cellules 1)
Dim TC2 As Variant 'déclare la variable TC2 (Tableau de Cellules 2)
Dim I As Integer 'déclare la variable I (Incrément)
Dim J As Integer 'déclare la variable J (incrément)
Dim TEST As Boolean 'déclare la variable TEST
Dim DEST As Range 'déclare la variable DEST (cellule de DESTination)
Dim TL() As Variant 'déclare la variable TL (Tableau de Lignes)
Dim T1 As String 'déclare la variable T1 (Texte 1)
Dim T2 As String 'déclare la variable T2 (Texte 2)
Dim K As Integer 'déclare la variable K (incrément)

'*********************************************************************************
'copie les lignes du tableau 1 dans le tableau 2 (si manquantes dans le tableau 2)
'*********************************************************************************

Set O1 = Sheets("Feuil1") 'définit l'onglet O1 (à adapter)
Set O2 = Sheets("Feuil2") 'définit l'onglet O2 (à adapter)
TC1 = O1.Range("A5").CurrentRegion 'définit le tableau de cellules TC1 (à adapter)
TC2 = O2.Range("A5").CurrentRegion 'définit le tableau de cellules TC2 (à adapter)
For I = 1 To UBound(TC1, 1) 'boucle 1 : sur toutes les lignes I du tableau de cellules TC1
    TEST = False 'définit la variable TEST
    T1 = CStr(TC1(I, 3)) & "/" & CStr(TC1(I, 5)) & "/" & CStr(TC1(I, 10)) 'définit le texte T1 (concatenation des cellules colonnes 3, 5 et 10 = C, E et J)
    For J = 1 To UBound(TC2, 1) 'boucle 2 : sour toutes les lignes J du tableau de cellules TC2
        T2 = CStr(TC2(J, 3)) & "/" & CStr(TC2(J, 5)) & "/" & CStr(TC2(J, 10)) 'définit le texte T2 (concaténation des cellules colonnes 3, 5 et 10 = C, E et J)
        If T1 = T2 Then TEST = True: Exit For 'si T1 est égal à T2, TEST devient [Vrai], sort de la boucle 2
    Next J 'prochaine ligne de la boucle 2
    If TEST = False Then 'condition : si TEST est [FAUX]
        Set DEST = O2.Cells(Application.Rows.Count, 1).End(xlUp).Offset(1, 0) 'définit la cellule de destination (première ligne vide du tableau TC2)
        DEST.Resize(1, UBound(TC1, 2)) = Application.Index(TC1, I) 'récupère la ligne du tabelau TC1 dans DEST
    End If 'fin de la condition
Next I 'prochaine ligne de la boucle 1

'****************************************************************
'efface les lignes du tableau 2 (si manquantes dans le tableau 1)
'****************************************************************

For I = 1 To UBound(TC2, 1) 'boucle 1 : sur toutes les lignes I du tableau de cellules TC2
    TEST = False 'définit la variable TEST
    T2 = CStr(TC2(I, 3)) & "/" & CStr(TC2(I, 5)) & "/" & CStr(TC2(I, 10)) 'définit le texte T2 (concaténation des cellules colonnes 3, 5 et 10 = C, E et J)
    For J = 1 To UBound(TC1, 1) 'boucle 2 : sour toutes les lignes J du tableau de cellules TC1
        T1 = CStr(TC1(J, 3)) & "/" & CStr(TC1(J, 5)) & "/" & CStr(TC1(J, 10)) 'définit le texte T1 (concatenation des cellules colonnes 3, 5 et 10 = C, E et J)
        If T2 = T1 Then TEST = True: Exit For 'si T2 est égal à T1, TEST devient [Vrai], sort de la boucle 2
    Next J 'prochaine ligne de la boucle 2
    If TEST = False Then 'condition : si TEST est [FAUX]
        ReDim Preserve TL(K) 'redimensionne le tableau TL
        TL(K) = I + 4 'récupère dans TL(K) le numéro de la ligne
        K = K + 1 'incrémente K
    End If 'fin de la condition
Next I 'prochaine ligne de la boucle 1
For I = UBound(TL) To LBound(TL) Step -1 'boucle inversé de la dernière valeur du tableau TL à la première
    O2.Rows(TL(I)).Delete 'efface la ligne TL(I)
Next I 'prochaine valeur de la boucle
End Sub

Messages postés
850
Date d'inscription
vendredi 13 février 2015
Statut
Membre
Dernière intervention
15 février 2019
50
Wow, joli code.

Merci beaucoup.

Par contre, à la ligne "ERREUR", Excel me dit : "L'indice n'appartient pas à la sélection"

Sub COMPARATIF2()
Dim O1 As Worksheet 'déclare la variable O1 (Onglet 1)
Dim O2 As Worksheet 'déclare la variable O2 (Onglet 2)
Dim TC1 As Variant 'déclare la variable TC1 (Tableau de Cellules 1)
Dim TC2 As Variant 'déclare la variable TC2 (Tableau de Cellules 2)
Dim I As Integer 'déclare la variable I (Incrément)
Dim J As Integer 'déclare la variable J (incrément)
Dim TEST As Boolean 'déclare la variable TEST
Dim DEST As Range 'déclare la variable DEST (cellule de DESTination)
Dim TL() As Variant 'déclare la variable TL (Tableau de Lignes)
Dim T1 As String 'déclare la variable T1 (Texte 1)
Dim T2 As String 'déclare la variable T2 (Texte 2)
Dim K As Integer 'déclare la variable K (incrément)

'*********************************************************************************
'copie les lignes du tableau 1 dans le tableau 2 (si manquantes dans le tableau 2)
'*********************************************************************************

Set O1 = Sheets(1) 'définit l'onglet O1 (à adapter)
Set O2 = Sheets(2) 'définit l'onglet O2 (à adapter)
TC1 = O1.Range("A2").CurrentRegion 'définit le tableau de cellules TC1 (à adapter)
TC2 = O2.Range("A5").CurrentRegion 'définit le tableau de cellules TC2 (à adapter)
For I = 1 To UBound(TC1, 1) 'boucle 1 : sur toutes les lignes I du tableau de cellules TC1
    TEST = False 'définit la variable TEST
    T1 = CStr(TC1(I, 3)) & "/" & CStr(TC1(I, 5)) & "/" & CStr(TC1(I, 10)) 'définit le texte T1 (concatenation des cellules colonnes 3, 5 et 10 = C, E et J)
    For J = 1 To UBound(TC2, 1) 'boucle 2 : sour toutes les lignes J du tableau de cellules TC2
    "ERREUR" T2 = CStr(TC2(J, 3)) & "/" & CStr(TC2(J, 5)) & "/" & CStr(TC2(J, 10)) 'définit le texte T2 (concaténation des cellules colonnes 3, 5 et 10 = C, E et J)
        If T1 = T2 Then TEST = True: Exit For 'si T1 est égal à T2, TEST devient [Vrai], sort de la boucle 2
    Next J 'prochaine ligne de la boucle 2
    If TEST = False Then 'condition : si TEST est [FAUX]
        Set DEST = O2.Cells(Application.Rows.Count, 1).End(xlUp).Offset(1, 0) 'définit la cellule de destination (première ligne vide du tableau TC2)
        DEST.Resize(1, UBound(TC1, 2)) = Application.Index(TC1, I) 'récupère la ligne du tabelau TC1 dans DEST
    End If 'fin de la condition
Next I 'prochaine ligne de la boucle 1

'****************************************************************
'efface les lignes du tableau 2 (si manquantes dans le tableau 1)
'****************************************************************

For I = 1 To UBound(TC2, 1) 'boucle 1 : sur toutes les lignes I du tableau de cellules TC2
    TEST = False 'définit la variable TEST
    T2 = CStr(TC2(I, 3)) & "/" & CStr(TC2(I, 5)) & "/" & CStr(TC2(I, 10)) 'définit le texte T2 (concaténation des cellules colonnes 3, 5 et 10 = C, E et J)
    For J = 1 To UBound(TC1, 1) 'boucle 2 : sour toutes les lignes J du tableau de cellules TC1
        T1 = CStr(TC1(J, 3)) & "/" & CStr(TC1(J, 5)) & "/" & CStr(TC1(J, 10)) 'définit le texte T1 (concatenation des cellules colonnes 3, 5 et 10 = C, E et J)
        If T2 = T1 Then TEST = True: Exit For 'si T2 est égal à T1, TEST devient [Vrai], sort de la boucle 2
    Next J 'prochaine ligne de la boucle 2
    If TEST = False Then 'condition : si TEST est [FAUX]
        ReDim Preserve TL(K) 'redimensionne le tableau TL
        TL(K) = I + 4 'récupère dans TL(K) le numéro de la ligne
        K = K + 1 'incrémente K
    End If 'fin de la condition
Next I 'prochaine ligne de la boucle 1
For I = UBound(TL) To LBound(TL) Step -1 'boucle inversé de la dernière valeur du tableau TL à la première
    O2.Rows(TL(I)).Delete 'efface la ligne TL(I)
Next I 'prochaine valeur de la boucle
End Sub


Merci d'avance.

Cordialement.
Messages postés
850
Date d'inscription
vendredi 13 février 2015
Statut
Membre
Dernière intervention
15 février 2019
50
Je crois que j'ai trouvé, c'est le CurrentRegion le problème, ca ne prend pas tout le tableau de la feuille 2, y aurait-il un autre moyen de sélectionner ce tableau?
Messages postés
1412
Date d'inscription
mardi 21 octobre 2014
Statut
Membre
Dernière intervention
9 mars 2021
153
Bonjour Kuartz, bonjour le forum,

Il y a une autre erreur... Il faut rajouter une condition à la fin :
If K > 0 Then 'condition : si K est supérieur à zéro
    For I = UBound(TL) To LBound(TL) Step -1 'boucle inversé de la dernière valeur du tableau TL à la première
        O2.Rows(TL(I)).Delete 'efface la ligne TL(I)
    Next I 'prochaine valeur de la boucle
End If 'fin de la condition


Oui, on peut définir le tableau de cellules différemment mais il faudrait que tu expliques où ils se trouvent respectivement dans leur onglet...
Messages postés
850
Date d'inscription
vendredi 13 février 2015
Statut
Membre
Dernière intervention
15 février 2019
50
Le tableau 1 de la feuille 1 part de A4 jusqu'à J4 jusqu'à la fin de la feuille excel.

Le tableau 2 de la feuille 2 part de A5 jusqu'à J5 jusqu'à la fin de la feuille excel.

J'ai rajouté ton bout de code ici, c'est bien ça?

Sub COMPARATIF2()
Dim O1 As Worksheet 'déclare la variable O1 (Onglet 1)
Dim O2 As Worksheet 'déclare la variable O2 (Onglet 2)
Dim TC1 As Variant 'déclare la variable TC1 (Tableau de Cellules 1)
Dim TC2 As Variant 'déclare la variable TC2 (Tableau de Cellules 2)
Dim I As Integer 'déclare la variable I (Incrément)
Dim J As Integer 'déclare la variable J (incrément)
Dim TEST As Boolean 'déclare la variable TEST
Dim DEST As Range 'déclare la variable DEST (cellule de DESTination)
Dim TL() As Variant 'déclare la variable TL (Tableau de Lignes)
Dim T1 As String 'déclare la variable T1 (Texte 1)
Dim T2 As String 'déclare la variable T2 (Texte 2)
Dim K As Integer 'déclare la variable K (incrément)

'*********************************************************************************
'copie les lignes du tableau 1 dans le tableau 2 (si manquantes dans le tableau 2)
'*********************************************************************************

Set O1 = Sheets(1) 'définit l'onglet O1 (à adapter)
Set O2 = Sheets(2) 'définit l'onglet O2 (à adapter)
TC1 = O1.Range("A2").CurrentRegion 'définit le tableau de cellules TC1 (à adapter)
TC2 = O2.Range("A5:J5").End(xlDown) 'définit le tableau de cellules TC2 (à adapter)
For I = 1 To UBound(TC1, 1) 'boucle 1 : sur toutes les lignes I du tableau de cellules TC1
    TEST = False 'définit la variable TEST
    T1 = CStr(TC1(I, 3)) & "/" & CStr(TC1(I, 5)) & "/" & CStr(TC1(I, 10)) 'définit le texte T1 (concatenation des cellules colonnes 3, 5 et 10 = C, E et J)
    "ERREUR" For J = 1 To UBound(TC2, 1) 'boucle 2 : pour toutes les lignes J du tableau de cellules TC2
        T2 = CStr(TC2(J, 3)) & "/" & CStr(TC2(J, 5)) & "/" & CStr(TC2(J, 10)) 'définit le texte T2 (concaténation des cellules colonnes 3, 5 et 10 = C, E et J)
        If T1 = T2 Then TEST = True: Exit For 'si T1 est égal à T2, TEST devient [Vrai], sort de la boucle 2
    Next J 'prochaine ligne de la boucle 2
    If TEST = False Then 'condition : si TEST est [FAUX]
        Set DEST = O2.Cells(Application.Rows.Count, 1).End(xlUp).Offset(1, 0) 'définit la cellule de destination (première ligne vide du tableau TC2)
        DEST.Resize(1, UBound(TC1, 2)) = Application.Index(TC1, I) 'récupère la ligne du tabelau TC1 dans DEST
    End If 'fin de la condition
Next I 'prochaine ligne de la boucle 1

'****************************************************************
'efface les lignes du tableau 2 (si manquantes dans le tableau 1)
'****************************************************************

For I = 1 To UBound(TC2, 1) 'boucle 1 : sur toutes les lignes I du tableau de cellules TC2
    TEST = False 'définit la variable TEST
    T2 = CStr(TC2(I, 3)) & "/" & CStr(TC2(I, 5)) & "/" & CStr(TC2(I, 10)) 'définit le texte T2 (concaténation des cellules colonnes 3, 5 et 10 = C, E et J)
    For J = 1 To UBound(TC1, 1) 'boucle 2 : sour toutes les lignes J du tableau de cellules TC1
        T1 = CStr(TC1(J, 3)) & "/" & CStr(TC1(J, 5)) & "/" & CStr(TC1(J, 10)) 'définit le texte T1 (concatenation des cellules colonnes 3, 5 et 10 = C, E et J)
        If T2 = T1 Then TEST = True: Exit For 'si T2 est égal à T1, TEST devient [Vrai], sort de la boucle 2
    Next J 'prochaine ligne de la boucle 2
    If TEST = False Then 'condition : si TEST est [FAUX]
        ReDim Preserve TL(K) 'redimensionne le tableau TL
        TL(K) = I + 4 'récupère dans TL(K) le numéro de la ligne
        K = K + 1 'incrémente K
    End If 'fin de la condition
Next I 'prochaine ligne de la boucle 1
If K > 0 Then 'condition : si K est supérieur à zéro
    For I = UBound(TL) To LBound(TL) Step -1 'boucle inversé de la dernière valeur du tableau TL à la première
        O2.Rows(TL(I)).Delete 'efface la ligne TL(I)
    Next I 'prochaine valeur de la boucle
End If 'fin de la condition
End Sub


J'ai également changé la manière de définir le tableau de la feuille 2. Cela te paraît-il correct?

Une nouvelle erreur apparaît à la ligne "ERREUR". Il s'agit d'une incompatibilité de type.

Cordialement.
Messages postés
1412
Date d'inscription
mardi 21 octobre 2014
Statut
Membre
Dernière intervention
9 mars 2021
153
Bonjour Kuartz, bonjour le forum,

J'ai modifié le type pour les variables I, J et K. J'ai modifié la manière de définir les deux tableaux au cas où une il y aurait une ligne vide au milieu. Ça devrait fonctionner. Sinon, il faudra bien que tu te décides à mettre le fichier exemple, on va pas y passer la journée...

Sub COMPARATIF2()
Dim O1 As Worksheet 'déclare la variable O1 (Onglet 1)
Dim O2 As Worksheet 'déclare la variable O2 (Onglet 2)
Dim TC1 As Variant 'déclare la variable TC1 (Tableau de Cellules 1)
Dim TC2 As Variant 'déclare la variable TC2 (Tableau de Cellules 2)
Dim I As Long 'déclare la variable I (Incrément)
Dim J As Long 'déclare la variable J (incrément)
Dim TEST As Boolean 'déclare la variable TEST
Dim DEST As Range 'déclare la variable DEST (cellule de DESTination)
Dim TL() As Variant 'déclare la variable TL (Tableau de Lignes)
Dim T1 As String 'déclare la variable T1 (Texte 1)
Dim T2 As String 'déclare la variable T2 (Texte 2)
Dim K As Long 'déclare la variable K (incrément)

'*********************************************************************************
'copie les lignes du tableau 1 dans le tableau 2 (si manquantes dans le tableau 2)
'*********************************************************************************

Set O1 = Sheets(1) 'définit l'onglet O1 (à adapter)
Set O2 = Sheets(2) 'définit l'onglet O2 (à adapter)
TC1 = O1.Range("A4:J" & O1.Cells(Application.Rows.Count, 1).End(xlUp).Row) 'définit le tableau de cellules TC1 (à adapter, j'ai pris la colonne 1 comme référence pour la derniere ligne)
TC2 = O2.Range("A5:J" & O2.Cells(Application.Rows.Count, 1).End(xlUp).Row) 'définit le tableau de cellules TC2 (à adapter, j'ai pris la colonne 1 comme référence pour la derniere ligne)
For I = 1 To UBound(TC1, 1) 'boucle 1 : sur toutes les lignes I du tableau de cellules TC1
    TEST = False 'définit la variable TEST
    T1 = CStr(TC1(I, 3)) & "/" & CStr(TC1(I, 5)) & "/" & CStr(TC1(I, 10)) 'définit le texte T1 (concatenation des cellules colonnes 3, 5 et 10 = C, E et J)
    For J = 1 To UBound(TC2, 1) 'boucle 2 : pour toutes les lignes J du tableau de cellules TC2
        T2 = CStr(TC2(J, 3)) & "/" & CStr(TC2(J, 5)) & "/" & CStr(TC2(J, 10)) 'définit le texte T2 (concaténation des cellules colonnes 3, 5 et 10 = C, E et J)
        If T1 = T2 Then TEST = True: Exit For 'si T1 est égal à T2, TEST devient [Vrai], sort de la boucle 2
    Next J 'prochaine ligne de la boucle 2
    If TEST = False Then 'condition : si TEST est [FAUX]
        Set DEST = O2.Cells(Application.Rows.Count, 1).End(xlUp).Offset(1, 0) 'définit la cellule de destination (première ligne vide du tableau TC2)
        DEST.Resize(1, UBound(TC1, 2)) = Application.Index(TC1, I) 'récupère la ligne du tabelau TC1 dans DEST
    End If 'fin de la condition
Next I 'prochaine ligne de la boucle 1

'****************************************************************
'efface les lignes du tableau 2 (si manquantes dans le tableau 1)
'****************************************************************

For I = 1 To UBound(TC2, 1) 'boucle 1 : sur toutes les lignes I du tableau de cellules TC2
    TEST = False 'définit la variable TEST
    T2 = CStr(TC2(I, 3)) & "/" & CStr(TC2(I, 5)) & "/" & CStr(TC2(I, 10)) 'définit le texte T2 (concaténation des cellules colonnes 3, 5 et 10 = C, E et J)
    For J = 1 To UBound(TC1, 1) 'boucle 2 : sour toutes les lignes J du tableau de cellules TC1
        T1 = CStr(TC1(J, 3)) & "/" & CStr(TC1(J, 5)) & "/" & CStr(TC1(J, 10)) 'définit le texte T1 (concatenation des cellules colonnes 3, 5 et 10 = C, E et J)
        If T2 = T1 Then TEST = True: Exit For 'si T2 est égal à T1, TEST devient [Vrai], sort de la boucle 2
    Next J 'prochaine ligne de la boucle 2
    If TEST = False Then 'condition : si TEST est [FAUX]
        ReDim Preserve TL(K) 'redimensionne le tableau TL
        TL(K) = I + 4 'récupère dans TL(K) le numéro de la ligne
        K = K + 1 'incrémente K
    End If 'fin de la condition
Next I 'prochaine ligne de la boucle 1
If K > 0 Then 'condition : si K est supérieur à zéro
    For I = UBound(TL) To LBound(TL) Step -1 'boucle inversé de la dernière valeur du tableau TL à la première
        O2.Rows(TL(I)).Delete 'efface la ligne TL(I)
    Next I 'prochaine valeur de la boucle
End If 'fin de la condition
End Sub

Messages postés
850
Date d'inscription
vendredi 13 février 2015
Statut
Membre
Dernière intervention
15 février 2019
50
Je comprend qu'il serait mieux de mettre directement mon fichier ici. Le problème étant que le rendre anonyme va être assez long. Je m'y attaque ! Merci vraiment de passer du temps pour moi.
Messages postés
850
Date d'inscription
vendredi 13 février 2015
Statut
Membre
Dernière intervention
15 février 2019
50
Je viens de tester ton code. Aucune erreur, ça marche parfaitement.

Merci beaucoup de t'être penché sur ce problème un peu compliqué. C'est vraiment sympa.

Dernière petite question, est-il possible de garder le même format de cellule lorsque la ligne arrive sur la feuille 2?
Messages postés
1412
Date d'inscription
mardi 21 octobre 2014
Statut
Membre
Dernière intervention
9 mars 2021
153
Bonjour Kuartz, bonjour le forum,

Une version peut-être moins rapide mais qui conserve les formats :

Sub COMPARATIF3()
Dim O1 As Worksheet 'déclare la variable O1 (Onglet 1)
Dim O2 As Worksheet 'déclare la variable O2 (Onglet 2)
Dim DL1 As Long 'déclare la variable DL1 (Dernière Ligne de l'onglet 1)
Dim DL2 As Long 'déclare la variable DL2 (TDernière ligne de l'onglet 2)
Dim PL1 As Range 'déclare la variable PL1 (PLage 1)
Dim PL2 As Range 'déclare la variable PL2 (PLage2)
Dim I As Long 'déclare la variable I (Incrément)
Dim J As Long 'déclare la variable J (incrément)
Dim TEST As Boolean 'déclare la variable TEST
Dim DEST As Range 'déclare la variable DEST (cellule de DESTination)
Dim TL() As Variant 'déclare la variable TL (Tableau de Lignes)
Dim T1 As String 'déclare la variable T1 (Texte 1)
Dim T2 As String 'déclare la variable T2 (Texte 2)
Dim K As Long 'déclare la variable K (incrément)

'*********************************************************************************
'copie les lignes du tableau 1 dans le tableau 2 (si manquantes dans le tableau 2)
'*********************************************************************************

Set O1 = Sheets(1) 'définit l'onglet O1 (à adapter)
Set O2 = Sheets(2) 'définit l'onglet O2 (à adapter)
DL1 = O1.Cells(Application.Rows.Count, 1).End(xlUp).Row 'définit la dernière ligne éditée DL1 de la colonne 1 (=A) de l'onget O1
DL2 = O2.Cells(Application.Rows.Count, 2).End(xlUp).Row 'définit la dernière ligne éditée DL2 de la colonne 1 (=A) de l'onget O2
Set PL1 = O1.Range("A4:J" & DL1) 'définit la plage PL1
Set PL2 = O2.Range("A5:J" & DL2) 'définit la plage PL2
For I = 1 To DL1 'boucle 1 : sur toutes les lignes I de la plage PL1
    TEST = False 'définit la variable TEST
    T1 = CStr(O1.Cells(I, 3)) & "/" & CStr(O1.Cells(I, 5)) & "/" & CStr(O1.Cells(I, 10)) 'définit le texte T1 (concatenation des cellules colonnes 3, 5 et 10 = C, E et J)
    For J = 1 To DL2 'boucle 2 : pour toutes les lignes J de la plage PL2
        T2 = CStr(O2.Cells(J, 3)) & "/" & CStr(O2.Cells(J, 5)) & "/" & CStr(O2.Cells(J, 10)) 'définit le texte T2 (concaténation des cellules colonnes 3, 5 et 10 = C, E et J)
        If T1 = T2 Then TEST = True: Exit For 'si T1 est égal à T2, TEST devient [Vrai], sort de la boucle 2
    Next J 'prochaine ligne de la boucle 2
    If TEST = False Then 'condition : si TEST est [FAUX]
        Set DEST = O2.Cells(Application.Rows.Count, 1).End(xlUp).Offset(1, 0) 'définit la cellule de destination (première ligne vide du tableau PL2)
        DEST.Value = O2.Cells(I, 1).Resize(1, 10) 'récupère la ligne de la plage PL1 dans DEST
    End If 'fin de la condition
Next I 'prochaine ligne de la boucle 1

'****************************************************************
'efface les lignes du tableau 2 (si manquantes dans le tableau 1)
'****************************************************************

For I = 1 To DL2 'boucle 1 : sur toutes les lignes I de la plage PL2
    TEST = False 'définit la variable TEST
    T2 = CStr(O2.Cells(I, 3)) & "/" & CStr(O2.Cells(I, 5)) & "/" & CStr(O2.Cells(I, 10)) 'définit le texte T2 (concaténation des cellules colonnes 3, 5 et 10 = C, E et J)
    For J = 1 To DL1 'boucle 2 : sour toutes les lignes J de la plage PL1
        T1 = CStr(O1.Cells(J, 3)) & "/" & CStr(O1.Cells(J, 5)) & "/" & CStr(O1.Cells(J, 10)) 'définit le texte T1 (concatenation des cellules colonnes 3, 5 et 10 = C, E et J)
        If T2 = T1 Then TEST = True: Exit For 'si T2 est égal à T1, TEST devient [Vrai], sort de la boucle 2
    Next J 'prochaine ligne de la boucle 2
    If TEST = False Then 'condition : si TEST est [FAUX]
        ReDim Preserve TL(K) 'redimensionne le tableau TL
        TL(K) = I + 4 'récupère dans TL(K) le numéro de la ligne
        K = K + 1 'incrémente K
    End If 'fin de la condition
Next I 'prochaine ligne de la boucle 1
If K > 0 Then 'condition : si K est supérieur à zéro
    For I = UBound(TL) To LBound(TL) Step -1 'boucle inversé de la dernière valeur du tableau TL à la première
        O2.Rows(TL(I)).Delete 'efface la ligne TL(I)
    Next I 'prochaine valeur de la boucle
End If 'fin de la condition
End Sub

Messages postés
850
Date d'inscription
vendredi 13 février 2015
Statut
Membre
Dernière intervention
15 février 2019
50
Etrange, si je met ce code là à la place de l'autre, il ne fonctionne pas. La macro ne s'exécute pas, rien ne se remplit en feuille 2. Si je le code sans la conservation des formats, tout marche parfaitement.
Messages postés
1412
Date d'inscription
mardi 21 octobre 2014
Statut
Membre
Dernière intervention
9 mars 2021
153
Oui en effet! il y a une erreur ligne 36. Il faut rempacer O2 par O1.

DEST.Value = O1.Cells(I, 1).Resize(1, 10) 'récupère la ligne de la plage PL1 dans DEST

Messages postés
850
Date d'inscription
vendredi 13 février 2015
Statut
Membre
Dernière intervention
15 février 2019
50
Ne marche toujours pas. Mais ne te prend pas la tête. Le premier code marchait très bien. J'ai qu'à utiliser un code copiant les formats. Je te remercie en tout cas vraiment pour l'aide.

Cordialement.