Suppression de doublon sur une ligne - VBA

Bonjour,

J'ai des valeurs sur une même ligne de mon tableau excel (et j'insiste sur le fait que ce soit une ligne) qui peuvent se répéter. J'aimerais simplement supprimer les doublons de cette ligne.

J'ai essayer d'utiliser la fonction DeleteDuplicates mais elle ne marche que si les données sont organisées en colonne.

Peut-etre que je l'ai mal utilisée ? ou existe t-il un autre moyen ?

Merci d'avance pour votre aide

26dossier-forum.xlsm (120.48 Ko)

Bonjour,

On manque cruellement d'infos, pour te répondre:

  • tes doublons figurent parmi des données en ligne, d'accord, mais cette ligne fait-elle partie d'un tableau contenant d'autres lignes?
  • tu devras supprimer tes doublons une seule fois, ou de manière répétée?
  • tu fais référence à une "fonction DeleteDuplicates" ... je connais une méthode RemoveDuplicates en vba, qui est le pendant de la fonctionnalité "Supprimer les doublons" de l'onglet "Données". Parlons-nous de la même chose?
  • des moyens autres, il en existe des seaux, des brouettes, voire des wagonnets entiers ... mais sans avoir la moindre idée de ce à quoi ressemble ton fichier, on ne va pas pouvoir les passer toutes en revue

Si tu nous en disait plus?

Bonjour,

On manque cruellement d'infos, pour te répondre:

  • tes doublons figurent parmi des données en ligne, d'accord, mais cette ligne fait-elle partie d'un tableau contenant d'autres lignes?
  • tu devras supprimer tes doublons une seule fois, ou de manière répétée?
  • tu fais référence à une "fonction DeleteDuplicates" ... je connais une méthode RemoveDuplicates en vba, qui est le pendant de la fonctionnalité "Supprimer les doublons" de l'onglet "Données". Parlons-nous de la même chose?
  • des moyens autres, il en existe des seaux, des brouettes, voire des wagonnets entiers ... mais sans avoir la moindre idée de ce à quoi ressemble ton fichier, on ne va pas pouvoir les passer toutes en revue

Si tu nous en disait plus?

Ok je vais tout reprendre depuis le début alors : mon objectif est de fusionner 3 tableaux qui se situent sur 3 feuilles distinctes en un seul tableau regroupant à la fois les champs des 3 tableaux d'origine et leurs données.

J'ai donc commencé par copier, à la suite, les champs de mes trois tableaux, en tête de page d'une nouvelle feuille. Ensuite je supprime les doublons (je n'aurais donc pas besoin de répéter l'opération). Enfin je compare les champs du tableau récapitulatif avec ceux des 3 tableaux d'origine et copie les données dans les bonnes colonnes.

J'ai déjà une macro capable d'effectuer tout ça mais mon problème et qu'elle est extrêmement longue à exécuter. Je suis donc en train de la reprendre étape par étape afin de la simplifier et espérer diminuer le temps d'exécution. Juste cette étape de supprimer les doublons me prend 2sec pour moins de 10 ligne de code. Je met l'extrait ici :

'Supprime les champs en double
feuil_Bil.Select 'dans ma feuille récapitulative appelée feuill_Bil
derCol_Bil = Cells(1, Columns.Count).End(xlToLeft).Column 'trouve la dernière colonne de Bilan je cherche la dernière colonne non vide
For i = 1 To derCol_Bil 
    For j = i + 1 To derCol_Bil
        If Cells(1, i) = Cells(1, j) Then 'je compare chaque cellule avec toute les suivante (si une cellule est encore la c'est qu'elle est différente des précédentes donc pas besoin de la recomparer à celles-ci
            Cells(1, j).Delete ' si deux cellules sont identique je supprime la seconde
        End If
    Next
Next

J'ai donc chercher des solutions et suis tombé sur une fonction RemoveDuplicate que j'ai essayer d'utiliser sans succès. D'après ce que j'ai trouvé elle s'utiliserait comme ça (range() à renseigner évidemment) :

Range().RemoveDuplicates Array:=(1,2,3), Header:=xlYes

Je m'aperçois maintenant que j'avais fait une erreur et que tu avais bien raison, il s'agit bien de RemoveDuplicates et pas d'autres chose.

Je vais reprendre mon fichier complet et le poster ici dans quelques minutes, tu pourras peut-être y voir plus clair

Re-bonjour,

Désolé, je n'avais pas vu que tu avais ajouté le fichier à ton premier message!

Il y a quelque chose qui m'échappe dans la logique: les titres de colonnes qui figurent dans la feuille "global" sont recopiés depuis tes trois autres feuilles ? Mais les données de la colonne "Exercice d'engagement juridique", par exemple, sont différentes dans ces trois feuilles ... si tu supprimes 2 des trois colonnes ensuite, c'est un peu "brutal", non ?

Si tu veux une liste sans doublons des titres de colonnes de tes 3 feuilles, le mieux serait de créer cette liste d'abord, puis de coller le résultat ensuite dans une plage de cellules. Essaie:

