Partage
  • Partager sur Facebook
  • Partager sur Twitter

[VBA] Suppression de ligne dans For Each

    16 mai 2019 à 15:11:41

    Bonjour,

    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

    Si vous avez une idée je suis preneur ! ;)

    -
    Edité par Valenciano 16 mai 2019 à 15:25:11

    • Partager sur Facebook
    • Partager sur Twitter

    Développeur Web autodidacte HTML5/CSS3/JS + C# (ASP.NET Core) / Python (Django)

      16 mai 2019 à 18:16:45

      Salut,

      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).

      -
      Edité par Stormweaker 16 mai 2019 à 18:19:04

      • Partager sur Facebook
      • Partager sur Twitter
        17 mai 2019 à 8:57:23

        Salut stormweaker,

        Merci beaucoup pour ta réponse :)

        Stormweaker a écrit:

        • 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.

        -
        Edité par Stormweaker il y a environ 14 heures





        • Partager sur Facebook
        • Partager sur Twitter

        Développeur Web autodidacte HTML5/CSS3/JS + C# (ASP.NET Core) / Python (Django)

          20 mai 2019 à 10:29:58

          Ha d'accord, en effet ça ne marchera pas comme ça.

          Il y a combien de lignes environ dans ce type de fichier ?

          • Partager sur Facebook
          • Partager sur Twitter

          [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.
          • Editeur
          • Markdown