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 ^^

Bonjour et bienvenu(e)

A vérifier

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 !

Rechercher des sujets similaires à "garder derniere ligne valeur colonne"