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:

david84

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

Bonjour,
un essai en passant par des tableaux (donc sans insertion de colonne) à tester plus avant (cf.fichier).
A+
 

Pièces jointes

  • Copie de TriNumerique-Arr.xls
    41.5 KB · Affichages: 76
  • Copie de TriNumerique-Arr.xls
    41.5 KB · Affichages: 89
  • Copie de TriNumerique-Arr.xls
    41.5 KB · Affichages: 80

pierrejean

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

Re

@ david84
Bonne idée que d'utiliser les tableaux mais .....
1)ta macro ne trie pas sur place
2)ta macro ne trie pas correctement les alpha (54DA avant 54AB 54W avant 54DA)

dans ton fichier j'ai ajouté ma version avec tableaux (a controler bien sur et eventuellement a ameliorer sur les plans de la concision et de l'elegance qui sont loin , très loin, d'etre mon fort)
 

Pièces jointes

  • Copie de TriNumerique-Arr.xls
    48.5 KB · Affichages: 67
  • Copie de TriNumerique-Arr.xls
    48.5 KB · Affichages: 65
  • Copie de TriNumerique-Arr.xls
    48.5 KB · Affichages: 69

david84

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

Re pierrejean:),
1)ta macro ne trie pas sur place
Si, il suffit de la modifier comme suit :
Code:
Sub triArr()
Dim i&, Nb, temp, Pl As Range
Set Pl = Range("A2:a" & Range("A" & Rows.Count).End(xlUp).Row)
Dim tablo()
ReDim Preserve tablo(1 To Pl.Rows.Count)
For i = 1 To Pl.Rows.Count
tablo(i) = Val(Pl(i)) + i / 10 ^ 2
Next i
temp = tablo
Call tri(temp, LBound(temp), UBound(temp))
For i = 1 To Pl.Rows.Count
temp(i) = Pl(Application.Match(temp(i), tablo, 0))
Next i
[A2].Resize(UBound(temp)) = Application.Transpose(temp)
End Sub
Sub tri(a, gauc, droi) ' Quick sort
  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
      g = g + 1
      d = d - 1
    End If
  Loop While g <= d
  If g < droi Then Call tri(a, g, droi)
  If gauc < d Then Call tri(a, gauc, d)
End Sub

2)ta macro ne trie pas correctement les alpha (54DA avant 54AB 54W avant 54DA)
effectivement mais je ne pensais pas que c'était le but recherché en relisant la demande de Celeda.
Je vais regarder mais je ne pense pas amener quelque chose de réellement différent que ta proposition.
A+
 

david84

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

Re re pierrejean,
suite à ta remarque concernant le tri alpha, ci-joint une proposition à tester :
Code:
Sub triArr2()
Dim i&, j, Nb, temp, Pl As Range
Set Pl = Range("A2:A" & Range("A" & Rows.Count).End(xlUp).Row)

Dim tablo()
ReDim Preserve tablo(1 To Pl.Rows.Count)
For i = 1 To Pl.Rows.Count
    If Val(Pl(i)) = Pl(i) Then
        tablo(i) = Val(Pl(i))
    Else
        For j = 1 To Len(Replace(Pl(i), Val(Pl(i)), ""))
             Nb = Nb & Asc(Mid(Replace(Pl(i), Val(Pl(i)), ""), j, 1))
        Next j
             tablo(i) = Val(Pl(i)) + Nb / 10 ^ Len(Nb): Nb = ""
        End If
Next i
temp = tablo
Call tri(temp, LBound(temp), UBound(temp))
For i = 1 To Pl.Rows.Count
    temp(i) = Pl(Application.Match(temp(i), tablo, 0))
Next i
[A2].Resize(UBound(temp)) = Application.Transpose(temp)
End Sub
Sub tri(a, gauc, droi) ' Quick sort
  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
      g = g + 1
      d = d - 1
    End If
  Loop While g <= d
  If g < droi Then Call tri(a, g, droi)
  If gauc < d Then Call tri(a, gauc, d)
End Sub
A+
 
Dernière édition:

Celeda

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

Bonjour,

Tu as raison Staple1600 :
Code:
tri alpha nécessaire ou pas ?

dans l'effervescence de ce fil, je t'avoue que j'ai l'impression d'être dans l'arène et de voir venir des solutions de toute part - au temps pour moi :

s'il s'avérait que j'ai :

