Liste liée sans doublons

Bonjour

J'ai vainement cherché sur le forum un détail à propos du filtrage de listes liées sans doublons.

J'ai dans une colonne A de la "Feuille01" une liste d'items qui peuvent se répéter (doublons). Je voudrais, dans la colonne A de la "Feuille02", filtrer (par liaison) une liste composée des mêmes items mais sans doublon. Le point compliqué ici c'est que la liste filtrée sans doublon doit rester liée à la source (à la colonne A de la "Feuille01") de sorte que lorsque je modifie les occurrences d'un item dans "feuille01" Colonne A, le même item s'actualise automatiquement dans "Feuille02" colonne A.

Je ne pense pas que c'est trop compliquée sans VBA. Une formule serait très appréciée pour résoudre un casse tête qui dure pour moi

Merci à vous

Ben

Salut et bienvenue sur le Forum,

Sur la feuille 1, tu dois placer un champ pour nommer la colonne A. En utilisant une formule dynamique telle que proposée dans le fichier ci-joint, tu peux ajouter autant de données que tu désires dans cette colonne.

Nom_du_champ = =DECALER($A$2;;;NBVAL($A:$A)-1)

Ensuite, sur la feuille 2, tu sélectionnes en premier le nombre de cellules dont tu vas avoir besoin. Dans mon exemple j’ai pris de la marge en sélectionnant la plage A2:A20 puis j’ai collé la formule ci-dessous dans la barre de formules et j’ai finalement confirmé par Ctrl+Maj+Enter puisqu’il s’agit d’une formule matricielle.

=SI(ESTTEXTE(INDEX(Champ;PETITE.VALEUR(SI(EQUIV(Champ;Champ;0)=LIGNE(INDIRECT("1:"&LIGNES(Champ)));EQUIV(Champ;Champ;0);"");LIGNE(INDIRECT("1:"&LIGNES(Champ))))));INDEX(Champ;PETITE.VALEUR(SI(EQUIV(Champ;Champ;0)=LIGNE(INDIRECT("1:"&LIGNES(Champ)));EQUIV(Champ;Champ;0);"");LIGNE(INDIRECT("1:"&LIGNES(Champ)))));"")

Un grand merci à Jacques Boisgontier http://boisgontierjacques.free.fr/ pour cette superbe formule.

Cordialement.

169sans-doublons.zip (4.77 Ko)

Bonjour Yvouille, benhenda

Dans le module "Feuille01"

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim a, e
    If Intersect(Target, Columns("a")) Is Nothing Then Exit Sub
    a = Range("a1").CurrentRegion
    If Not IsArray(a) Then
        Sheets(2).Columns("a").ClearContents
        Sheets(2).Range("a1").Value = a
        Exit Sub
    End If
    With CreateObject("Scripting.Dictionary")
        For Each e In a
            If Not IsEmpty(e) And Not .exists(e) Then .Add e, Nothing
        Next
        Sheets(2).Columns("a").ClearContents
        Sheets(2).Range("a1").Resize(.Count).Value = Application.Transpose(.keys)
    End With
End Sub

klin89

Bonjour Yvouille, Klin89

Merci beaucoup d'avoir réagi à mon appel d'aide. J'admets que le code VBA de Klin m'est un peu complexe d'usage. Les formules Excel me parlent un peu mieux même si je n'arrive pas à adapter celles dans le fichier de Yvouille à mon exemple. J'ai essayé de reproduire les formules dans mon classeur de travail dont j'inclus un extrait, les formulent semblent fonctionner puisque pas de message d’erreur, sauf que rien ne sort dans les feuilles liées.

