Trie

Bonjour

J'ai une colonne ou il y a des valeurs de ce type :

H1B1

H1B23

H1B12

H1B2

H2B7

H4B8

H1B3

Lorsque je veux faire un tri je voudrais qu'il classe de cette façon : H1B1, H1B2, H1B3, H1B12, H1B23, H2B7, H4B8 etc...

La se n'est pas le cas quand on tri avec la fonction.

Bonjour,

Je te propose une solution consistant à créer 2 colonnes, l'une avec les nombres après "H" et l'autre avec les nombres après "B". Ensuite il suffit de faire un tri a 2 niveau de l'ensemble du tableau : 1er niveau = index H, puis 2nd = index B. Je te joint un fichier.

exemple3

Bonjour,

Ou alors remplacer l'ensemble des codes pour les repenser d'une façon utilisable :

H1B001

H1B002

H1B003

H1B012

H1B023

H2B007

H4B008

Merci

Mais j'ai fait une erreur dans mon message, il peut y avoir à la place de la lettre B une lettre À ou X ou autre, donc tenir compte de l'ordre alphabétique.

Quand à la lettre H celle ci reste toujours pour tous les cas

Bonjour, Salut à tous !

Une solution macro :

Sub TriH0B0()
    Dim hb(), hh, i%, j%, k%, bb$
    With Selection
        ReDim hb(1 To .Rows.Count, 1)
        For i = 1 To .Rows.Count
            hb(i, 0) = .Cells(i, 1)
            hh = Split(Replace(hb(i, 0), "H", ""), "B")
            hb(i, 1) = CInt(hh(0)) * 1000 + CInt(hh(1))
        Next i
        For i = 1 To UBound(hb) - 1
            For j = i + 1 To UBound(hb)
                If hb(j, 1) < hb(i, 1) Then
                    bb = hb(j, 0): k = hb(j, 1)
                    hb(j, 0) = hb(i, 0): hb(j, 1) = hb(i, 1)
                    hb(i, 0) = bb: hb(i, 1) = k
                End If
            Next j
        Next i
        ReDim Preserve hb(1 To .Rows.Count, 0)
        .Value = hb
    End With
End Sub

Tu places la macro dans un module standard.

Pour trier ta plage de valeurs H0B0, tu sélectionnes la plage-colonne à trier, tu lances la macro, et elle te restitue la colonne triée.

Cela implique que toutes tes valeurs soient de même type : H suivi d'un nombre suivi de B suivi d'un nombre, que tu n'aies qu'une colonne à trier, et que tu n'aies pas des milliers de lignes...

Sur les deux derniers points, il faudrait repenser la procédure si on veut trier une plage de plusieurs colonnes sur la colonne contenant les valeurs H0B0, ou si le nombre de lignes devient important (ça cela se verrait au ralentissement de l'exécution).

Et si le premier point n'est pas garantit, il faut écrire autre chose .

Cordialement.

edit : je vois que ma proposition est déjà caduque ! Tant pis. Je crois que dans ce cas, tu devrais aligner les nombres de chiffres, comme proposé par Xmenpl et faire un tri normal.

bonjour

j'ai pris la formule de PEDRO22, le pb est que si j'ai : H2H4 par exemple; il ne comprend pas le 2ème H et me met une erreur....comment faire pour contourner le pb

merci

Bonjour,

Mon exemple ne fonctionne que si la 1ère lettre est un H et la seconde un B. Il faut que tu l'adaptes dans le cas où ce n'est pas toujours ces lettres, mais la formule risque de devenir complexeD... Regarde du côté de VBA dans ce cas.

Bonjour à tous,

En VBA cela restait relativement simple tant qu'on avait H et B... Si le B varie, il faut tenir compte de cet élément pour le tri.

Je veux bien reprendre le code (quand je rentrerai) pour le réadapter, mais il faudrait garantir les autres éléments : que H ne varie pas, que le nombre qui suit H est toujours à un seul chiffre (ou non).

Cordialement.

Bonjour

Pour résumé :

  • La 1ère lettre 'H' ne changera jamais.
  • Les chiffres qui suit, il peut y en avoir 3 Max.
  • La 2ème lettre, peut aller de : A à Z.
  • Enfin les derniers chiffres, il peut y en avoir 3 Max.

Il faut faire un TRIE total, en prenant compte des chiffres et des lettres(surtout la 2ème lettre), du < au >.

Je pense que VBA serait plus adapté pour ce type de TRIE, sachant que je n'est aucune connaissance de VBA.

bonjour,

une proposition

Sub aargh()
    dl = Cells(Rows.Count, 1).End(xlUp).Row
    Columns(1).Insert shift:=xlToRight
    For i = 1 To dl
        c = Cells(i, 2)
        k = ""
        For j = 2 To 4
            If Not Mid(c, j, 1) Like "#" Then
                k = Left(c, 1) & Format(Mid(c, 2, j - 2), "000") & Mid(c, j, 1)
                Exit For
            End If
        Next j
        If k = "" Then Stop
        c = Right(c, Len(c) - j)
        k = k & Format(c, "000")
        Cells(i, 1) = k
    Next i
    Range("A1").Resize(dl, 2).Sort key1:=Range("A1"), order1:=xlAscending, Header:=xlNo
    Columns(1).Delete shift:=xlToLeft
End Sub

OK merci

Comment on inclut ça dans une cellule d'excel

Bonjour,

s'agissant d'une macro, cela ne se met pas dans une cellule excel.

il faut copier la macro dans ton classeur et une qu'elle est copiée, l'exécuter.

pour copier:

sur le forum :

sélectionner le code

faire ctrl-C pour copier le code

aller dans excel,

faire alt-F11, pour ouvrir l'éditeur de macro

faire menu, insérer, module

faire ctrl-V pour coller le code

faire alt-F11, pour revenir sur la feuille excel

-> la macro est installée

sauver le classeur (avec les macros -> format xlsm)

pour lancer la macro

faire ALT-F8, sélectionner la macro et choisir run

Bonjour,

Un peu différent de h2so4 ( ), mais la méthode est en gros la même.

Sub TriH0x0()
    Dim hx, hh, n, k%, i%, d%, et As Boolean
    hx = ActiveSheet.Range("A1").CurrentRegion.Resize(, 1)
    If hx(1, 1) Like "H#*[A-Z]*#" Then
        d = 1: et = False
    Else
        d = 2: et = True
    End If
    For i = d To UBound(hx)
        For k = 1 To Len(hx(i, 1))
            If Mid(hx(i, 1), k, 1) Like "#" Then
                n = n & Mid(hx(i, 1), k, 1)
            Else
                If n <> "" Then hh = hh & Format(CInt(n), "000"): n = ""
                hh = hh & Mid(hx(i, 1), k, 1)
            End If
        Next k
        hh = hh & Format(CInt(n), "000"): n = ""
        hx(i, 1) = hh: hh = ""
    Next i
    Application.ScreenUpdating = False
    With ActiveSheet
        .Range("B1").Resize(UBound(hx)).Insert xlShiftToRight
        .Range("B1").Resize(UBound(hx)).Value = hx
        .Range("A1").Resize(UBound(hx), 2).Sort key1:=.Range("B1"), order1:=xlAscending, _
          Header:=IIf(et, xlYes, xlNo)
        .Range("B1").Resize(UBound(hx)).Delete xlShiftToLeft
    End With
End Sub

NB- Compte-tenu de tes indications, le tri n'affecte qu'une seule colonne.

2quattro26140.xlsm (22.28 Ko)
Rechercher des sujets similaires à "trie"