Tri alphabétique avec caractères spéciaux

stefiskool

XLDnaute Nouveau
Bonjour à tous, j'ai besoin d'aide pour un truc apparemment très simple mais pour lequel je ne trouve pas de solution.

J'ai une liste de noms, dont certains commencent par un "-".

Et j'aimerai les trier par ordre alphabétique de la première lettre du nom, sans tenir compte des caractères spéciaux.

Dans le petit fichier que je vous met en exemple, on voit bien que ce "-" n'est pas gênant s'il n'y a pas d'espace entre celui-ci et la première lettre.

Par contre, en cas d'espace entre les 2, alors ce nom se met automatiquement en premier, et je n'arrive pas à contourner celà.

La contrainte est évidemment que je ne veux pas changer la syntaxe des noms, sinon je n'aurai pas ce problème et je n'aurai pas besoin de vous.

Merci beaucoup pour votre aide!!!
 

Pièces jointes

  • tri.xlsx
    8.9 KB · Affichages: 50
  • tri.xlsx
    8.9 KB · Affichages: 48

CISCO

XLDnaute Barbatruc
Re : Tri alphabétique avec caractères spéciaux

Bonjour

Une possibilité avec une colonne intermédiaire. On peut faire plus court en donnant des noms à certaines parties des formules.

@ plus
 

Pièces jointes

  • tri2.xlsx
    9.6 KB · Affichages: 26
  • tri2.xlsx
    9.6 KB · Affichages: 27
Dernière édition:

job75

XLDnaute Barbatruc
Re : Tri alphabétique avec caractères spéciaux

Re,

Dans cette macro j'ai ajouté la variable P qui permet de copier le tableau avec ses formats :

Code:
Sub Trier()
Dim P As Range, dest As Range, t, a(), i&
Set P = [A1].CurrentRegion.Offset(1)
Set dest = [G2] 'cellule de destination, à adapter
t = P 'matrice, plus rapide
ReDim a(1 To UBound(t), 1 To 1)
For i = 2 To UBound(a)
  a(i, 1) = Trim(Replace(t(i, 1), "-", ""))
Next
Application.ScreenUpdating = False
dest.Resize(Rows.Count - dest.Row + 1, P.Columns.Count).Clear 'RAZ
P.Copy dest 'permet de copier aussi les formats
dest.EntireColumn.Insert 'insert une colonne
dest(1, 0).Resize(UBound(t)) = a
dest(1, 0).Resize(UBound(t), P.Columns.Count + 1).Sort dest(1, 0), Header:=xlYes 'tri
dest(1, 0).EntireColumn.Delete 'supprime la colonne
End Sub
Edit : dans votre configuration CurrentRegion fait mieux l'affaire.

Fichier (3).

A+
 

Pièces jointes

  • Tri(3).xlsm
    28 KB · Affichages: 39
Dernière édition:

stefiskool

XLDnaute Nouveau
Re : Tri alphabétique avec caractères spéciaux

Bonjour

A lire cela

on pourrait croire que c'est que tu veux obtenir... ce qui est en contradiction avec


Tu aurais mieux fait d'écrire

Conclusion : A quoi sert cette colonne "noms triés" dans ton fichier ?

Si je trouve une formule, je la posterai un peu plus tard...

@ plus

Dans mon fichier cette colonne servait à montrer ce que donnait un tri alphabétique classique, pas ce que je cherchait à obtenir, je me suis mal exprimé dans la déscription de mon problème, vraiment dsl pour t'avoir fait perdre du temp!!!
 

stefiskool

XLDnaute Nouveau
Re : Tri alphabétique avec caractères spéciaux

Bonjour

Une possibilité avec une colonne intermédiaire. On peut faire plus court en donnant des noms à certaines parties des formules.

@ plus

Rebonjour Cisco. Ta proposition fonctionne bien. Je ne comprend absolument rien à la formule que tu utilise, mais ça fonctionne. Le principe est un petit peu le même que la première proposition de djidji59430, vous utilisez une autre colonne comme critère pour effectuer le tri. Ca façon de fonctionner était plus simple, mais plus limitée car elle ne traitait que les caractères spéciaux "-", alors que la tienne visiblement traite tous les cas. J'ai compris que ta formule sert à classer les noms par rang, et ensuite les trier.

Re,

Dans cette macro j'ai ajouté la variable P qui permet de copier le tableau avec ses formats :