Dans la longue formule de Jacques Boisgontier, j'ai simplement changé le nom du champ "Champ" par le nom du champ qui correspond à ma colonne, car au fait, j'envisage de faire le même tri sur des colonnes successives A, B, C etc. J'ai crée des champs quelque part dans la feuille 01 que j'ai utilisé dans les formules correspondantes dans des feuilles 02, 03 etc. (mes feuillets ont des noms). (NB: j'ai gardé inchangé le nom du champ "Champ" pour le tester tel quel sur les colonnes A1 des deux feuillets source et cible).

Est-ce que le mot "Champ" dans la formule désigne toujours la même variable qui est le nom du Champ créé dans la feuille 01? Si c'est le cas, l'adaptation de la formule à d'autres champs devrait juste se limiter à changer le nom de cette variable en fonction du nom des autres champs prévus pour d'autres listes filtrées. Ou bien tou simplement je n'ai pas bien saisi la logique de la formule.

Merci de votre patience.

Ben

47moocs.zip (10.90 Ko)

bonjour

une contribution par formule en plus simple

162benhenda.zip (5.69 Ko)

cordialement

tu saisis la formule >>>tu valides >>>et tu incrementes

Bonjour tout le monde,

@ Tulipe

En comparaison de la formule de Boisgontier (tout à coup ce n’est plus la mienne, c’est celle d’un autre ), ta formule est géniale de simplicité. Je crois que je vais abandonner les macros et me remettre aux formules exclusivement

@benhenda

Attention, je t’avais expliqué qu’avec MA formule, tu devais sélectionner la plage au préalable plus coller la formule dans la barre de formule avant d’effectuer la validation matricielle Ctrl+Maj+Enter. Avec la formule de Tulipe, tu dois l’inscrire dans la première cellule, effectuer la validation matricielle puis incrémenter ensuite vers le bas. Est-ce de là que venaient tes petits soucis ? De toute façon, tu n'as plus à t'en préoccuper.

@Klin89

Benhenda avait demandé une formule

Cordialement.

Bonsoir

Merci Yvouille, merci Tulipe

Désolé Yvouille d'avoir attribué TA formule à quelqu'un d'autre. C'est ta propre remarque "Un grand merci à Jacques Boisgontier http://boisgontierjacques.free.fr/ pour cette superbe formule" qui m'a induit en erreur. Ta note vient juste en dessous de la formule en question, comme un rappel ou une légende. Sorry !

Bon, je retenterais les deux solution et je donnerais suite ici même.

Bien à vous

ben

Oh là là, encore une de mes plaisanteries qui tombe à côté !

La formule que je t’avais fournie est de Jacques Boisgontier et de personne d’autre. Mais comme certaines fois certaines personnes ont tendance à s’approprier les choses lorsque ça les arranges et à les renier dans le cas contraire, je trouvais marrant de m’approprier tantôt oui, tantôt non cette formule d’un autre.

Tu n’as jamais remarqué que lorsque des supporters rentrent d’un match, ils n’ont dans 99 % des cas que deux réponses possibles : ‘’On a gagné’’ si l’équipe locale à gagner ou ‘’Ils ont perdus’’, si les joueurs locaux ont été malchanceux

Promis, juré, craché par-terre, je ne ferais plus jamais que dépanner les membres, sans plus plaisanter

Chaleureusement.

bonjour;bonjour Yvouille

ma formule proposée sort tout droit ,elle aussi de chez jaques Boigontier ;mais je l'ai simplifiée et ;je lui ai rajouté un garde -fou pour faire propre

normalement il y a une premiere condition :SI(laplage<>""; min(.......... cette dernière permet de tenir compte des vides ; mais par extrapolation on pourrait très bien exclure autre chose ; ainsi on pourrait "filtrer" en qque sorte ......... bien sur le garde fou a base de sommeprod s'en trouve modifié

mais comme normalement un utilisateur de excel est ordonné... pas de vides ni de cel fusionnées ......

pour en revenir a la formule avec plage preselectionnée ; elle a l'avantage de créer une plage "autoprotégée" ; car il devient impossible de modifier la matrice ; d'ailleurs si on s'y avise ,on se retrouve avec un message d'erreur et.......... c'est le binz pour en sortir ( c'est du vecu )

et petite critique .... l'utilisation de INDIRECT à l'instar de DECALER renvoie un' volatile' et là; on se retrouve dans le brouillard

on y peux rien ,c'est comme cela , personellement j'evite, etant donné qu'a 90% je suis en" mode creation/impro

Ma ruse consiste a mettre au point avec des cellules ou des plages selectionnées manuellent et.... quand ça marche ,automatiser avec DECALER ou INDIRECT ou tout autre moyen de ciblage

cordialement

Re le forum,

Je persiste avec cette évenementielle

A placer dans le module de la feuille "Axe5".

Private Sub Worksheet_Change(ByVal Target As Range)
Dim a, e, p, tablo, col As Byte, feuille As String
    If Intersect(Target, Columns("a:c")) Is Nothing Then Exit Sub
    tablo = [{1, "Activites"; 2, "Competences"; 3, "Savoirs"}]
    col = Target.Column
    p = Application.Match(col, Application.Index(tablo, , 1), 0)
    If Not IsError(p) Then feuille = tablo(p, 2)
    With Sheets("Axe5")
        With .Range(.Cells(1, col), .Cells(.Cells(Rows.Count, col).End(xlUp).Row, col))
            a = .Offset(1).Resize(.Rows.Count - 1).Value
        End With
    End With
    If Not IsArray(a) Then
        Sheets(feuille).Columns("a").ClearContents
        Sheets(feuille).Range("a1").Value = a
        Exit Sub
    End If
    With CreateObject("Scripting.Dictionary")
        For Each e In a
            If Not IsEmpty(e) And Not .exists(e) Then .Add e, Nothing
        Next
        Sheets(feuille).Columns("a").CurrentRegion.ClearContents
        Sheets(feuille).Range("a1").Resize(.Count, 1).Value = Application.Transpose(.keys)
    End With
End Sub

klin89

Rechercher des sujets similaires à "liste liee doublons"