Sub titresUniques()
tabloF = Array("CF brut", "CF associé RES", "RES sans recup")
Set liste = CreateObject("scripting.dictionary")
For f = 0 To 2
    For col = 1 To Sheets(tabloF(f)).Cells(1, Columns.Count).End(xlToLeft).Column
        liste(Sheets(tabloF(f)).Cells(1, col).Value) = ""
    Next col
Next f
Sheets("Bilan global").Cells(1, 1).Resize(1, liste.Count) = liste.keys
End Sub

Ça devrait être un poil plus rapide que ta technique.

Attention l'orthographe de "Commentaire" est différente dans une des feuilles

Au-delà de cette première manipulation, je ne sais pas comment tu comptes procéder !?

Re-bonjour,

Désolé, je n'avais pas vu que tu avais ajouté le fichier à ton premier message!

Il y a quelque chose qui m'échappe dans la logique: les titres de colonnes qui figurent dans la feuille "global" sont recopiés depuis tes trois autres feuilles ? Mais les données de la colonne "Exercice d'engagement juridique", par exemple, sont différentes dans ces trois feuilles ... si tu supprimes 2 des trois colonnes ensuite, c'est un peu "brutal", non ?

Si tu veux une liste sans doublons des titres de colonnes de tes 3 feuilles, le mieux serait de créer cette liste d'abord, puis de coller le résultat ensuite dans une plage de cellules. Essaie:

Sub titresUniques()
tabloF = Array("CF brut", "CF associé RES", "RES sans recup")
Set liste = CreateObject("scripting.dictionary")
For f = 0 To 2
    For col = 1 To Sheets(tabloF(f)).Cells(1, Columns.Count).End(xlToLeft).Column
        liste(Sheets(tabloF(f)).Cells(1, col).Value) = ""
    Next col
Next f
Sheets("Bilan global").Cells(1, 1).Resize(1, liste.Count) = liste.keys
End Sub

Ça devrait être un poil plus rapide que ta technique.

Attention l'orthographe de "Commentaire" est différente dans une des feuilles

Au-delà de cette première manipulation, je ne sais pas comment tu comptes procéder !?

Re-bonjour

Alors deja ton code marche a merveille et bien plus vite que le mien.

Ensuite depuis cet apres-midi, je vais avoir besoin d'une nouvelle exigence : ca serait de garder parmi les champs un certain ordre logique. La 1ere idée que j'avais eu c'était de leur donner a chacun une catégorie : en fait j'insérerai une premiere ligne avec des cellules fusionnées qui engloberaient les champs d'une meme catégorie, ce qui me permettrait peut-être de pouvoir replacer chaque champs dans sa catégorie ensuite dans la page bilan. (c'est la 1ère idée que j'ai eu mais peut-être que tu est plus en mesure que moi de dire si c'est faisable). Et ce car il est possible que par la suite des champs soient ajoutés et il faudrait que des champs ayant des données similaires restent proches.

Et enfin l'idée de la suite c'est de comparer les champs de la feuille "Bilan global" avec les champs des trois autres feuilles pour copier-coller les donnés dans la bonnes colonnes, les unes à la suite des autres, feuille après feuille. (exception fait pour la feuille "CF associé RES" où c'est un petit peu plus compliqué mais j'ai déjà du mal à l'expliquer à l'oral donc à l'écrit ca risque d'être pire).

Je vais re-joindre un fichier pour que ce soit plus visuel

peut-être que tu est plus en mesure que moi de dire si c'est faisable

J'ai bien peur que non! Ton projet me semble même, pour tout dire, encore plus compliqué que ce que j'avais imaginé! À mon avis, il n'y a que toi qui t'y retrouves

Les risques d'erreurs sont trop importants à mon sens ... Je crois que je vais faire comme Obélix: me défiler discrètement, en prétextant avoir un sanglier sur le feu!

J'ai apporté des éléments de réponse par rapport à la question de départ. Au-delà, peut-être que d'autres auront des idées?

Ou c'est peur être juste moi qui ai du mal à l'explique ^^'

En tout cas merci pour ton premier coup de main tu m'as donné une bonne piste !

Si tu le permet j'aurais une petite question dessus : je connaissait pas la fonction scripting.dictionnary, et plus largement je n'ai pas compris cette ligne. Comment est ce que ça fonctionne ?

Bonsoir,

En ce qui me concerne, j'ai eu (et ai encore) souvent recours à la mine d'infos mise à disposition par Jacques Boisgontier.

Tu trouveras un index en suivant le lien ci-dessus et, dans cet index, un lien vers la page où il traite de l'objet (et non la fonction) Dictionary ... Bonne lecture

Pour ton fichier, il vaudrait sans doute la peine de se demander s'il n'est pas possible d'avoir, dans toutes les feuilles, l'ensemble des colonnes (quitte à laisser certaines colonnes vierges dans une feuille ou l'autre)

Rechercher des sujets similaires à "suppression doublon ligne vba"