Garder dernière ligne Et dernière valeur d'une colonne
Chers amis bonjour,
Je reste bloqué sur une problématique qui pourtant parait simple.
J’ai réalisé un fichier exemple pour simplifier le contexte.
OBJECTIF : Faire apparaitre, pour chaque concaténation (colonne J/K = colonne Z), la ligne la plus en bas dans la feuille, avec dans la colonne S la valeur non nulle la plus en bas.
voir feuille 2 (« Résultat désiré »)
Ma démarche, qui ne fonctionne pas, était la suivante (voir macro « Module2 ») :
1. Je concatène deux valeurs qui me permettent de différencier les lignes
2. Je créé une colonne avec une valeur de ligne 1, 2 , 3 …
3. Je trie par concatenations, avec un ordre croissant
4. Système de mémoire qui évolue suivant l’égalité ou non de la concatenation et de la cause :
Et c’est après que ça coince : je n’arrive pas à récupérer la dernière cause (colonne S), renseignée par concatenation.
Je ne suis pas sûr que mes explications soient claires, mais le fichier exemple me semble plus parlant
Si jamais vous avez une idée de la façon dont doit être structurée la macro, je suis preneur !
Merci pour votre aide !
PS : les couleurs ne sont là que pour aider à visualiser la problématique, elles n'y seront pas sur le fichier complet, trop facile sinon ^^
Merci pour ta réponse Banzai64 !
J'ai testé ta proposition sous diverses tournures et ça fonctionne parfaitement
Si tu as encore quelques minutes à m'accorder, pourrais-tu m'expliquer le fonctionnement de ta macro ?
Bonjour
Très simple
Au début on concatène les colonnes J et K dans la colonne Z
On numérote les lignes en colonne AA
On trie la base en fonction de la colonne Z
On part de la dernière ligne vers la ligne 3
Si en colonne Z la ligne est égale à la ligne -1 -> Si la colonne Q n'est pas vide, elle est recopiée dans la ligne -1, idem pour la colonne S, suppression de la ligne
Une fois la boucle terminée, on tri la base en fonction de la colonne AA
On efface la colonne AA
Mince, il y a un soucis, tout ce qui peut être écrit dans la colonne Q n'était que pour l'exemple et montrer les lignes à garder :/
Il faudrait ne pas se baser sur les valeurs de la colonne Q ! Mea Culpa pour le manque de précision.
Bonsoir
Alors quel est le souci ?
Si j'ai bien compris, ta proposition recopie "ligne a garder" vers le haut, ainsi que la cause.
J'avais marqué "ligne à garder" pour montrer que c'est la dernière ligne qui doit être gardée (celle qui contiendra les informations les plus récentes dans mon cas, car importée au préalable, en dernier).
Ce que je cherche à réaliser, c'est :
Supprimer les doublons (mêmes concatenations), en ne gardant que la ligne la plus en bas (celle avec les informations les plus récentes), et en récupérant la dernière cause (colonne S) (la plus en bas possible : il se peut qu'il n'y en ai pas, ou qu'elle soit déjà sur la dernière ligne).
Vois-tu mon problème ? :s
J'avais réalisé ceci, mais il m'était impossible de récupérer la cause la plus en bas possible pour chaque concaténation :
MemoireCause = Worksheets("Carnets").Cells(Worksheets("Carnets").Cells(1048576, 19).End(xlUp).Row, 19).Value
MemoireConcatenation = Worksheets("Carnets").Cells(Worksheets("Carnets").Cells(1048576, 26).End(xlUp).Row, 26).Value
For ligne = fin To 2 Step -1
'si la concatenation est celle en memoire
If Worksheets("Carnets").Cells(ligne, 26).Value = MemoireConcatenation Then
'si on a aucune cause d'entrée
If Worksheets("Carnets").Cells(ligne, 19).Value = "" Then
'on inscrit la cause en mémoire
Worksheets("Carnets").Cells(ligne, 19).Value = MemoireCause
Else
'Si on a une cause d'entrée, elle remplace celle en mémoire
'/!\ PROBLEME : cette nouvelle cause mémoire est gardée en compte pour les autres concatenations, alors que la cause n'est pas la bonne dernière cause renseignée ...
MemoireCause = Worksheets("Carnets").Cells(ligne, 19).Value
End If
'si la concatenation est différente de celle en mémoire
Else
'la MémoireConcatenation devient la nouvelle concatenation
MemoireConcatenation = Worksheets("Carnets").Cells(ligne, 26).Value
'Si on a une cause de renseignée
If Worksheets("Carnets").Cells(ligne, 19).Value <> "" Then
'La MemoireCause devient cette cause
MemoireCause = Worksheets("Carnets").Cells(ligne, 19).Value
Else
'Si il n'y a pas de cause de renseignée, on inscrit la cause en mémoire
Worksheets("Carnets").Cells(ligne, 19).Value = MemoireCause
End If
End If
Next ligne
Bonjour
jeremymacapuche a écrit :Supprimer les doublons (mêmes concatenations)
La macro le fait en se basant sur la concaténation
jeremymacapuche a écrit :en ne gardant que la ligne la plus en bas
La macro ne garde que les informations de la ligne la plus basse (ce qui revient au même)
En fournissant un fichier avec des cas concrets, cela plus facile (enfin j'espère) de proposer une solution
Bonjour,
En m'inspirant grandement de votre proposition, j'ai utilisé votre méthode en modifiant de la sorte :
Je récupère la dernière ligne pour chaque concatenation.
Je recopie vers le haut les valeurs de cette ligne // Sauf la cause (colonne S).
Je récupère la dernière cause pour chaque concatenation.
Je recopie vers le haut la cause trouvée s'il y en a une.
'Si en colonne Z la ligne est égale à la ligne -1
If Range("Z" & J) = Range("Z" & J - 1) Then
'on copie toutes les valeurs sauf la cause
Range(Cells(J - 1, 2), Cells(J - 1, 18)).Value = Range(Cells(J, 2), Cells(J, 18)).Value
Range(Cells(J - 1, 20), Cells(J - 1, 25)).Value = Range(Cells(J, 20), Cells(J, 25)).Value
'Si on a une cause pour cette concatenation
If Range("S" & J) <> "" Then
'on la recopie vers le haut
Range("S" & J - 1).Value = Range("S" & J).Value
End If
'on supprime jusqu'à ce qu'il n'y ai qu'une concatenation
Rows(J).Delete
End If
Next J
Puis je ne garde que la ligne la plus en haut pour chaque concatenation
C'est un peu de bidouillage mais le resultat est concluant.
Je te remercie de m'avoir aider à résoudre mes problèmes Banzai64 !