Trier les onglets par ordre "alphanumérique"

litelsousa

XLDnaute Occasionnel
Bonjour,

Je cherche un code me permettant de classer mes onglets par ordre numérique.

J'ai trouvé celui-ci:

Dim I As Integer, j As Integer, num As Integer, nom As String

For I = 2 To Sheets.Count
num = 0: nom = Sheets(I).Name
For j = I - 1 To 1 Step -1
If Sheets(I).Name < Sheets(j).Name Then num = j
Next j
If num > 0 Then Sheets(I).Move before:=Sheets(num)
Next I

Mon seul petit soucis, c'est que je n'ai pas réussi à faire que les lettre soient placées avant les chiffres.

(l'onglet "liste" sera mis après les onglets "2501" et "2502" et j'aimerais le contraire).

En vous remerciant de votre aide
 

litelsousa

XLDnaute Occasionnel
Re : Trier les onglets par ordre "alphanumérique"

En fait après quelques test supplémentaire, je vois qu'il y a un autre soucis:

les onglets "10" "11" sont placés après le "1" et ainsi de suite.

Idem avec un autre code trouvé:
Sub TrierFeuilles()
Dim WS As Worksheet
Dim I As Byte
Application.ScreenUpdating = False
For Each WS In ActiveWorkbook.Sheets
For I = 2 To ActiveWorkbook.Sheets.Count
If Sheets(I - 1).Name > Sheets(I).Name Then
Sheets(I - 1).Move After:=Sheets(I)
End If
Next
Next
Application.ScreenUpdating = True
End Sub
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : Trier les onglets par ordre "alphanumérique"

Bonjour Litelsouza, bonjour le forum,

Peut-être comme ça :
Code:
Sub Macro1()
Dim O As Object 'déclare la variable O (Onglets)
Dim TON() As Variant 'déclare le tableau de variables TON (Tableau des Onglet Numériques)
Dim TOA() As Variant 'déclare le tableau de variables TOA (Tableau des Onglet Alphabétiques)
Dim X As Integer 'déclare la variable X
Dim Y As Integer 'déclare la variable Y

For Each O In Sheets 'boucle ssur tous les onglets du classeur
    If IsNumeric(O.Name) = True Then 'condition : si le nom de l'onglet est numérique
        ReDim Preserve TON(X) 'redimentionne le tableau TON
        TON(X) = O.Name 'ajoute le nom de l'onglet au tableau des variables indéxées TON
        X = X + 1 'incrémente X
    Else 'sinon
        ReDim Preserve TOA(Y) 'redimentionne le tableau TOA
        TOA(Y) = O.Name 'ajoute le nom de l'onglet au tableau des variables indéxées TOA
        Y = Y + 1 'incrémente X
    End If 'fin de la condition
Next O 'prochaine onglet de la boucle
Call tri(TON, LBound(TON), UBound(TON)) 'tri alphabétique du tableau TON
Call tri(TOA, LBound(TOA), UBound(TOA)) 'tri alphabétique du tableau TOA
For i = 0 To UBound(TOA) 'boucle sur toutes les onglets du tableau TOA
    Sheets(TOA(i)).Move After:=Sheets(Sheets.Count) 'place l'onglet en dernier
Next i 'prochain onglet du tableau
For i = 0 To UBound(TON) 'boucle sur toutes les onglets du tableau TON
    Sheets(TON(i)).Move After:=Sheets(Sheets.Count) 'place l'onglet en dernier
Next i 'prochain onglet du tableau
End Sub

Sub tri(a As Variant, gauc As Integer, droi As Integer) ' Quick sort tiré du site de jacques BOISGONTIER : http://boisgontierjacques.free.fr/
Dim ref As String
Dim g As Integer
Dim d As Integer
Dim tmp As String

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

[Édition]
J'ai modifié deux erreurs dans le code mais je ne pense pas que ça convienne... Tu auras aussi le 14 avant le 1...
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re : Trier les onglets par ordre "alphanumérique"

Bonsoir à tous

litelsousa
Essaies ceci (test OK sur Xl 2013)
Code:
Sub TriONGLETS()
Dim ws As Worksheet, i%
Dim Onglets()
ReDim Onglets(Worksheets.Count)
i = LBound(Onglets)
For Each ws In Worksheets
    Onglets(i) = ws.Name
    i = i + 1
Next ws
Tri_Bub Onglets
For i = LBound(Onglets) + 1 To UBound(Onglets)
    Worksheets(Onglets(i)).Move After:=Worksheets(Worksheets.Count)
Next i
End Sub
Code:
Private Sub Tri_Bub(tF())
Dim tmp, i, j
For i = LBound(tF) To UBound(tF)
    For j = i To UBound(tF)
        If tF(i) > tF(j) Then
        tmp = tF(i)
        tF(i) = tF(j)
        tF(j) = tmp
    End If
