Tri selon chiffres dans chaine de caractère

Bonjour à tous,

Je cherche à réaliser un tri croissant sous VBA avec la fonction "sort" selon les critères suivants :

j'ai une plage de cellule avec des chaines de caractère comme dans l'exemple suivant:

AAA14563

BB112365

CR12345D

Et je voudrais qu'elle soit triée de manière croissante selon le nombre à 5 chiffres vers la gauche en partant du dernier chiffre de la chaine.

Soit avec l'exemple précèdent :

CR12345D

BB112365

AAA14563

Merci de votre aide

Je ne sais pas si j'ai bien compris :

ici, la macro inverse le sens de la chaine de caractères : la dernière lettre ou le chiffre devient le premier.

Ensuite, la macro fait un tri croissant à partir de la nouvelle colonne...

si c'est correct, il suffira ensuite d'effacer la colonne créée

Merci pour ta réponse Game Over!

La fonction tri marche très bien mais en réalité je veux garder la chaine de caractère dans le même ordre, et trier uniquement suivant les cinq derniers chiffres, et donc ne pas prendre en compte le dernier caractère de la chaine si celui-ci n'est pas un chiffre:

SS78985AE

BB112365

MMPR25687

AAA14567

CR12345D

Je désire les avoir dans cet ordre:

CR12345D

BB112365

AAA14567

MMPR25687

SS78985AE

Je pense (pas sur du tout) qu'il faut aller chercher la fonction left(right(cells(i, 2), 2), 1), 5) mais après je ne sais pas vraiment comment extraire l'information et l'exploiter dans la fonction tri..

Merci

Bonjour,

Une solution en utilisant la fonction Mid

A+

Bonjour,

Sub triAlphANum()
  [B:B].Insert
  For Each c In Range([A2], [a65000].End(xlUp))
    n = Num(c, 1)
    c.Offset(, 1) = Right(n, 5)
  Next c
  Range("A2").CurrentRegion.Sort Key1:=[B2], Header:=xlYes
  [B:B].Delete
End Sub

Function Num(chaine, n)
  Set obj = CreateObject("vbscript.regexp")
  obj.Global = True
  obj.Pattern = "\d+"
  Set a = obj.Execute(chaine)
  If a.Count > n - 1 Then Num = a(n - 1) Else Num = ""
End Function

Ceuzin

50trialphanum4.zip (12.68 Ko)

Frangy, ta solution me convient très bien mais le seul problème c'est lorsqu'il y a un zéro au sein de la chaine de caractère, il ne le prend pas en compte..

TIX72553 72553

FI72223 72223

LIX62908 6298

FIX72603 7263

FIX62924 62924

Voici mon code:

Application.ScreenUpdating = False

Set Ws = ActiveWorkbook.Worksheets("Plant_Hierarchy")

DerLig = Ws.Range("D" & Rows.Count).End(xlUp).Row

For Each C In Ws.Range("D2:D" & DerLig)

Cptr = 0

For i = Len(C) To 1 Step -1

If IsNumeric(Mid(C, i, 1)) Then

Cptr = Cptr + 1

If Cptr < 6 Then C.Offset(0, 1) = Mid(C, i, 1) & C.Offset(0, 1)

End If

Next i

'If Len(C.Offset(0, 1)) < 5 Then

'C.Offset(0, 1).Delete

'End If

Application.DisplayAlerts = False

Next C

With Ws.Sort

.SortFields.Clear

.SortFields.Add Key:=Ws.Range("E2:E" & DerLig), _

SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal

.SetRange Ws.Range("D2:E" & DerLig)

.Apply

End With

'Ws.Range("E1:E" & DerLig).ClearContents

Set Ws = Nothing

Vois tu un truc à rajouter?

Si les chaines contiennent des espaces

Sub triAlphANum()
  [B:B].Insert
  For Each c In Range([A2], [a65000].End(xlUp))
    tmp = Replace(c, " ", "")
    n = Num(tmp, 1)
    c.Offset(, 1) = Right(n, 5)
  Next c
  Range("A2").CurrentRegion.Sort Key1:=[B2], Header:=xlYes
  [B:B].Delete
End Sub

Function Num(chaine, n)
  Set obj = CreateObject("vbscript.regexp")
  obj.Global = True
  obj.Pattern = "\d+"
  Set a = obj.Execute(chaine)
  If a.Count > n - 1 Then Num = a(n - 1) Else Num = ""
End Function

Cuezin

lorsqu'il y a un zéro au sein de la chaine de caractère, il ne le prend pas en compte.

As-tu essayé après avoir passé la colonne E au format Texte ?

A+

Merci Ceuzin pour ton code ça marche nickel!

Frangy oui c'est ce que j'ai fais de suite après t'avoir écrit tu m'as inspiré. Après je le repasse au format nombre pour effectuer le tri sinon ça ne marche pas!

Merci à vous!

Rechercher des sujets similaires à "tri chiffres chaine caractere"