20B
20A
et 20C

dans le tri à faire, le tri alpha s'imposerait et on aurait :
20A
20B
20C

Encore une fois, même si je me répète, un grand merci à vous tous pour l'intérêt de la question, sans distinction des répondeurs (tous dans le même panier ...XLD!!:)
 

job75

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

Bonjour Jean-Marie :)

Tout comme david84 et jo75 (message#15 ), j'ai cru comprendre qu'il n'était pas utile de faire de tri alpha

Ben moi j'ai compris depuis le début qu'il fallait trier aussi sur les lettres, voir mes macros.

Et mon message #15 dit bien qu'il faut un 2ème critère de tri sur la colonne A, et bien sûr c'est pour trier les lettres...

Edit : mes amitiés Celeda :)

A+
 
Dernière édition:

Staple1600

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

Bonsoir à tous

Job75
Pourtant dans le premier message de Celeda (etape 3), il n'y pas de tri alpha, non ?
(C'est le pourquoi de mon précédent message)
Et justement ton code du message 15 ne s'occupe pas des lettres comme tu le précises
(puis qu'on 20B avant 30 A, c'est à dire un tri croissant sur les valeurs numériques en faisant abstraction des lettres)
Je viens de tester la macro du message 15 et j'obtiens
114
6
20B
30A
150
alors que Celeda voulait obtenir
6
20B
30A
114
150


Mais c'est point grave, puisque Celeda vient de préciser qu'il faut faire le tri alpha.
 
Dernière édition:

job75

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

Re JM,

Mon post #15 était destiné à JB.

Il faut donc tester sur son fichier du post #14, il y a des en-têtes sur son tableau.

Autrement préciser le paramêtre Header dans le Sort...

A+
 

job75

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

Re,

Sur le fichier de pierrejean ou le mien, il faut modifier la macro ainsi :

Code:
Sub triColInter2()
  [B:B].Insert
  For Each c In Range([A1], [A65000].End(xlUp))
    c.Offset(0, 1) = Val(c)
  Next c
  With Range("A1").CurrentRegion
    .Resize(.Rows.Count).Sort [B2], , [A2], Header:=xlNo
  End With
  [B:B].Delete
End Sub
A+
 

david84

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

Bonsoir,
ci-joint un fichier test comportant un peu plus de données, sur lequel vous pouvez insérer votre macro afin de comparer les résultats.
A+
 

Pièces jointes

  • Tri_ArrayChiffreLettre-Test.xls
    53 KB · Affichages: 48
  • Tri_ArrayChiffreLettre-Test.xls
    53 KB · Affichages: 46
  • Tri_ArrayChiffreLettre-Test.xls
    53 KB · Affichages: 42

pierrejean

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

Bonjour à tous

Une compilation des diverses macros
a laquelle j'ai ajouté ce que je cherchais a faire :
Adapter le tri quick sort pour le faire travailler sur un tableau a 2 dimensions
J'ai egalement allongé (trivialement) la liste des données pour mieux evaluer les temps de reponse
Au passage j'ai egalement supprimé ma premiere macro pour ne conserver que celles qui travaillent sur tableaux
Il semble que les macros de Job :) :) et JB affectent la colonne B ou j'ai fait un report pour avoir la comparaison des resultats (lesquels sont toujours corrects )
 

Pièces jointes

  • Tri_ArrayChiffreLettre-Test.xls
    119.5 KB · Affichages: 36
  • Tri_ArrayChiffreLettre-Test.xls
    119.5 KB · Affichages: 45
  • Tri_ArrayChiffreLettre-Test.xls
    119.5 KB · Affichages: 45

david84

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

Bonsoir,
Bravo pierrejean, je pense que ta solution est excellente et le fait d'avoir adapté le quick sort de la sorte permet de gagner du temps et d'éviter de trier dans la feuille de calcul.
Concernant le problème relevé sur les macro de JB et Job,je pense que c'est le Currentregion qui prend en compte la colonne de comparaison et le fait d'insérer une colonne entre les colonnes A et B semble régler le problème.
Quant à la vitesse d’exécution des macros nécessitant l'insertion de colonne, le temps d'exécution est grandement accéléré avec l'utilisation de Application.screenupdating.
A+
 

Discussions similaires

Statistiques des forums

Discussions
312 400
Messages
2 088 085
Membres
103 710
dernier inscrit
amin Saadaoui