Code:
Sub Trier()
Dim P As Range, dest As Range, t, a(), i&
Set P = [A1].CurrentRegion.Offset(1)
Set dest = [G2] 'cellule de destination, à adapter
t = P 'matrice, plus rapide
ReDim a(1 To UBound(t), 1 To 1)
For i = 2 To UBound(a)
  a(i, 1) = Trim(Replace(t(i, 1), "-", ""))
Next
Application.ScreenUpdating = False
dest.Resize(Rows.Count - dest.Row + 1, P.Columns.Count).Clear 'RAZ
P.Copy dest 'permet de copier aussi les formats
dest.EntireColumn.Insert 'insert une colonne
dest(1, 0).Resize(UBound(t)) = a
dest(1, 0).Resize(UBound(t), P.Columns.Count + 1).Sort dest(1, 0), Header:=xlYes 'tri
dest(1, 0).EntireColumn.Delete 'supprime la colonne
End Sub
Edit : dans votre configuration CurrentRegion fait mieux l'affaire.

Fichier (3).

A+

Ta macro est superbe, elle fonctionne nickel et ne nécessite pas de créer une autre colonne.
Mais mes connaissances sont limitées, et c'est la première fois aujourd'hui que j'ouvre une macro pour la modifier et que je découvre ce dialogue.
Du coup je n'arrive absolument pas à l'appliquer à mon grand tableau.

Du coup, je pense que par simplicité, et pour utiliser quelque chose que je comprend au moins, je vais m'en tenir à l'une des deux propositions qui proposent d'effectuer le tri sur une colonne supplémentaire, je la masque rai pour ne pas qu'elle apparaisse dans mon tableau.


Je vous remercie tous beaucoup de prendre du temps pour essayer de me rendre service, c'est vraiment très gentils!
 

stefiskool

XLDnaute Nouveau
Re : Tri alphabétique avec caractères spéciaux

Re,

Dans cette macro j'ai ajouté la variable P qui permet de copier le tableau avec ses formats :

Code:
Sub Trier()
Dim P As Range, dest As Range, t, a(), i&
Set P = [A1].CurrentRegion.Offset(1)
Set dest = [G2] 'cellule de destination, à adapter
t = P 'matrice, plus rapide
ReDim a(1 To UBound(t), 1 To 1)
For i = 2 To UBound(a)
  a(i, 1) = Trim(Replace(t(i, 1), "-", ""))
Next
Application.ScreenUpdating = False
dest.Resize(Rows.Count - dest.Row + 1, P.Columns.Count).Clear 'RAZ
P.Copy dest 'permet de copier aussi les formats
dest.EntireColumn.Insert 'insert une colonne
dest(1, 0).Resize(UBound(t)) = a
dest(1, 0).Resize(UBound(t), P.Columns.Count + 1).Sort dest(1, 0), Header:=xlYes 'tri
dest(1, 0).EntireColumn.Delete 'supprime la colonne
End Sub
Edit : dans votre configuration CurrentRegion fait mieux l'affaire.

Fichier (3).

A+

Je reviens vers toi car j'aimerai beaucoup utiliser ta macro qui m'éviterai la création d'une colonne supplémentaire. Mais après des dizaines d'essais, je ne parviens pas à l'appliquer à mon tableau.

Voici la macro que j'ai actuellement dans mon fichier, et qui du coup me fait un tri alphabétique sur la colonne A, mais avec le soucis des caractères spéciaux qui se mettent en tête.

Sub classement_dc()
'
' classement_dc Macro
'

