Bonjour,
Remplace les "." par des ","
Bonjour à tous,
Voir le fichier joint.
Une méthode "tout Excel" y est proposée.
Non elle crée trois autres colonnes pas deux (si vous avez 3 niveaux).deux autres colonnes,
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
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
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 ?
Effectivement, merci fanch55, j'ai corrigé ma macro du post #9 en entrant des zéros avant le tri.Un petit pb avec ta proposition:
Cela ne pose pas de problème avec ma méthode, voyez ce fichier (2) et la macro adaptée :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.
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
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