Next j
Next i
End Sub
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : Trier les onglets par ordre "alphanumérique"

Bonsoir le fil, bonsoir le forum,

Bonjour,
Merci bien, mais ça me donne le message suivant:

Erreur de compilation: Variable non définie

à la ligne

Oui, tu dois avoir l'Option Explicit (mais je te rassure on en meut pas..) et j'ai oublié de déclarer la variable I. Rajoute n'importe où dans la partie des déclarations de variables :
Code:
Dim I As Integer

Mais le code de Staple me paraît plus efficace...
 

Staple1600

XLDnaute Barbatruc
Re : Trier les onglets par ordre "alphanumérique"

Bonsoir Robert

Je sais pas si il est plus efficace.
Je sais juste qu'il fonctionne sur mon PC.

Mais comme litelsousa n'est pas dans les parages, je ne sais pas ce qu'il en est sur son PC et avec son fichier d'origine.
 

litelsousa

XLDnaute Occasionnel
Re : Trier les onglets par ordre "alphanumérique"

Bonjour,

Merci bien pour votre participation.

staple1600, malheureusement , chez moi le résultat reste le même, le 3286 sera classé entre le 3 et le 4.

Robert, ça me dit toujours le même message, mais cette fois il me semble que c'es la valeur "temp" du "sub tri" qui n'est pas définie.
 

litelsousa

XLDnaute Occasionnel
Re : Trier les onglets par ordre "alphanumérique"

Ok j'ai vu où était l'erreur...

Il était entré "Dim tmp" à la place de "Dim temp".

Malheureusement, le résultat du tri reste le même, le 3286 reste classé entre le 3 et le 4
 

Efgé

XLDnaute Barbatruc
Re : Trier les onglets par ordre "alphanumérique"

Bonjour litelsousa, Bonjour Robert, Salut Staple

Une proposition:
Bouton 1 Création de 40 feuilles en ordre aléatoire
Bouton 2 tri des feuilles (textes en premier)
Utilisation du Quick sort de J.B

VB:
Private Sub CommandButton2_Click() ' tri des feuilles
Dim I&, F As Worksheet, T As Variant
Dim D As Object, Dtxt As Object
Set D = CreateObject("Scripting.Dictionary")
Set Dtxt = CreateObject("Scripting.Dictionary")
Application.ScreenUpdating = False
For Each F In Worksheets
    If Not IsNumeric(F.Name) Then
        Dtxt(F.Name) = ""
    Else
        D(CStr(Format(F.Name, "0000000"))) = ""
    End If
Next F

T = D.Keys
Call tri(T, 0, UBound(T))
For I = LBound(T) To UBound(T)
    Sheets(CStr(Format(T(I), "0"))).Move Before:=Sheets(I + 1)
Next I

T = Dtxt.Keys
Call tri(T, 0, UBound(T))
For I = LBound(T) To UBound(T)
    Sheets(T(I)).Move Before:=Sheets(I + 1)
Next I

Me.Activate
End Sub

Cordialement
 

Pièces jointes

  • Classeur1.xlsm
    35.7 KB · Affichages: 63
  • Classeur1.xlsm
    35.7 KB · Affichages: 57
  • Classeur1.xlsm
    35.7 KB · Affichages: 72
Dernière édition:

Misange

XLDnaute Barbatruc
Re : Trier les onglets par ordre "alphanumérique"

Bonjour,
deux codes complets de Laurent Longre (tri extrêmement rapide) et de Daniel Maher
et un classeur de Daniel Maher qui les met en oeuvre
Ce lien n'existe plus
Ce lien n'existe plus
Ce lien n'existe plus


PS quick sort n'est pas une invention de JB :)
 

litelsousa

XLDnaute Occasionnel
Re : Trier les onglets par ordre "alphanumérique"

Bonjour à tous,

Merci pour votre aide, les choses commence à bien tourner...

Voilà mon fichier avec qui j'ai encore 2 petit soucis:

1° Dans l'ordre de tri, si les onglets commençant par une lettre pouvaient être placés avant ceux commençant par un chiffre.

2° Tout à la fin de ces opérations, que ce soit le dernier onglet créer qui soit sélectionné. (ligne 65 du code où j'ai mis l'onglet modèle, mais comme les nouveaux onglets auront des nom "pas encore défini" je ne sais pas comment faire.)

Merci de votre aide et bonne journée
 

Pièces jointes

  • test_V2.3.xlsm
    25.5 KB · Affichages: 47

Discussions similaires

Réponses
11
Affichages
286

Statistiques des forums

Discussions
312 194
Messages
2 086 071
Membres
103 110
dernier inscrit
Privé