Je cherche à supprimer des lignes de lots pour les conditions suivantes :
Trier les références par ordre alphabétique (A-Z) : OK
Trier sur les références ayant le statut non ok (KO) uniquement : OK
Pour chaque reference, ne garder que celles ayant le numéro de lot le plus faible => Aie, c'est ici que l'algorithme que j'ai écrit ne semble pas correct...
Plus d'explications ci-dessous :
Source de donnée :
Résultat attendu après application de la macro :
Le résultat que j'obtiens avec mon code VBA actuel :
=> Le résultat obtenu est érroné je devrais obtenir ce qui est en deuxième image... malgré mes relectures de code, je n'arrive pas à voir où l'algorithme coince...
Voici mon code :
Private Sub CommandButton1_Click()
'Determination de la derniere ligne du classeur
Dim derniere_ligne As Integer
derniere_ligne = ThisWorkbook.Sheets(1).Cells.SpecialCells(xlCellTypeLastCell).Row
'Filtrage de la colonne Statut par statut "KO"
ThisWorkbook.Sheets(1).Range("A:C").AutoFilter Field:=3, Criteria1:="KO"
'Definition de la plage de donnees pour les lots
Set liste_ref = ThisWorkbook.Sheets(1).Range("B2:B" & derniere_ligne).SpecialCells(xlCellTypeVisible)
Dim numero_lot As Integer
Dim numero_lot_suivant As Integer
Dim ref As Variant
Dim ref_suivante As Variant
'Pour chaque reference dans la liste de reference
For Each ref In liste_ref
numero_lot = ThisWorkbook.Sheets(1).Cells(ref.Row, 1)
For Each ref_suivante In liste_ref
If ref = ref_suivante Then
numero_lot_suivant = ThisWorkbook.Sheets(1).Cells(ref_suivante.Row, 1)
If numero_lot_actuel < numero_lot_suivant Then
'Supprimer la ligne du lot suivant
ThisWorkbook.Sheets(1).Rows(ref_suivante.Row).Delete
End If
End If
Next
Next
End Sub
Tes variables ref et ref_suivante sont a priori (faudrait mettre un coup de debugger pour être sûr) des cellules (type Range) et pas la valeur contenue donc la comparaison ligne 25 ne marchera pas comme tu veux.
Ce que je te propose comme algorithme :
Trier les références de A à Z puis le lot du plus petit au plus grand (avec le tri personnalisé d'Excel, tu peux trouver comment t'en servir en VBA avec l'enregistreur de macros je pense) ;
Filtrer le statut pour avoir uniquement les KO ;
Parcourir les lignes affichées de la fin au début, pour chaque élément si la référence de la ligne courante (ligne n) est la même que la ligne au-dessus (la ligne n-1) alors supprimer la ligne courante (puisqu'avec le tri on garantit que le lot est plus petit sur la ligne au-dessus).
Trier les références de A à Z puis le lot du plus petit au plus grand (avec le tri personnalisé d'Excel, tu peux trouver comment t'en servir en VBA avec l'enregistreur de macros je pense) ;
Filtrer le statut pour avoir uniquement les KO ;
Parcourir les lignes affichées de la fin au début, pour chaque élément si la référence de la ligne courante (ligne n) est la même que la ligne au-dessus (la ligne n-1) alors supprimer la ligne courante (puisqu'avec le tri on garantit que le lot est plus petit sur la ligne au-dessus).
=> Le problème c'est que des fois le même lot reviendra plusieurs fois avec le même numéro, exemple, le lot A numéro 1 présent 3 fois : Les 3 lots de 1 doivent restés présents et ne pas être éliminés.
Ha d'accord, en effet ça ne marchera pas comme ça.
Il y a combien de lignes environ dans ce type de fichier ?
[VBA] Suppression de ligne dans For Each
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Développeur Web autodidacte HTML5/CSS3/JS + C# (ASP.NET Core) / Python (Django)
Développeur Web autodidacte HTML5/CSS3/JS + C# (ASP.NET Core) / Python (Django)