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 SubVous devriez trouver cela :
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é.
