Supprimer des lignes qui s'annulent

Bonjour,

Après de nombreuses lectures sur ce sujet sur le forum et de nombreux essais infructueux, je pose ma question parce que je vais péter un cable

J'ai besoin de supprimer les lignes de ce fichiers dont les valeurs en colonne G se compensent.

Cependant les lignes qui se compensent ne se suivent pas forcément. En gros si elles correspondent entre-elles c'est qu'elles ont la même valeur en colonne C.

"Exemple : lignes 2 et 3 les valeurs se compensent et ont la même référence en colonne C donc je pourrais les annuler."

Je ne sais pas si j'arrive à être super claire.. Je ne comprends rien au codage en plus, donc je n'ai pas réussi à modifier ceux que j'ai pu trouver...

Merci d'avance pour votre aide !!

Malixe

22excel.xlsx (117.96 Ko)

Bonjour et

Et il n'y a pas de lien avec les dates en colonne "Vers" ? Parce que pour un même "N° PJ d", il y a (au moins) 3 fois 57 et 2 fois -57 ... Comment savoir lesquels s'annulent mutuellement ?

Bonjour,

A tester :

Vérifier les montants de la colonne G avant et après.

Sub SupprimerLesValeursQuiSAnnulent()

Dim ShEssai As Worksheet
Dim DerniereColonne As Long, DerniereLigne As Long
Dim AirePositifs As Range, AireNegatifs As Range, AireATrier As Range, AireTableau As Range, AireMontant As Range
Dim I As Integer, J As Integer

    Sheets("Sheet1").Copy after:=Sheets(Sheets.Count)
    Set ShEssai = ActiveSheet

    With ShEssai
         DerniereColonne = .Cells(1, .Columns.Count).End(xlToLeft).Column
         DerniereLigne = .Cells(.Rows.Count, 1).End(xlUp).Row

         .Range(.Cells(1, DerniereColonne + 1), .Cells(1, DerniereColonne + 2)) = Array("Valeurs positives", "Valeurs négatives")

         Set AirePositifs = .Range(.Cells(2, DerniereColonne + 1), .Cells(DerniereLigne, DerniereColonne + 1))
         Set AireNegatifs = .Range(.Cells(2, DerniereColonne + 2), .Cells(DerniereLigne, DerniereColonne + 2))
         Set AireATrier = .Range(.Cells(2, "C"), .Cells(DerniereLigne, "C"))
         Set AireTableau = .Range(.Cells(1, "A"), .Cells(DerniereLigne, DerniereColonne + 2))
         Set AireMontant = .Range(.Cells(2, "G"), .Cells(DerniereLigne, "G"))

         Application.ScreenUpdating = False

         With AirePositifs
              .Formula = "=IF(G2>0,C2&"" ""&G2,"""")"
              .Copy
              .PasteSpecial xlPasteValues
         End With

         With AireNegatifs
              .Formula = "=IF(G2<0,C2&"" ""&-G2,"""")"
              .Copy
              .PasteSpecial xlPasteValues
         End With

         Application.ScreenUpdating = False

         For I = AireNegatifs.Count To 1 Step -1
             For J = AirePositifs.Count To 1 Step -1
                    If AireNegatifs(J) = AirePositifs(I) And AireNegatifs(J) <> "" Then
                       AireNegatifs(J).EntireRow.Clear
                       AirePositifs(I).EntireRow.Clear
                       Exit For
                    End If
             Next J
         Next I

         .Sort.SortFields.Clear
         .Sort.SortFields.Add2 Key:=AireATrier, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortTextAsNumbers
         With .Sort
             .SetRange AireTableau
             .Header = xlYes
             .MatchCase = False
             .Orientation = xlTopToBottom
             .SortMethod = xlPinYin
             .Apply
         End With

         .Cells(1, DerniereColonne + 3).Formula = "=SUM(" & AireMontant.Address & ")"

         Application.ScreenUpdating = True

    End With

    Set ShEssai = Nothing
    Set AirePositifs = Nothing: Set AireNegatifs = Nothing
    Set AireATrier = Nothing: Set AireTableau = Nothing: Set AireMontant = Nothing

End Sub

Bonjour @Eric Kergresse,

Lors de l'exécution, le système me bloque sur la ligne : ".PasteSpecial xlPasteValues".
Sauriez-vous pourquoi ?

Malixe

Bonjour U. Milité,

Si désolée, les dates en "Vers" doivent être les mêmes pour les annulations !

Bonne journée !

Malixe

Ci-joint le fichier qui m'a servi pour vous répondre. Cliquer sur le bouton vert dans la barre d'accès rapide pour lancer la macro.

8malixe-excel.xlsm (127.42 Ko)

Bonjour Malixe,
Salut Eric,

Sans rien enlever à la proposition d'Eric, pourquoi ne pas essayer de faire simple (même si un peu moins "magique") ?
En H2, inscrire la formule

=SOMME.SI.ENS($G$2:$G$2765;$C$2:$C$2765;C2;$F$2:$F$2765;F2)

... et recopier jusqu'en bas.
De ce que j'ai compris de la demande, la formule fera apparaître le "solde" des montants (col. G), pour un même "N° PJ d" (col. C) et une même date (col. F). Si le solde est à 0, les lignes peuvent être supprimées.

Mais je suis peut-être hors-sujet ?

Précision suite au dernier message d'U.Milité. Mon code ne prend pas en compte l'égalité des dates parce que ce n'était pas prescrit dans le message d'origine.

Cela dit, il suffit de faire une concaténation de plus en ajoutant la date dans la formule pour que cela fonctionne.

La formule a super bien marché !!!

Je ne sais pas pourquoi certaines ligne sosnt passées à la trappe, mais ce n'est pas grave mon fichier est significativement réduit !

Merci à vous deux pour votre aide !

Rechercher des sujets similaires à "supprimer lignes qui annulent"