VBA-TRIER CHIFFRE incluant des CHIFFRES AVEC UNE LETTRE

Celeda

XLDnaute Barbatruc
Bonjour,

Je suis à la recherche d'une macro qui me trierait des chiffres et des chiffres qui terminent par une lettre.
Excel trie d'abord les chiffres et ensuite place les chiffres avec une lettre à la fin et cela ne m'arrange pas du tout. Et en plus je souhaiterais que tout soit aligné à droite.
Pouvez-vous m'aider, svp.

Voici de quoi il en retourne :

ETAPE 1 - recup chiffres
114
20B
6
150
30A


ETAPE2 -Liste après tri
6
114
150
20B
30A

ETAPE3 - voilà ce que j'aimerais obtenir comme tri.
6
20B
30A
114
150

Merci à l'avance.
 
Dernière édition:

pierrejean

XLDnaute Barbatruc
Re : VBA-TRIER CHIFFRE incluant des CHIFFRES AVEC UNE LETTRE

Re

En fait les macros de job :) :) et JB ont un avantage elles trient sur 2 (ou plus) colonnes
Ceci inclut le problème de notre amie Celeda mais le problème plus général de tri
Je me suis demandé si l'on pouvait adapter le Quick Sort pour 2 colonnes et apparement j'obtiens un resultat (voir Tri pj2)
Prochaine étape : adapter pour un tableau ayant un nbre indeterminé de colonnes (mais je ne pense pas que ce soit de mon niveau !!)
 

Pièces jointes

  • Tri_ArrayChiffreLettre-Test_b.xls
    121 KB · Affichages: 39
  • Tri_ArrayChiffreLettre-Test_b.xls
    121 KB · Affichages: 44
  • Tri_ArrayChiffreLettre-Test_b.xls
    121 KB · Affichages: 46

pierrejean

XLDnaute Barbatruc
Re : VBA-TRIER CHIFFRE incluant des CHIFFRES AVEC UNE LETTRE

Re

Bien que le sujet n'ai pas l'air de passionner les foules, voici une macro pour tri rapide selon la 1ere colonne avec tri sur la partie numerique suivi du tri sur la partie alpha
 

Pièces jointes

  • Tri_ArrayChiffreLettre-Test_b.xls
    181.5 KB · Affichages: 49
  • Tri_ArrayChiffreLettre-Test_b.xls
    181.5 KB · Affichages: 57
  • Tri_ArrayChiffreLettre-Test_b.xls
    181.5 KB · Affichages: 57

david84

XLDnaute Barbatruc
Re : VBA-TRIER CHIFFRE incluant des CHIFFRES AVEC UNE LETTRE

Bonsoir pierrejean:),
Personnellement, le sujet m'intéresse, donc je te propose de continuer.
J'ai testé ton essai et j'ai 2 remarques :
1) un 1er lancement de la macro donne un tri dans un ordre alpha croissant et un 2ème lancement donne un tri dans un ordre décroissant : est-ce voulu ?
2) le tri ne se fait pas sur toutes les colonnes :
teste ce cas de figure :
1 54BBAB 54BBAB 54BBAB 54BBAB
1 54BBAB 54BBAB 54BBAB 54A
normalement la 2ème ligne doit passer devant la 1ère, or ce n'est pas le cas, ce qui est logique vu que ton code ne scinde que les données nombre-lettre de la 1ère colonne alors que toutes les colonnes doivent subir le même traitement.
Je regarderai demain de mon côté si je peux apporter une réponse adaptée.
A+
 

pierrejean

XLDnaute Barbatruc
Re : VBA-TRIER CHIFFRE incluant des CHIFFRES AVEC UNE LETTRE

Re

Le tri n'est effectivement réalisé que sur la 1ere colonne et les ex æquo ne sont pas triés sur les colonnes suivantes
Ce n'est pas non plus le cas pour les macros de job ou JB
Et il est vrai que ma macro ne donne pas toujours le même resultat d'un click à l'autre (mais toujours correct quant au tri avec critere sur la seule 1ere colonne)
Par ailleurs fait le test avec le tri classique d'Excel avec comme seul critere la colonne A (tu verras que les ex aequo ne sont pas triés sur les colonnes suivantes)
 

