Sub SupSICommentée()
[color=blue]
'--> Déclaration de 4 variables pour les différentes boucles
'--> A noter que r& est l'abréviation de Dim r as Long (entier long),
'--> les autres abréviations : % =As Integer, $ = As String, ! = As Single, # = As Double, @ = As Currency[/color]
Dim r&
Dim n&
Dim x&
Dim rr&
[color=blue]
'--> Déclaration de variables qui mémoriseront les valeurs à comparer
'--> A noter que je préfère signaler mes variables avec un petit "v" devant le nom pour éviter les conflits :
'--> en effet, Type étant un mot réservé par VBA, il n'est pas possible d'appeler ses propres variables avec un nom réservé.[/color]
Dim vDest&
Dim vType$
Dim vPoste1$
Dim vPoste2$
Dim vLieu$
[color=blue]
'--> je préfère déclarer la dernière variable en Variant (tous types) au cas où les valeurs à comparer pourraient être très disparates[/color]
Dim N°Co As Variant
[color=blue]
'--> Attribution des "valeurs-cibles" aux variables
'--> Notes que j'ai 2 variables pour comparer les Postes
'--> pour éviter de modifier la macro quand tu souhaites varier les valeurs,les valeurs sont inscrites dans la page "Paramètres"
'--> Elles sont donc modifiables à volonté[/color]
With Sheets("Paramètres")
vDest = .Cells(1, 2)
vType = .Cells(2, 2)
vPoste1 = .Cells(3, 2)
vPoste2 = .Cells(4, 2)
vLieu = .Cells(5, 2)
End With [color=blue]
'--> Retour sur la feuille de données[/color]
Sheets("Data").Activate[color=blue]
'--> n = la dernière cellule non vide de la colonne 1 (.End(3) = .End(xlUp))
'--> en clair, la macro part de la dernière cellule de la colonne A et remonte jusqu'à la 1ère cellule non vide[/color]
n = Cells(65536, 1).End(3).Row
[color=blue]
'--> Boucle : de la première rangée (r = 1) à la dernière rangée non vide (r = n)[/color]
For r = 1 To n
[color=blue]
'--> chaque cellule discriminante est comparée aux variables de la 1ère condition à vérifier [/color]
If Cells(r, 1) = vDest And Cells(r, 2) = vType And Cells(r, 3) = vPoste1 And Cells(r, 4) = vLieu Then [color=blue]
'--> si la comparaison A est vérifiée, N°Co prend la valeur cible qui servira dans la deuxième comparaison[/color]
N°Co = Cells(r, 5)[color=blue]
'--> je boucle sur l'ensemble du tableau[/color]
For x = 1 To n [color=blue]
'--> je m'assure que x est différent de r pour éviter de supprimer la ligne de comparaison à conserver [/color]
If x <> r Then[color=blue]
'--> s'il existe au moins une valeur de la 5ème colonne identique à la variable N°Co, alors on contrôle la 2ème condition.[/color]
If N°Co = Cells(x, 5).Value Then[color=blue]
'--> je lance une nouvelle boucle mais cette fois en partant du bas du tableau vers le haut pour la raison suivante :
'--> quand on supprime la ligne en remontant, on ne modifie pas le n° des lignes qu'on va passer en revue ensuite
'--> si tu supprimes les lignes en descendant, tu vas forcement modifier le N° des lignes que tu étudies ensuite [/color]
For rr = n To 1 Step -1
[color=blue] '--> Vérification de la condition 2[/color]
If Cells(rr, 1) = vDest And Cells(rr, 2) = vType And Cells(rr, 3) = vPoste2 And Cells(rr, 4) = vLieu And Cells(rr, 5) = N°Co Then [color=blue]
'--> la condition est vérifiée, on supprime la ligne[/color]
Rows(rr).EntireRow.Delete
End If [color=blue]'--> condition 2 non vérifiée[/color]
Next
End If [color=blue]'--> pas de doublons de N°Co, inutile donc de tester la condition 2[/color]
End If [color=blue]'--> x = r, inutile de supprimer la ligne servant de base à la condition 1[/color]
Next[color=blue] '--> condition 1 non vérifiée[/color]
End If
Next r
End Sub