Suppression de lignes dont les montants s'annulent

Bonjour,

Je ne connais rien à la programmation sous VBA. J'ai besoin de créer une macro dans le fichier joint qui réalise les 4 opérations suivantes sur l'onglet "04." (et uniquement sur cet onglet) :

1/ supprimer toutes les lignes dont les montants de la colonne I s'annulent. Par exemple, les lignes 16 et 18 (indiquées en bleu)

2/ même chose si il faut plus de 2 lignes pour annuler les montants quand on les additionne. Par exemple, les lignes 9, 10 et 12 (indiquées en jaune). Je pense que cette 2ème action est beaucoup plus difficile à réaliser.

3/ supprimer toutes les lignes dont les montants de la colonne I sont nuls. Par exemple, la ligne 25.

4/ savoir combien de lignes ont été supprimées.

Les 2 premières actions ne doivent être réalisées qu'à la condition où la référence de la colonne H est la même.

Enfin, je souhaite pouvoir actionner cette macro à l'aide d'un bouton sur l'onglet "04." et je souhaite pouvoir revenir en arrière (donc retrouver les lignes supprimées) avec un autre bouton (une sorte de retour arrière).

Merci d'avance pour votre aide.

Une proposition qui répond à une partie de la question. En utilisant des tableaux structurés ça aide.

Bonjour,

Les conditions pour fonctionner :

  • La ligne de titre doit comporter une colonne Valeurs trouvées.
  • Le tableau doit être un tableau structuré nommé : Tableau1

A vérifier sur d'autres onglets : Le code actuel ne repère pas les lignes à 0.

Option Explicit

Sub TrouverLesEcrituresQuiSAnnulent()

Dim Continuer As Boolean
Dim JCumule As Double
Dim I As Integer, J As Integer, K As Integer, Indice As Integer, IndexMatrice As Integer
Dim AireCommandes As Range, AireMontant As Range, AireTrouves As Range
Dim MatriceLignes() As Variant

    Set AireCommandes = Range("Tableau1[n° commande]")
    Set AireMontant = Range("Tableau1[Montant]")
    Set AireTrouves = Range("Tableau1[Valeurs trouvées]")

    AireCommandes.Interior.ColorIndex = xlNone
    AireTrouves.ClearContents
    Indice = 1

    For I = 1 To AireCommandes.Count
        If AireMontant(I) > 0 Then
           IndexMatrice = 0
            Continuer = True

           For J = 1 To AireCommandes.Count
               If AireTrouves(J) = "" Then
                  JCumule = 0
                  Erase MatriceLignes

                  If AireCommandes(I) = AireCommandes(J) And AireMontant(J) < 0 Then ' And AireTrouves(J) = ""
                        For K = J To AireCommandes.Count
                            If AireCommandes(K) = AireCommandes(J) And AireMontant(K) < 0 Then
                               JCumule = JCumule + AireMontant(K)
                               ReDim Preserve MatriceLignes(IndexMatrice)
                               MatriceLignes(IndexMatrice) = K
                               IndexMatrice = IndexMatrice + 1

                               If CStr(AireMontant(I)) = CStr(-JCumule) Then
                                  Continuer = False
                                  Exit For
                               End If
                            End If
                         Next K
                      End If

                     If Continuer = False Then
                        For IndexMatrice = LBound(MatriceLignes) To UBound(MatriceLignes)
                               AireCommandes(MatriceLignes(IndexMatrice)).Interior.Color = RGB(255, 255, 0)
                               AireTrouves(MatriceLignes(IndexMatrice)) = Indice
                        Next IndexMatrice

                        AireCommandes(I).Interior.Color = RGB(255, 255, 0)
                        AireTrouves(I) = Indice
                        Indice = Indice + 1
                        Exit For
                      End If

                  End If
            Next J

        End If
    Next I

    AireTrouves(1).Offset(-1, 0) = "Valeurs trouvées"
    AireCommandes(1).Offset(-1, 0).Interior.Color = RGB(244, 176, 132)

    Set AireCommandes = Nothing: Set AireMontant = Nothing: Set AireTrouves = Nothing

End Sub

Vous devriez trouver cela :

capture

Un grand merci à tous les deux ! En étudiant vos réponses, j'ai appris beaucoup de choses (qui étaient sûrement tout à fait basiques pour vous).

J'ai réussi à adapter vos codes à mon fichier (beaucoup plus lourd que le modèle que je vous ai envoyé) et j'ai été très heureux de voir que ça marche !

En tout cas, j'espère progresser dans la construction de macros VBA assez rapidement.

Bonjour

Une version un peu plus avancée mais pas encore satisfaisante. Cliquer sur le bouton "Run" pour lancer la macro. Ensuite un tri sur la dernière colonne permet de voir qui s'assemble avec qui. Il me faudrait beaucoup plus de données pour vraiment tester et aller plus loin dans la recherche.

Juste pour ma curiosité personnelle, au lieu de "marquer" dans une colonne dédiée les lignes concernées par des montants qui s'annulent, est-il possible de retirer vraiment ces lignes et d'afficher le résultat dans un nouvel onglet "05." (de manière à garder dans l'onglet "04." la traçabilité de ce qu'il y avait avant d'appliquer la macro) ?

Ou alors, toujours pour garder une traçabilité, est-il possible d'avoir une macro qui permette un "retour arrière" avec un 2ème bouton ?

Mais déjà, merci pour vos différentes réponses. Cela m'a beaucoup aidé.

Une requête Power Query vous permet de faire cela sans VBA :

capture
Rechercher des sujets similaires à "suppression lignes montants annulent"