'
Range("A4:AB58").Select
ActiveWindow.SmallScroll Down:=-45
ActiveWorkbook.Worksheets("DC du jeudi").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("DC du jeudi").Sort.SortFields.Add Key:=Range( _
"A4:A58"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
xlSortNormal
With ActiveWorkbook.Worksheets("DC du jeudi").Sort
.SetRange Range("A4:AB58")
.Header = xlGuess
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Range("A2").Select
End Sub

Tu saurais me dire ce que je dois modifier pour arriver à mes fins stp???
 

job75

XLDnaute Barbatruc
Re : Tri alphabétique avec caractères spéciaux

Bonjour stefiskool,

Je reviens vers toi car j'aimerai beaucoup utiliser ta macro qui m'éviterai la création d'une colonne supplémentaire. Mais après des dizaines d'essais, je ne parviens pas à l'appliquer à mon tableau.

Si vous voulez que je vous aide joignez votre fichier réel, en l'allégeant au besoin et sans données confidentielles.

A+
 

job75

XLDnaute Barbatruc
Re : Tri alphabétique avec caractères spéciaux

Re,

Sans fichier on ne pouvait pas deviner... Voici la macro adaptée :

Code:
Sub Classement()
Dim P As Range, t, a(), i&
Set P = [A1].CurrentRegion
Set P = P.Resize(P.Rows.Count - 2) 'retire les 2 dernières lignes
t = P 'matrice, plus rapide
ReDim a(1 To UBound(t), 1 To 1)
For i = 2 To UBound(a)
  a(i, 1) = Trim(Replace(t(i, 1), "-", ""))
Next
Application.ScreenUpdating = False
P(1).EntireColumn.Insert 'insert une colonne
P(1, 0).Resize(UBound(t)) = a
P(1, 0).Resize(UBound(t), P.Columns.Count + 1).Sort P(1, 0), Header:=xlYes 'tri
P(1, 0).EntireColumn.Delete 'supprime la colonne
End Sub
A+
 

stefiskool

XLDnaute Nouveau
Re : Tri alphabétique avec caractères spéciaux

Je suis désolé mais quand je l'applique, cela me crée une erreur, d'après le message cela vient de cellules fusionnées. Cela vient du fait que pour alléger le fichier j'ai déplacé des cellules il me semble.

Je vous envoie mon fichier original, tel qu'il est disposé, j'ai juste modifié les noms pour rester confidentiel.

C'est la dernière fois que je vous embête, vous avez déjà passé beaucoup de temps sur mon problème, et je vous en suis reconnaissant.
Si cela ne fonctionne pas, je n'insisterai pas et je ferai autrement.

Merci beaucoup!!!
 

Pièces jointes

  • Classeur1.xlsm
    54.3 KB · Affichages: 50
  • Classeur1.xlsm
    54.3 KB · Affichages: 40

job75

XLDnaute Barbatruc
Re : Tri alphabétique avec caractères spéciaux

Re,

C'est un peu pénible parce que chaque fois vous avez présenté des fichiers qui ne correspondaient pas à la réalité.

Vous auriez pu comprendre, avec tous les exemples que j'ai donnés, qu'il faut tenir compte de toutes les lignes de titres.

Avec votre dernier fichier utilisez donc :

Code:
Sub Classement()
Dim P As Range, t, a(), i&
Set P = [A2].CurrentRegion.Offset(1)
Set P = P.Resize(P.Rows.Count - 3) 'retire les 2 dernières lignes + 1 ligne vide
t = P 'matrice, plus rapide
ReDim a(1 To UBound(t), 1 To 1)
For i = 2 To UBound(a)
  a(i, 1) = Trim(Replace(t(i, 1), "-", ""))
Next
Application.ScreenUpdating = False
P(1).EntireColumn.Insert 'insert une colonne
P(1, 0).Resize(UBound(t)) = a
P(1, 0).Resize(UBound(t), P.Columns.Count + 1).Sort P(1, 0), Header:=xlYes 'tri
P(1, 0).EntireColumn.Delete 'supprime la colonne
End Sub
A+
 

stefiskool

XLDnaute Nouveau
Re : Tri alphabétique avec caractères spéciaux

Désolé de ne pas comprendre le langage des macros :eek:

Néanmoins si je vous avais donné directement le bon fichier, ça aurait été plus rapide. Je m'en excuse.

Merci beaucoup pour tout le temps que vous m'avez consacré !!!!!!!!
 

CISCO

XLDnaute Barbatruc
Re : Tri alphabétique avec caractères spéciaux

Bonjour

Dans ma dernière proposition, on pourrait assez facilement supprimer la colonne intermédiaire C si NB.SI acceptait de travailler avec des paramètres contenant la fonction SUBSTITUE (du style NB.SI(SUBSTITUE(......);"<"&SUBSTITUE(.....))) ou un nom défini dans le gestionnaire de noms lui aussi avec SUBSTITUE (du style listemodifiée = SUBSTITUE(SUBSTITUE(Feuil1!$A$3:$A$12;" ";"");"-";""), et avec NB.SI(listemodifiée;"<"&listemodifiée)). On aurait alors quelque chose du genre
Code:
INDEX(A$3:A$7;EQUIV(PETITE.VALEUR(NB.SI(listemodifiée;"<"&listemodifiée);LIGNES($2:2));NB.SI(listemodifiée;"<"&listemodifiée);0))
Hors ce n'est pas le cas, cela ne fonctionne pas.

Donc, après maints zigzags, et en n'utilisant pas NB.SI pour classer les noms de la liste en colonne A, voici une possibilité en pièce jointe avec une seule colonne, mais ne fonctionnant que pour des noms ayant au max 6 caractères non spéciaux (C'est facile de rajouter l'utilisation d'un 7ème ou d'un 8ème caractère, mais la formule est vraiment longue).

En A3:A12 la liste de noms pris en exemple.
En B3:B12 la formule permettant de classer chacun de ces noms à partir du CODE de chaque lettre composant ces noms, avec au total 6 x 2 = 12 chiffres. Ainsi 010000000000 est associé à la lettre a, 010100000000 au mot aa, et ainsi de suite.
En C3:C12, les noms de la colonne A classés par ordre alphabétique, mais avec les vides et les doublons
En D3: D12, idem, mais avec des parties de la formule nommées liste6caractères.
En E3:E12, idem sans les vides ni les doublons.
En F3:F12, une formule donnant presque les mêmes résultats que B3:B12, mais avec une formule matricielle prenant en compte automatiquement le nombre max de caractères des mots de la colonne A (donc plus de 6 si besoin est). Malheureusement, je n'ai pas réussi à l'implanter dans les formules des colonnes C, D et E.

On peut bien sûr ne garder qu'une des colonnes C, D ou E et supprimer les autres.

@ plus
 

Pièces jointes

  • tri5.xlsx
    11.1 KB · Affichages: 35
Dernière édition:

stefiskool

XLDnaute Nouveau
Re : Tri alphabétique avec caractères spéciaux

Bonjour

Dans ma dernière proposition, on pourrait assez facilement supprimer la colonne intermédiaire C si NB.SI acceptait de travailler avec des paramètres contenant la fonction SUBSTITUE (du style NB.SI(SUBSTITUE(......);"<"&SUBSTITUE(.....))) ou un nom défini dans le gestionnaire de noms lui aussi avec SUBSTITUE (du style listemodifiée = SUBSTITUE(SUBSTITUE(Feuil1!$A$3:$A$12;" ";"");"-";""), et avec NB.SI(listemodifiée;"<"&listemodifiée)). On aurait alors quelque chose du genre
Code:
INDEX(A$3:A$7;EQUIV(PETITE.VALEUR(NB.SI(listemodifiée;"<"&listemodifiée);LIGNES($2:2));NB.SI(listemodifiée;"<"&listemodifiée);0))
Hors ce n'est pas le cas, cela ne fonctionne pas.

Donc, après maints zigzags, et en n'utilisant pas NB.SI pour classer les noms de la liste en colonne A, voici une possibilité en pièce jointe avec une seule colonne, mais ne fonctionnant que pour des noms ayant au max 6 caractères non spéciaux (C'est facile de rajouter l'utilisation d'un 7ème ou d'un 8ème caractère, mais la formule est vraiment longue).

En A3:A12 la liste de noms pris en exemple.
En B3:B12 la formule permettant de classer chacun de ces noms à partir du CODE de chaque lettre composant ces noms, avec au total 6 x 2 = 12 chiffres. Ainsi 010000000000 est associé à la lettre a, 010100000000 au mot aa, et ainsi de suite.
En C3:C12, les noms de la colonne A classés par ordre alphabétique, mais avec les vides et les doublons
En D3: D12, idem, mais avec des parties de la formule nommées liste6caractères.
En E3:E12, idem sans les vides ni les doublons.
En F3:F12, une formule donnant presque les mêmes résultats que B3:B12, mais avec une formule matricielle prenant en compte automatiquement le nombre max de caractères des mots de la colonne A (donc plus de 6 si besoin est). Malheureusement, je n'ai pas réussi à l'implanter dans les formules des colonnes C, D et E.

On peut bien sûr ne garder qu'une des colonnes C, D ou E et supprimer les autres.

@ plus
Merci pour ton travail, impressionnant !!!
 

CISCO

XLDnaute Barbatruc
Re : Tri alphabétique avec caractères spéciaux

Bonjour à tous

Si quelqu'un proposait une solution plus simple, par formules, sans colonne intermédiaire, acceptant automatiquement des mots de n'importe quelle longueur, cela serait encore plus sympa (Ma dernière proposition n'étant valable que pour 6 caractères au max).

@ plus
 
Dernière édition:

Discussions similaires

Réponses
43
Affichages
2 K
Réponses
8
Affichages
445

Statistiques des forums

Discussions
312 239
Messages
2 086 503
Membres
103 236
dernier inscrit
Menni