Classer alphanumériquement les Worksheets

Bonjour,

J'ai un classeur avec 2 feuilles à l'intérieur, respectivement nommées "Sheet1" et "Sheet2".

J'ai écris un programme pour rajouter 3 feuilles à ce classeur.

Je vais donc me retrouver dans excel avec les onglets suivants dans l'ordre suivant (car j'ai déjà rajouté des feuilles que j'ai ensuite supprimées) : Sheet1 - Sheet2 - Sheet20 - Sheet19 - Sheet18.

Je voudrais classer les onglets de mes feuilles correctement dans l'ordre, soit : Sheet1 - Sheet2 - Sheet18 - Sheet19 - Sheet20.

J'ai donc écris le programme suivant :

Sub Try507()

Dim i As Long

Dim j As Long

ThisWorkbook.Worksheets.Add after:=Worksheets("Sheet2"), Count:=3

For i = 1 To Worksheets.Count

For j = 1 To Worksheets.Count - 1

If LCase(Worksheets(j + 1).Name) < LCase(Worksheets(j).Name) Then

Worksheets(j + 1).Move before:=Worksheets(j)

Else

End If

Next

Next

Worksheets(3).Name = "Short"

Worksheets(4).Name = "Medium"

Worksheets(5).Name = "Long"

[...]

End Sub

Le problème c'est que VBA me classe les onglets dans l'ordre suivant : Sheet1 - Sheet18 - Sheet19 - Sheet2 - Sheet20.

Je ne comprends pas ce qu'il se passe...!

Est-ce que VBA croit que "Sheet18" et "Sheet19" soient égale à "Sheet1.8" et "Sheet1.9" ? Ce qui expliquerait le classement que VBA me donne...

Comment puis-je résoudre ce problème ?

En pièce jointe mon fichier Excel...

Merci beaucoup !

Cordialement,

ProutProutProut.

10book1.xlsm (35.43 Ko)

Bonsoir,

dans le cas des classements alphanumérique il faut voir les 1 comme des "a" et les 2 comme des "b" du coup 1111 sera toujours placé après le 2, car aaaa est bien avant b...

Donc sheets18 se trouve bien avant sheets2 car "sheetsah" est bien avant "sheetsb"

On est bien en alphanumérique où les chiffres réagissent comme des lettres...

Si vos noms ont toujours Sheet en préfixe il faut alors travailler qu'avec "le restant"

If Mid(Sheets(j+1).Name,6,Len(Sheets(j+1).Name)) < Mid(Sheets(j+1).Name,6,Len(Sheets(j).Name)) Then

En somme vous prenez la partie qui se trouve après le sheet pour faire la comparaison.

Il faut peut-être mettre une fonction supplémentaire pour que ce restant soit considéré comme un chiffre, @ vous de voir

@ bientôt

LouReeD

Bonjour,

et tu peux faire un retour ici https://forum.excel-pratique.com/viewtopic.php?f=2&t=129266&p=793948#p793948,

voire même y dire un merci...

Mais bon, avec un pseudo comme tu as choisi il n'y a sans doute pas grand chose à attendre.

eric

Bonsoir eriiic !

Si si je vous assure le startron va bientôt sortir !

Mais dites moi, vous passez votre temps sur le forum pour suivre tout ceci !

Et ne me répondez pas : "Prout" !

@ bientôt

LouReeD

non, non

chapman prout

Tu penses que son pseudo je n'ai pas eu de mal à le retenir

A moment donné j'ai cru que tu me parlais du starEtron qui allait sortir

Merci LouReeD pour vos explications ! J'étais justement en train d'essayer d'introduire du string splitting dans mon code... Merci d'avoir éclairé ma lanterne sur les chiffres "transformés" en lettres par VBA.

Eriiic, my bad, je m'étais pourtant mis un pense-bête sur mon fichier excel de répondre à vos messages (je le jure!), car c'est vrai que c'est vraiment sympa d'avoir des forums toujours très vivants et réactifs..., donc mes excuses Ca ne se reproduira plus

Bonjour,

Une piste mais avec ceci, les feuilles doivent toutes avoir la lettre "t" avant le nombre :

Sub Test()

    Dim Fe As Worksheet
    Dim TblNom() As String
    Dim T
    Dim I As Integer
    Dim J As Integer

    For Each Fe In Worksheets

        I = I + 1: ReDim Preserve TblNom(1 To 2, 1 To I)
        TblNom(1, I) = Fe.Name
        TblNom(2, I) = Split(Fe.Name, "t")(1)

    Next Fe

    For I = 1 To UBound(TblNom, 2): For J = I To UBound(TblNom, 2)

            If CInt(TblNom(2, J)) < CInt(TblNom(2, I)) Then Sheets(TblNom(1, J)).Move Sheets(TblNom(1, I))

    Next J, I

End Sub

Ca y est je viens de finir mon programme !

J'ai finalement résolu mon problème de la manière suivante :

For i = 1 To Worksheets.Count

For j = 1 To Worksheets.Count - 1

If Mid(LCase(Worksheets(j + 1).Name), 6, Len(Worksheets(j + 1).Name)) * 1 _

< Mid(LCase(Worksheets(j).Name), 6, Len(Worksheets(j).Name)) * 1 Then

Worksheets(j + 1).Move before:=Worksheets(j)

Else

End If

Next

Next

Merci pour vos conseils !

En pièce jointe mon programme fini (dernier programme du module)

12book1.xlsm (39.24 Ko)

Merci These, mais je ne suis pas encore très à l'aise avec les Arrays et les fonctions reDim, Preserve, etc... Il faut que je m'entraîne...

Petite question un peu hors-sujet, il faut quel niveau (ou combien d'heures de pratique) pour pouvoir réaliser des projets VBA en freelance pour des entreprises ? Merci pour vos informations

Je dirai que c'est fonction de tes capacités à assimiler la programmation en VBA (si tu es pour ainsi dire débutant), de ton assiduité, de ton intuitivité, maintenant, vendre un produit qui peut intéresser des professionnels, on pourrait dire que c'est à la portée de tous, il faut juste que le produit soit stable et pour ainsi dire sans bug !

et comme disais un certain (Corneille pour ne pas le citer !) "Aux âmes bien nées, la valeur n'attend point le nombre des années"

J'aimerais bien travailler avec un développeur VBA freelance, de manière gratuite ou peu rémunérée, de façon à voir quels types de problématiques les entreprises ont et pour qu'il supervise les programmes ou parties de programmes que j'écrie pour lui avant qu'il ne les intègre dans le projet global et l'envoie à ses clients... Il y a quelqu'un ?

Rechercher des sujets similaires à "classer alphanumeriquement worksheets"