Pour le fun : TriSansDoublons Prenoms/Noms

  • Initiateur de la discussion Initiateur de la discussion R@chid
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Re : Pour le fun : TriSansDoublons Prenoms/Noms

Bonjour,
Une solution par macro et pour le fun avec l'objet "ArrayList" :

VB:
Sub TriSansDoublons_avec_ArrayList()
   Dim ar, i As Long
   ar = Cells(1).CurrentRegion.Value
   With CreateObject("System.Collections.ArrayList")
      For i = 2 To UBound(ar, 1)
         If Not .contains(ar(i, 1) & "|" & ar(i, 2)) Then .Add ar(i, 1) & "|" & ar(i, 2)
      Next i
      .Sort
      For i = 0 To .Count - 1
         ar(i + 2, 1) = Split(.Item(i), "|")(0)
         ar(i + 2, 2) = Split(.Item(i), "|")(1)
      Next i
      Cells(1, 11).CurrentRegion.ClearContents
      Cells(1, 11).Resize(.Count+1, 2) = ar
   End With
End Sub
 
Dernière édition:
Re : Pour le fun : TriSansDoublons Prenoms/Noms

Bonjour Rachid,

Une autre solution par macro (je ne suis pas fort sur les formules...), ici avec filtre avancé et tri :

VB:
Sub TriSansDoublons_avec_FiltreAvancé()
   Dim ar, i As Long
   Cells(1, 11).CurrentRegion.ClearContents
   Cells(1).CurrentRegion.AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Cells(1, 11), Unique:=True
   With ActiveSheet.Sort
      .SortFields.Clear
      .SortFields.Add Key:=Cells(1, 11).CurrentRegion.Offset(1, 0).Columns(1), SortOn:=xlSortOnValues, Order:=xlAscending
      .SortFields.Add Key:=Cells(1, 11).CurrentRegion.Offset(1, 0).Columns(2), SortOn:=xlSortOnValues, Order:=xlAscending
      .SetRange Cells(1, 11).CurrentRegion
      .Apply
   End With
End Sub

A+
 
Re : Pour le fun : TriSansDoublons Prenoms/Noms

Bonjour R@chid

Salut Grand Chaman

Une variante avec dictionnaire
NB: L'ami R@chid ayant le gout de la formule nous a mis des alea qui troublent un peu les resultats
C'est pourquoi j'ai mis en calcul manuel avant d'operer (pour recalculer faire F9)
Par ailleurs GCE tu peux vérifier ton résultat (il ne semble pas correspondre au mien)
 

Pièces jointes

Re : Pour le fun : TriSansDoublons Prenoms/Noms

Bonjour,
pour la colonne A (à adapter pour la colonne B) :
Code:
=SIERREUR(INDEX(ColA;EQUIV(PETITE.VALEUR(SI(EQUIV(ColA&ColB;ColA&ColB;0)=LIGNE(INDIRECT("1:"&LIGNES(ColA)));LIGNE(ColA));LIGNES($1:1));LIGNE(ColA);0));"")
ou en validant une plage :
Code:
=SIERREUR(INDEX(ColA;EQUIV(PETITE.VALEUR(SI(EQUIV(ColA&ColB;ColA&ColB;0)=LIGNE(INDIRECT("1:"&LIGNES(ColA)));LIGNE(ColA));LIGNE(INDIRECT("1:"&LIGNES(ColA))));LIGNE(ColA);0));"")

En traitant nom et prénom dans une seule colonne :
Code:
=SIERREUR(INDEX(ColA&" "&ColB;EQUIV(PETITE.VALEUR(SI(EQUIV(ColA&ColB;ColA&ColB;0)=LIGNE(INDIRECT("1:"&LIGNES(ColA)));LIGNE(ColA));LIGNES($1:1));LIGNE(ColA);0));"")
ou en validant une plage :
Code:
=SIERREUR(INDEX(ColA&" "&ColB;EQUIV(PETITE.VALEUR(SI(EQUIV(ColA&ColB;ColA&ColB;0)=LIGNE(INDIRECT("1:"&LIGNES(ColA)));LIGNE(ColA));LIGNE(INDIRECT("1:"&LIGNES(ColA))));LIGNE(ColA);0));"")
Validation matricielle pour l'ensemble de ces formules.
Formules tirées pour partie de ce fichier
A+
 
Re : Pour le fun : TriSansDoublons Prenoms/Noms

J'ai compris tri comme classement.
À partir du moment où j'ai des classements et des doublons à éliminer, je classe d'abord pour que les doublons se retrouvent ensembles.
Mais je fais toujours un classement virtuel, jamais réel: je classe les numéros de ligne selon l'ordre de leurs contenus. Je le fais avec un module de classe TableIndex qui a largement fait ses preuves.
Pour ne pas réinventer la poudre j'ai pris celui effectué dans le module de création de dictionnaires arborescents, que j'ai donc adjoint, mais dont je ne me sers pas ici.
 

Pièces jointes

Dernière édition:
Re : Pour le fun : TriSansDoublons Prenoms/Noms

Bonjour à tous,

J'y vais aussi de ma solution avec l'objet Dictionary :

Code:
Private Sub Worksheet_Calculate()
Dim n As Long, T, d As Object, x As String
With Application
  n = .Max(.Match("zzz", [A:A]), .Match("zzz", [B:B]))
  If n = 1 Then Exit Sub 'sécurité
  .ScreenUpdating = False
  .Calculation = xlCalculationManual
