Partager via

EXCEL VBA : trier plusieurs valeurs alphanumériques dans une cellule

Anonyme
2022-02-17T16:59:56+00:00

Bonjour,

J'ai des cellules dans une colonne avec des "groupes" de caractères alphanumériques (toujours séparés par un tiret) :

L45
K20-M23-M15
K22-L50-N3-K2

Ce que je souhaite obtenir :

L45
K20-M15-M23
K2-K22-L50-N3

Existe-t-il une macro ou une formule permettant de trier, par ordre croissant, dans chaque cellule les "groupes" alphanumériques ; le tri croissant d'abord par lettre, puis par chiffre.

Je remercie par avance, toute personne qui pourra m'apporter son aide.

Microsoft 365 et Office | Excel | Autres | Windows

Question verrouillée. Cette question a été migrée à partir de la Communauté Support Microsoft. Vous pouvez voter pour indiquer si elle est utile, mais vous ne pouvez pas ajouter de commentaires ou de réponses ni suivre la question.

0 commentaires Aucun commentaire

Réponse acceptée par l’auteur de la question

DanielCo 107.7K Points de réputation
2022-02-18T11:54:52+00:00

Essaie

Sub test1()
Dim C As Range, Tabl As Variant, Temp As String, Tabl1() As String
Dim i As Long, Txt As String, Num As String, X As Long, Ind As Long, Tabl3() As String
For Each C In Range("A1", Cells(Rows.Count, 1).End(xlUp))
Tabl = Split(C.Value, "-")
Ind = -1
For Each Item In Tabl
Txt = ""
Num = ""
For X = 1 To Len(Item)
If Mid(Item, X, 1) >= "9" Then
Txt = Txt & Mid(Item, X, 1)
Else
Num = Num & Mid(Item, X, 1)
End If
Next X
Ind = Ind + 1
ReDim Preserve Tabl1(Ind)
Tabl1(Ind) = Txt & Application.Rept(0, 10 - Len(Num)) & Num & "*" & Item
Next Item
For i = LBound(Tabl1) To UBound(Tabl)
For j = i + 1 To UBound(Tabl1)
If UCase(Tabl1(i)) > UCase(Tabl1(j)) Then
Temp = Tabl1(j)
Tabl1(j) = Tabl1(i)
Tabl1(i) = Temp
End If
Next j
Next i
For i = 0 To UBound(Tabl)
Tabl(i) = Split(Tabl1(i), "*")(1)
Next i
C = Join(Tabl)
Erase Tabl
Erase Tabl1
Next C
End Sub

Daniel

Cette réponse a-t-elle été utile ?

2 personnes ont trouvé cette réponse utile.
0 commentaires Aucun commentaire

6 réponses supplémentaires

  1. DanielCo 107.7K Points de réputation
    2022-02-18T06:56:56+00:00

    Bonjour,

    C'est le tri standard des chaînes alphanumériques. L'ordi tri d'abord sur le premier caractère de gauche, "K", puis sur le second, etc. C'est un peu plus compliqué, dans ton cas. Je regarde cette après-midi.

    Daniel

    Cette réponse a-t-elle été utile ?

    0 commentaires Aucun commentaire
  2. Anonyme
    2022-02-17T18:22:35+00:00

    Bonsoir Daniel,

    Mon enthousiasme m'a fait écrire trop vite...

    Petit souci : .....

    Si on a par exemple

    K22-K2-K3-K33

    Le code trie de la façon suivante :

    K2-K22-K3-K33

    Au lieu de :

    K2-K3-K22-K33

    As-tu une solution pour cela ?

    Merci par avance de ton aide.

    Sandra

    Cette réponse a-t-elle été utile ?

    0 commentaires Aucun commentaire
  3. Anonyme
    2022-02-17T18:16:29+00:00

    Bonjour Daniel,

    Merci beaucoup !

    Ton code fait exactement ce que je souhaite faire.

    Merci encore et bonne soirée.

    Sandra

    Cette réponse a-t-elle été utile ?

    0 commentaires Aucun commentaire
  4. DanielCo 107.7K Points de réputation
    2022-02-17T17:50:05+00:00

    Bonjour,

    Les données étant en colonne A à partir de A1 :

    Sub test()
    Dim C As Range, Tabl As Variant, Temp As String
    For Each C In Range("A1", Cells(Rows.Count, 1).End(xlUp))
    Tabl = Split(C.Value, "-")
    For i = LBound(Tabl) To UBound(Tabl)
    For j = i + 1 To UBound(Tabl)
    If UCase(Tabl(i)) > UCase(Tabl(j)) Then
    Temp = Tabl(j)
    Tabl(j) = Tabl(i)
    Tabl(i) = Temp
    End If
    Next j
    Next i
    C.Value = Join(Tabl, "-")
    Next C
    End Sub

    Cordialement.

    Daniel

    Cette réponse a-t-elle été utile ?

    0 commentaires Aucun commentaire