david84

XLDnaute Barbatruc
Re : VBA-TRIER CHIFFRE incluant des CHIFFRES AVEC UNE LETTRE

Re pierrejean,
d'accord avec toi sur tous les points de ton dernier message. Mais je pensais que tu cherchais une manière de trier l'ensemble des colonnes, d'où ma remarque.
C'est ce que je cherche à faire.
Ceci dit, l'exemple du tableau ne s'y prête pas car le mode de tri recherché n'est pas celui effectué classiquement par Excel. A mon avis, il faut donc partir d'un tableau multicolonne et chercher à obtenir un tri classique sur l'ensemble des colonnes.
Je suis sur une piste mais je bloque sur un os. Je vais donc ouvrir un fil sur ce sujet en mettant un exemple de tableau et en expliquant le résultat souhaité.
A+
 

job75

XLDnaute Barbatruc
Re : VBA-TRIER CHIFFRE incluant des CHIFFRES AVEC UNE LETTRE

Bonsoir sebcane,

Merci d'avoir ressorti cette discussion, ça me rajeunit :rolleyes:

Avec la macro Quick sort je trouve que c'est plus élégant :

Code:
Sub Trier()
Dim tablo, a$(), i&, t$
tablo = Range("A1:A2", Range("A" & Rows.Count).End(xlUp)) 'au moins 2 éléments
ReDim a(1 To UBound(tablo))
For i = 1 To UBound(a)
  t = tablo(i, 1)
  If t = "" Then
    a(i) = "zzzzzzzzz" 'pour placer à la fin
  ElseIf IsNumeric(Left(t, 1)) Then
    a(i) = String(9 - Len(CStr(Val(t))), "0") & t 'augmenter le 9 si nécessaire
  Else: a(i) = t: End If
Next
tri a, tablo, 1, UBound(a)
[A1].Resize(UBound(a)) = tablo
End Sub

Sub tri(a, b, gauc, droi) ' Quick sort
Dim ref, g, d, temp
ref = a((gauc + droi) \ 2)
g = gauc: d = droi
Do
    Do While a(g) < ref: g = g + 1: Loop
    Do While ref < a(d): d = d - 1: Loop
    If g <= d Then
      temp = a(g): a(g) = a(d): a(d) = temp
      temp = b(g, 1): b(g, 1) = b(d, 1): b(d, 1) = temp
      g = g + 1: d = d - 1
    End If
Loop While g <= d
If g < droi Then Call tri(a, b, g, droi)
If gauc < d Then Call tri(a, b, gauc, d)
End Sub
On ajoute le nombre de zéros adéquat devant le nombre pour faire le tri alphanumérique.

Fichier (4).

Bonne nuit.

Edit : de bon matin, fichier (4 bis) avec un tableau de plusieurs colonnes.

Cela dit j'ai testé avec un tableau de 55000 lignes x 3 colonnes.

Avec insertion de la colonne B le tri sur la feuille est 2 fois plus rapide 1,7 s - 3,7 s :cool:
 

Pièces jointes

  • Tri(4).xls
    40 KB · Affichages: 22
  • Tri(4).xls
    40 KB · Affichages: 22
  • Tri(4 bis).xls
    48.5 KB · Affichages: 23
Dernière édition:

de_hanstrapp

XLDnaute Occasionnel
Re : VBA-TRIER CHIFFRE incluant des CHIFFRES AVEC UNE LETTRE

Bonsoir sebcane,

Merci d'avoir ressorti cette discussion, ça me rajeunit :rolleyes:

Avec la macro Quick sort je trouve que c'est plus élégant :

Code:
Sub Trier()
Dim tablo, a$(), i&, t$
tablo = Range("A1:A2", Range("A" & Rows.Count).End(xlUp)) 'au moins 2 éléments
ReDim a(1 To UBound(tablo))
For i = 1 To UBound(a)
  t = tablo(i, 1)
  If t = "" Then
    a(i) = "zzzzzzzzz" 'pour placer à la fin
  ElseIf IsNumeric(Left(t, 1)) Then
    a(i) = String(9 - Len(CStr(Val(t))), "0") & t 'augmenter le 9 si nécessaire
  Else: a(i) = t: End If
