Comparaison de 2 tableaux
Résolu/Fermé
Kuartz
Messages postés
850
Date d'inscription
vendredi 13 février 2015
Statut
Membre
Dernière intervention
15 février 2019
-
Modifié par Kuartz le 24/06/2015 à 16:41
Kuartz Messages postés 850 Date d'inscription vendredi 13 février 2015 Statut Membre Dernière intervention 15 février 2019 - 26 juin 2015 à 08:47
Kuartz Messages postés 850 Date d'inscription vendredi 13 février 2015 Statut Membre Dernière intervention 15 février 2019 - 26 juin 2015 à 08:47
A voir également:
- Comparaison de 2 tableaux
- Tableaux croisés dynamiques - Guide
- 2 comptes whatsapp - Guide
- Fusionner 2 tableaux excel - Guide
- Word numéro de page 1/2 - Guide
- 2 ecran pc - Guide
11 réponses
ThauTheme
Messages postés
1442
Date d'inscription
mardi 21 octobre 2014
Statut
Membre
Dernière intervention
29 juillet 2022
160
25 juin 2015 à 11:02
25 juin 2015 à 11:02
Bonjour kuartz, bonjour le forum,
Peut-être comme ça :
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
Kuartz
Messages postés
850
Date d'inscription
vendredi 13 février 2015
Statut
Membre
Dernière intervention
15 février 2019
61
Modifié par Kuartz le 25/06/2015 à 11:26
Modifié par Kuartz le 25/06/2015 à 11:26
Wow, joli code.
Merci beaucoup.
Par contre, à la ligne "ERREUR", Excel me dit : "L'indice n'appartient pas à la sélection"
Merci d'avance.
Cordialement.
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.
Kuartz
Messages postés
850
Date d'inscription
vendredi 13 février 2015
Statut
Membre
Dernière intervention
15 février 2019
61
25 juin 2015 à 11:30
25 juin 2015 à 11:30
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?
ThauTheme
Messages postés
1442
Date d'inscription
mardi 21 octobre 2014
Statut
Membre
Dernière intervention
29 juillet 2022
160
25 juin 2015 à 11:45
25 juin 2015 à 11:45
Bonjour Kuartz, bonjour le forum,
Il y a une autre erreur... Il faut rajouter une condition à la fin :
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...
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...
Kuartz
Messages postés
850
Date d'inscription
vendredi 13 février 2015
Statut
Membre
Dernière intervention
15 février 2019
61
Modifié par Kuartz le 25/06/2015 à 11:58
Modifié par Kuartz le 25/06/2015 à 11:58
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?
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.
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.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
ThauTheme
Messages postés
1442
Date d'inscription
mardi 21 octobre 2014
Statut
Membre
Dernière intervention
29 juillet 2022
160
25 juin 2015 à 13:48
25 juin 2015 à 13:48
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...
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
Kuartz
Messages postés
850
Date d'inscription
vendredi 13 février 2015
Statut
Membre
Dernière intervention
15 février 2019
61
25 juin 2015 à 15:24
25 juin 2015 à 15:24
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.
Kuartz
Messages postés
850
Date d'inscription
vendredi 13 février 2015
Statut
Membre
Dernière intervention
15 février 2019
61
25 juin 2015 à 15:58
25 juin 2015 à 15:58
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?
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?
ThauTheme
Messages postés
1442
Date d'inscription
mardi 21 octobre 2014
Statut
Membre
Dernière intervention
29 juillet 2022
160
25 juin 2015 à 16:59
25 juin 2015 à 16:59
Bonjour Kuartz, bonjour le forum,
Une version peut-être moins rapide mais qui conserve les formats :
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
Kuartz
Messages postés
850
Date d'inscription
vendredi 13 février 2015
Statut
Membre
Dernière intervention
15 février 2019
61
25 juin 2015 à 17:04
25 juin 2015 à 17:04
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.
ThauTheme
Messages postés
1442
Date d'inscription
mardi 21 octobre 2014
Statut
Membre
Dernière intervention
29 juillet 2022
160
25 juin 2015 à 17:16
25 juin 2015 à 17:16
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
Kuartz
Messages postés
850
Date d'inscription
vendredi 13 février 2015
Statut
Membre
Dernière intervention
15 février 2019
61
26 juin 2015 à 08:47
26 juin 2015 à 08:47
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.
Cordialement.