Microsoft 365 Trier de A à Z

Gourbi1986

XLDnaute Nouveau
Bonjour à tous,

J'ai un souci, dans le fichier que j'ai joint je n'arrive pas à conserver l'ordre de mes données dans la colonne, quand j'utilise la fonction trier de A à Z.
Pourriez-vous m'aider svp ?

Merci pour votre soutien.
 

Pièces jointes

  • Test A à Z.xlsx
    18.2 KB · Affichages: 29

Gourbi1986

XLDnaute Nouveau
Bonjour,
Remplace les "." par des ","

Bonjour M12,

Merci pour cette astuce mais j'y ai déjà pensé...
J'ai des sous numéros qui peuvent dépasser la dizaine donc ça va poser problème (décimale après la virgule), et aussi j'ai plusieurs sous niveaux par exemple 8.3/8.4/8.4.1/8.4.2 et si je mets des virgules ça ne prends pas en compte les autres niveaux.

donc impasse pour le moment.
 

Gourbi1986

XLDnaute Nouveau
Bonjour à tous,

Voir le fichier joint.
Une méthode "tout Excel" y est proposée.

Bonjour @mapomme,

Merci pour cette solution, elle est pas mal mais elle me crée deux autres colonnes, ce qui me gène car mon tableau initial contient déjà pas mal de colonnes, y'aurait-il une autre solution qui me permettrait d'avoir juste une colonne en conservant la forme des données ?

Merci pour votre soutien.
 

job75

XLDnaute Barbatruc
Bonsoir Gourbi1986, M12, R@chid, mapomme,

Voyez le fichier .xlsm joint et cette macro dans le code de la feuille :
VB:
Private Sub Worksheet_Calculate()
Dim T As Range, ordre%
Set T = ListObjects(1).DataBodyRange 'tableau structuré
Application.ScreenUpdating = False
Application.EnableEvents = False 'désactive les évènements
On Error Resume Next 'si aucune SpecialCell
ordre = IIf(T(1) < T(T.Rows.Count, 1), xlAscending, xlDescending)
With Workbooks.Add.Sheets(1) 'nouveau document
    .[A:A].NumberFormat = "@" 'format Texte
    .[A1].Resize(T.Rows.Count) = T.Value
    .[A:A].TextToColumns .[B1], xlDelimited, Other:=True, OtherChar:="." 'commande Convertir
    .UsedRange.SpecialCells(xlCellTypeBlanks) = 0 'pour que le classement soit correct
    .UsedRange.Sort .[B1], ordre, .[C1], , ordre, .[D1], ordre, Header:=xlNo 'tri sur 3 colonnes
    T.Columns(1).NumberFormat = "@" 'format Texte
    T = .[A1].Resize(T.Rows.Count).Value 'restitution
    T.Columns(1).NumberFormat = "General" 'format Standard
    .Parent.Close False 'ferme le document
End With
Application.EnableEvents = True 'réactive les évènements
Application.ScreenUpdating = True
End Sub
La formule en B1 se recalcule quand on trie le tableau, ce qui lance la macro.

Edit : entré des zéros dans les cellules vides du document auxiliaire.

A+
 

Pièces jointes

  • Test A à Z(1).xlsm
    28.1 KB · Affichages: 4
Dernière édition:

fanch55

XLDnaute Barbatruc
Bonjour à tous ,
Cela sent les formats hiérarchiques :
A placer dans un module et à tester :
VB:
Option Explicit
Sub test()
    Tri_Hierarchique [Tableau1[Colonne1]]
End Sub
Sub Tri_Hierarchique(TargetCol) ' le nom de la colonne de la table
Dim Tb      As Variant
Dim Tlo     As ListObject   ' Table structurée
Dim Tlc     As ListColumn   ' Colonne de travail
Dim Cell    As Range
Dim Hn      As String       ' Nom du TargetCol
Dim N       As Integer      ' nombre max de points dans la cellule
Dim I       As Integer