Next
tri a, tablo, 1, UBound(a)
[A1].Resize(UBound(a)) = tablo
End Sub

Sub tri(a, b, gauc, droi) ' Quick sort
Dim ref, g, d, temp
ref = a((gauc + droi) \ 2)
g = gauc: d = droi
Do
    Do While a(g) < ref: g = g + 1: Loop
    Do While ref < a(d): d = d - 1: Loop
    If g <= d Then
      temp = a(g): a(g) = a(d): a(d) = temp
      temp = b(g, 1): b(g, 1) = b(d, 1): b(d, 1) = temp
      g = g + 1: d = d - 1
    End If
Loop While g <= d
If g < droi Then Call tri(a, b, g, droi)
If gauc < d Then Call tri(a, b, gauc, d)
End Sub
On ajoute le nombre de zéros adéquat devant le nombre pour faire le tri alphanumérique.

Fichier (4).

Bonne nuit.

Edit : de bon matin, fichier (4 bis) avec un tableau de plusieurs colonnes.

Cela dit j'ai testé avec un tableau de 55000 lignes x 3 colonnes.

Avec insertion de la colonne B le tri sur la feuille est 2 fois plus rapide 1,7 s - 3,7 s :cool:




Bonjour à tous,
Je ressors ce sujet du "placard" afin de l'adapter à ma problématique.
J'ai un tableau en plage B7:L145 avec des en-têtes en ligne 7 donc avec des données de B8:L145.
Je cherche à trier la colonne E8:E145 qui est composée de chiffres et de chiffres avec une lettre (Ex de code figurant dans cette colonne : 5010 ; 5011 ; 5012 ; 5012A ; 5012B etc.)

Je n'arrive pas à adapter le code ci_dessus à ma problématique.

@job75 pouvez vous me donner un coup de pouce ?

Merci par avance.

Nsapg
 

job75

XLDnaute Barbatruc
Bonjour nsapg, le fil,

Voyez le fichier joint et la macro du bouton :
VB:
Private Sub CommandButton1_Click()
Dim maxcar%, tablo, i&, x$, j%
With [B7].CurrentRegion
    maxcar = Evaluate("MAX(LEN(" & .Columns(4).Address & "))") 'nombre maximum de caractères
    tablo = .Columns(4).Resize(, 2) 'matrice, plus rapide, au moins 2 éléments
    For i = 2 To UBound(tablo)
        x = tablo(i, 1) & " "
        For j = 1 To Len(x)
            If Not IsNumeric(Mid(x, j, 1)) Then tablo(i, 1) = String(maxcar - j + 1, "0") & tablo(i, 1): Exit For 'ajout des zéros
    Next j, i
    Application.ScreenUpdating = False
    If FilterMode Then ShowAllData 'si la feuille est filtrée
    .Columns(5).EntireColumn.Insert 'ajout d'une colonne auxiliaire
    .Columns(5).NumberFormat = "@" 'format Texte qui conserve les zéros du début
    .Columns(5) = tablo 'restitution
    .Sort .Columns(5), xlAscending, Header:=xlYes 'tri sur la colonne auxiliaire
    .Columns(5).EntireColumn.Delete 'suppression de la colonne auxiliaire
End With
End Sub
A+
 

Pièces jointes

  • Tri alpha(1).xlsm
    21.6 KB · Affichages: 5

de_hanstrapp

XLDnaute Occasionnel
@job75 merci pour votre réponse.
Plutot qu'un "CommandButton" je souhaiterai l'affecter à une zone de texte via une macro.
J'ai crée un module et inséré le code de telle manière :