End With
T = Range("A2:B" & n)
Set d = CreateObject("Scripting.Dictionary")
For n = 1 To UBound(T)
  x = T(n, 1) & Chr(1) & T(n, 2)
  If d.exists(x) Then T(n, 1) = "": T(n, 2) = "" Else d(x) = ""
Next
With [K2:L2].Resize(UBound(T))
  .Value = T
  .Sort [K2], , [L2], Header:=xlNo 'tri sur 2 colonnes
End With
Range("K" & UBound(T) + 2 & ":L65536").ClearContents
End Sub
Attention, comme pierrejean, le calcul est mis en manuel (sur ordre).

Fichier joint.

A+
 

Pièces jointes

Dernière édition:
Re : Pour le fun : TriSansDoublons Prenoms/Noms

Bonsour®
Bonjour @ tous,
Encore pour le fun... 😛😉
Suite à ce fil.
On veut faire un tri sans doublons de Noms et Prénoms cette fois-ci.
Voir fichier joint...
@ + +

😎
en espérant avoir bien assimilé les exemples que tu as précédemment fournis...🙄

si l'on effectue préalablement la concaténation Prénoms_noms (ce qui ne doit pas être un problème sauf pour le fun ...)
il n'y a même pas besoin de colonne intermédiaire (feuil2)

la re-séparation prénoms/noms est un autre problème souvent évoqué ici
 

Pièces jointes

Re : Pour le fun : TriSansDoublons Prenoms/Noms

Re
J'ai compris tri comme classement.
Dans ce cas :
pour la colonne A (à adapter pour la colonne B) :
Code:
=SIERREUR(INDEX(ColA;EQUIV(PETITE.VALEUR(SI(EQUIV(ColA&ColB;ColA&ColB;0)=LIGNE(INDIRECT("1:"&LIGNES(ColA)));NB.SI(ColA;"<"&ColA)+NB.SI(ColB;"<"&ColB)/10^2);LIGNES($1:1));NB.SI(ColA;"<"&ColA)+NB.SI(ColB;"<"&ColB)/10^2;0));"")

Exemple si l'on veut nom et prénom dans une seule colonne :
En tirant la formule vers le bas :
Code:
=SIERREUR(INDEX(ColA&" "&ColB;EQUIV(PETITE.VALEUR(SI(EQUIV(ColA&ColB;ColA&ColB;0)=LIGNE(INDIRECT("1:"&LIGNES(ColA)));NB.SI(ColA;"<"&ColA)+NB.SI(ColB;"<"&ColB)/10^2);LIGNES($1:1));NB.SI(ColA;"<"&ColA)+NB.SI(ColB;"<"&ColB)/10^2;0));"")
En validant sur une seule plage :
Code:
=SIERREUR(INDEX(ColA&" "&ColB;EQUIV(PETITE.VALEUR(SI(EQUIV(ColA&ColB;ColA&ColB;0)=LIGNE(INDIRECT("1:"&LIGNES(ColA)));NB.SI(ColA;"<"&ColA)+NB.SI(ColB;"<"&ColB)/10^2);LIGNE(INDIRECT("1:"&LIGNES(ColA))));NB.SI(ColA;"<"&ColA)+NB.SI(ColB;"<"&ColB)/10^2;0));"")
A+
 
Re : Pour le fun : TriSansDoublons Prenoms/Noms

Bonjour @ tous,
Merci pour vos participations 🙂...
Je dois être expert en VBA afin de pouvoir comparer.
Merci aussi au formulisites-vbaistes David84, et merci aussi pour ton lien...

Voici comment j'ai procédé, toujours en validant des plages...

Pour K2:K40,
Code:
=SIERREUR(INDEX(ColA;EQUIV(PETITE.VALEUR(SI(EQUIV(ColA&ColB;ColA&ColB;0)=LIGNE(INDIRECT("1:"&LIGNES(ColA)));NB.SI(ColA;"<"&ColA));LIGNE(INDIRECT("1:"&LIGNES(ColA))));NB.SI(ColA;"<"&ColA);0));"")

Pour L2:L40,
Code:
=SIERREUR(INDEX(ColB;EQUIV(PETITE.VALEUR(SI(EQUIV(ColA&ColB;ColA&ColB;0)=LIGNE(INDIRECT("1:"&LIGNES(ColA)));NB.SI(ColA;"<"&ColA)*9^9+NB.SI(ColB;"<"&ColB));LIGNE(INDIRECT("1:"&LIGNES(ColA))));NB.SI(ColA;"<"&ColA)*9^9+NB.SI(ColB;"<"&ColB);0));"")

@ valider bien sûr par Ctrl+Maj+Entree

Voir PJ

@ + +
 

Pièces jointes

Re : Pour le fun : TriSansDoublons Prenoms/Noms

Bonsoir à tous,

Un autre essai par vba basé sur:
VB:
Sub Trier_sans_doublons()
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
  Range("A1").CurrentRegion.Copy
  Range("K1").PasteSpecial Paste:=xlPasteValues
  Range("K1").CurrentRegion.RemoveDuplicates Columns:=Array(1, 2), Header:=xlYes
  Range("K1").CurrentRegion.Sort key1:=Range("L1"), key2:=Range("K1"), Header:=xlYes
  Application.CutCopyMode = False
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
End Sub

Edit: ma solution ressemble comme deux gouttes d'eau à celle de Grand Chaman Excel que je salue 🙂
 

Pièces jointes

Dernière édition:
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
5
Affichages
308
Réponses
1
Affichages
234
Réponses
17
Affichages
784
Retour