Set Tlo = TargetCol.ListObject
    Hn = TargetCol.Cells(0)
    Set Tlc = Tlo.ListColumns.Add(Position:=Tlo.ListColumns(Hn).Index + 1)
    With Tlc
        'On compte le nombre de "."
        .DataBodyRange.NumberFormat = "General"
        .DataBodyRange.Formula = "=LEN([" & Hn & "])-LEN(SUBSTITUTE([" & Hn & "],""."",""""))"
        ' On récupère le nombre max de points
        N = WorksheetFunction.Max(.DataBodyRange)
        ' On fait un "formatage" spécial aux valeurs
        For Each Cell In .DataBodyRange.Cells
            Tb = Split(Cell.Offset(0, -1).Text & String(N - Cell, "."), ".")
            For I = 0 To UBound(Tb): Tb(I) = Right(100000 + Val(Tb(I)), 5): Next
            Cell.Formula = Join(Tb, ".")
        Next
        ' Tri de la colonne
        Tlo.Sort.SortFields.Clear
        Tlo.Sort.SortFields.Add Key:=.Range, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
        Tlo.Sort.Header = xlYes
        Tlo.Sort.Apply
        ' suppression colonne de travail
        .Delete
    End With
End Sub
 

fanch55

XLDnaute Barbatruc
@job75, re-salut, décidément on se croise.
Un petit pb avec ta proposition:
1605634553526.png
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Re,

Bonjour @mapomme,
Merci pour cette solution, elle est pas mal mais elle me crée deux autres colonnes, ce qui me gène car mon tableau initial contient déjà pas mal de colonnes, y'aurait-il une autre solution qui me permettrait d'avoir juste une colonne en conservant la forme des données ?

Ne vous battez pas! ça m'étonnerait que le tableau structuré soit limité à une seule colonne. Et si il y a plusieurs colonnes, alors le tableau à trier sera sans doute tout le tableau structuré et non pas seulement une seule colonne.
 

job75

XLDnaute Barbatruc
Ne vous battez pas! ça m'étonnerait que le tableau structuré soit limité à une seule colonne. Et si il y a plusieurs colonnes, alors le tableau à trier sera sans doute tout le tableau structuré et non pas seulement une seule colonne.
Cela ne pose pas de problème avec ma méthode, voyez ce fichier (2) et la macro adaptée :
VB:
Private Sub Worksheet_Calculate()
Dim T As Range, ordre%, cc%
Set T = ListObjects(1).DataBodyRange 'tableau structuré
Application.ScreenUpdating = False
Application.EnableEvents = False 'désactive les évènements
On Error Resume Next 'si aucune SpecialCell
ordre = IIf(T(1) < T(T.Rows.Count, 1), xlAscending, xlDescending)
cc = T.Columns.Count
With Workbooks.Add.Sheets(1) 'nouveau document
    .[A:A].NumberFormat = "@" 'format Texte
    .[A1].Resize(T.Rows.Count, cc) = T.Value
    .[A:A].TextToColumns .Cells(1, cc + 1), xlDelimited, Other:=True, OtherChar:="." 'commande Convertir
    .UsedRange.Columns(cc + 1).Resize(, .UsedRange.Columns.Count - cc).SpecialCells(xlCellTypeBlanks) = 0 'pour que le classement soit correct
    .UsedRange.Sort .Columns(cc + 1), ordre, .Columns(cc + 2), , ordre, .Columns(cc + 3), ordre, Header:=xlNo 'tri sur 3 colonnes
    T.Columns(1).NumberFormat = "@" 'format Texte
    T = .[A1].Resize(T.Rows.Count, cc).Value 'restitution
    T.Columns(1).NumberFormat = "General" 'format Standard
    .Parent.Close False 'ferme le document
End With
Application.EnableEvents = True 'réactive les évènements
Application.ScreenUpdating = True
End Sub
Le tri du tableau se fait toujours sur la 1ère colonne, il sera inopérant sur les autres colonnes.

A+
 

Pièces jointes

  • Test A à Z(2).xlsm
    33.2 KB · Affichages: 2
Dernière édition:

job75

XLDnaute Barbatruc
Dans ce fichier (3) j'utilise 2 OptionButtons pour lancer le tri :
VB:
Private Sub OptionButton1_Change()
Tri IIf(OptionButton1, xlAscending, xlDescending)
End Sub

Sub Tri(ordre%)
Dim T As Range, cc%
Set T = ListObjects(1).DataBodyRange 'tableau structuré
Application.ScreenUpdating = False
On Error Resume Next 'si aucune SpecialCell
cc = T.Columns.Count
With Workbooks.Add.Sheets(1) 'nouveau document
    .[A:A].NumberFormat = "@" 'format Texte
    .[A1].Resize(T.Rows.Count, cc) = T.Value
    .[A:A].TextToColumns .Cells(1, cc + 1), xlDelimited, Other:=True, OtherChar:="." 'commande Convertir
    .UsedRange.Columns(cc + 1).Resize(, .UsedRang.Columns.Count - cc).SpecialCells(xlCellTypeBlanks) = 0 'pour que le classement soit correct
    .UsedRange.Sort .Columns(cc + 1), ordre, .Columns(cc + 2), , ordre, .Columns(cc + 3), ordre, Header:=xlNo 'tri sur 3 colonnes
    T.Columns(1).NumberFormat = "@" 'format Texte
    T = .[A1].Resize(T.Rows.Count, cc).Value 'restitution
    T.Columns(1).NumberFormat = "General" 'format Standard
    .Parent.Close False 'ferme le document
End With
Application.ScreenUpdating = True
End Sub
 

Pièces jointes

  • Test A à Z(3).xlsm
    40.6 KB · Affichages: 6
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
314 499
Messages
2 110 247
Membres
110 711
dernier inscrit
chmessi