Sub trier()
Dim maxcar%, tablo, i&, x$, j%
With [B7].CurrentRegion
maxcar = Evaluate("MAX(LEN(" & .Columns(4).Address & "))") 'nombre maximum de caractères
tablo = .Columns(4).Resize(, 2) 'matrice, plus rapide, au moins 2 éléments
For i = 2 To UBound(tablo)
x = tablo(i, 1) & " "
For j = 1 To Len(x)
If Not IsNumeric(Mid(x, j, 1)) Then tablo(i, 1) = String(maxcar - j + 1, "0") & tablo(i, 1): Exit For 'ajout des zéros
Next j, i
Application.ScreenUpdating = False
If FilterMode Then ShowAllData 'si la feuille est filtrée
.Columns(5).EntireColumn.Insert 'ajout d'une colonne auxiliaire
.Columns(5).NumberFormat = "@" 'format Texte qui conserve les zéros du début
.Columns(5) = tablo 'restitution
.Sort .Columns(5), xlAscending, Header:=xlYes 'tri sur la colonne auxiliaire
.Columns(5).EntireColumn.Delete 'suppression de la colonne auxiliaire
End With
End Sub

A l’exécution j'ai un message d'erreur au niveau du "FilterMode"

Nsapg
 

job75

XLDnaute Barbatruc
La macro que j'ai donnée au post #39 était une innovation...

Mais il est plus simple d'utiliser la méthode de mon post #15, voyez ce fichier (2) :
VB:
Private Sub CommandButton1_Click()
Dim tablo, i&
With [B7].CurrentRegion
    tablo = .Columns(4).Resize(, 2) 'matrice, plus rapide, au moins 2 éléments
    For i = 2 To UBound(tablo)
        tablo(i, 1) = Val(tablo(i, 1))
    Next
    Application.ScreenUpdating = False
    If FilterMode Then ShowAllData 'si la feuille est filtrée
    .Columns(5).EntireColumn.Insert 'ajout d'une colonne auxiliaire
    .Columns(5) = tablo 'restitution
    .Sort .Columns(5), xlAscending, .Columns(4), , xlAscending, Header:=xlYes 'tri sur 2 colonnes
    .Columns(5).EntireColumn.Delete 'suppression de la colonne auxiliaire
End With
End Sub
PS : si vous mettez la macro dans un module standard il faut :
VB:
If ActiveSheet.FilterMode Then ActiveSheet.ShowAllData 'si la feuille est filtrée
 

Pièces jointes

  • Tri alpha(2).xlsm
    22.3 KB · Affichages: 5

job75

XLDnaute Barbatruc
Bonjour nsapg, le forum,

Si vous aviez déposé votre fichier j'aurais vu qu'il y avait des cellules vides !

Il suffit d'ajouter un test, voyez ce fichier (3) ;
VB:
Private Sub CommandButton1_Click()
Dim tablo, i&
With [B7].CurrentRegion
    tablo = .Columns(4).Resize(, 2) 'matrice, plus rapide, au moins 2 éléments
    For i = 2 To UBound(tablo)
        If tablo(i, 1) <> "" Then tablo(i, 1) = Val(tablo(i, 1))
    Next
    Application.ScreenUpdating = False
    If FilterMode Then ShowAllData 'si la feuille est filtrée
    .Columns(5).EntireColumn.Insert 'ajout d'une colonne auxiliaire
    .Columns(5) = tablo 'restitution
    .Sort .Columns(5), xlAscending, .Columns(4), , xlAscending, Header:=xlYes 'tri sur 2 colonnes
    .Columns(5).EntireColumn.Delete 'suppression de la colonne auxiliaire
End With
End Sub
Bonne journée.
 

Pièces jointes

  • Tri alpha(3).xlsm
    22.4 KB · Affichages: 2

dysorthographie

XLDnaute Accro
Bonsoir,
Code:
Public Function NumTxt(V As String) As String
Dim T As String, N As String
For i = 1 To Len(V)
    If IsNumeric(Mid(V, i, 1)) Then
        N = N & Mid(V, i, 1)
    Else
        If N <> "" Then T = T & Format(N, String(20, "0")): N = ""
        T = T & Mid(V, i, 1)
    End If
Next
If N <> "" Then T = T & Format(N, String(20, "0"))
NumTxt = T
End Function
 

Pièces jointes

  • NumTxt.xls
    50 KB · Affichages: 6

Discussions similaires

Statistiques des forums

Discussions
312 223
Messages
2 086 407
Membres
103 201
dernier inscrit
centrale vet