Tri des feuilles dans un classeur

Hugues

XLDnaute Impliqué
Bonjour à vous tous,

Suite au rajout d'une feuille dans un classeur, je souhaiterais rajouter à la suite d'un code, le code afin de permettre de selectionner l'ensemble des feuilles du classeur et les classer par ordre croissant en fonction des noms des onglets.

Merci par avance pour votre aide,

Hugues
 

pierrejean

XLDnaute Barbatruc
Re : Tri des feuilles dans un classeur

Re

Un recapitulatif (Origine: Lii) auquel j'ai ajouté une version basée sur le Tri
et la version sans la casse

@ carcharodon-carcharias

Ok , mais resultat curieux quand même !!
 

Pièces jointes

  • OngletsOrdreAlphabétique2.zip
    33.6 KB · Affichages: 23
  • OngletsOrdreAlphabétique2.zip
    33.6 KB · Affichages: 24
  • OngletsOrdreAlphabétique2.zip
    33.6 KB · Affichages: 26

ROGER2327

XLDnaute Barbatruc
Re : Tri des feuilles dans un classeur

Bonjour à tous
Un essai de plus :
Code:
[COLOR="DarkSlateGray"][B]Sub toto()
Dim sL(), s As String, i As Long, j As Long, k As Long
   ReDim sL(1 To 2, 1 To Sheets.Count)
   For i = 1 To UBound(sL, 2)
      sL(1, i) = normalise(Sheets(i).Name)
      sL(2, i) = Sheets(i).Name
      j = 0
      Do While 47 < Asc(Mid$(sL(1, i), j + 1)) And Asc(Mid$(sL(1, i), j + 1)) < 58
         j = j + 1
      Loop
      If j Then sL(1, i) = String$(32 - j, "0") & sL(1, i) Else sL(1, i) = String$(32, "9") & sL(1, i)
   Next i
   With Application
      .ScreenUpdating = False: .Calculation = xlManual: .EnableEvents = False
      For i = 1 To UBound(sL, 2)
         k = i
         s = sL(1, i)
         For j = 1 To UBound(sL, 2)
            If sL(1, j) > s Then s = sL(1, j): k = j
         Next j
         sL(1, k) = ""
         Sheets(sL(2, k)).Move before:=Sheets(1)
      Next i
      .EnableEvents = True: .Calculation = xlAutomatic: .ScreenUpdating = True
   End With
End Sub

Function normalise(s As String) As String
Dim oL, nL, i As Long, j As Long
   oL = Array("Š", "Œ", "Ž", "š", "œ", "ž", "Ÿ", "*", "ª", "²", "³", "¹", "À", "Á", "Â", "Ã", "Ä", "Å", "Æ", "Ç", "È", "É", "Ê", "Ë", "Ì", "Í", "Î", "Ï", "Ð", "Ñ", "Ò", "Ó", "Ô", "Õ", "Ö", "Ù", "Ú", "Û", "Ü", "Ý")
   nL = Array("S", "OE", "Z", "S", "OE", "Z", "Y", " ", "A", "2", "3", "1", "A", "A", "A", "A", "A", "A", "AE", "C", "E", "E", "E", "E", "I", "I", "I", "I", "D", "N", "O", "O", "O", "O", "O", "U", "U", "U", "U", "Y")
   s = UCase(s)
   For i = 1 To Len(s)
      For j = 0 To UBound(oL)
         If Mid$(s, i, 1) = oL(j) Then normalise = normalise & nL(j): Exit For
      Next j
      If j > UBound(oL) Then normalise = normalise & Mid$(s, i, 1)
   Next i
End Function[/B][/COLOR]
ROGER2327
#2595
 

pierrejean

XLDnaute Barbatruc
Re : Tri des feuilles dans un classeur

Re

Heureux de vous trouver ici ROGER
Comme vous le dites "Un essai de plus"
Et j'ajoute: Un resultat de plus
En effet le '-' est traité differemment par votre macro et la mienne
Voir recapitulatif joint

Edit: Votre macro ayant une excellente capacité d'adaptation il est assez facile de l'amener a un resultat different mais comme j'ignore totalement ou est la verité (si tant est qu'elle existe) je m'abstiens de toute suggestion
 

Pièces jointes

  • OngletsOrdreAlphabétique5.zip
    42.8 KB · Affichages: 22
Dernière édition:

mromain

XLDnaute Barbatruc
Re : Tri des feuilles dans un classeur

bonjour tout le monde,

que de belles choses sur ce fil ;)

Juste une proposition de modification du code de ROGER2327. Je ne sais pas si c'est plus rapide à l'exécution (vu que les codes de ROGER2327 sont en général très rapides), mais ça évite une boucle For.

remplacer
Code:
Function normalise(s As String) As String
Dim oL, nL, i As Long, j As Long
   oL = Array("Š", "Œ", "Ž", "š", "œ", "ž", "Ÿ", "*", "ª", "²", "³", "¹", "À", "Á", "Â", "Ã", "Ä", "Å", "Æ", "Ç", "È", "É", "Ê", "Ë", "Ì", "Í", "Î", "Ï", "Ð", "Ñ", "Ò", "Ó", "Ô", "Õ", "Ö", "Ù", "Ú", "Û", "Ü", "Ý")
   nL = Array("S", "OE", "Z", "S", "OE", "Z", "Y", " ", "A", "2", "3", "1", "A", "A", "A", "A", "A", "A", "AE", "C", "E", "E", "E", "E", "I", "I", "I", "I", "D", "N", "O", "O", "O", "O", "O", "U", "U", "U", "U", "Y")
   s = UCase(s)
   For i = 1 To Len(s)
      For j = 0 To UBound(oL)
         If Mid$(s, i, 1) = oL(j) Then normalise = normalise & nL(j): Exit For
      Next j
      If j > UBound(oL) Then normalise = normalise & Mid$(s, i, 1)
   Next i
End Function
par
Code:
Function normalise(s As String) As String
Dim oL, nL, i As Long, j As Long
   oL = Array("Š", "Œ", "Ž", "š", "œ", "ž", "Ÿ", "*", "ª", "²", "³", "¹", "À", "Á", "Â", "Ã", "Ä", "Å", "Æ", "Ç", "È", "É", "Ê", "Ë", "Ì", "Í", "Î", "Ï", "Ð", "Ñ", "Ò", "Ó", "Ô", "Õ", "Ö", "Ù", "Ú", "Û", "Ü", "Ý")
   nL = Array("S", "OE", "Z", "S", "OE", "Z", "Y", " ", "A", "2", "3", "1", "A", "A", "A", "A", "A", "A", "AE", "C", "E", "E", "E", "E", "I", "I", "I", "I", "D", "N", "O", "O", "O", "O", "O", "U", "U", "U", "U", "Y")
   s = UCase(s)
   For j = 0 To UBound(oL)
       s = Replace(s, oL(j), nL(j))
   Next j
   normalise = s
End Function
bonne soirée
 
Dernière édition:

ROGER2327

XLDnaute Barbatruc
Re : Tri des feuilles dans un classeur

Re...
A pierrejean
Dans la table ASCII, le tiret (ASCII 45) est avant A (ASCII 65). Comme je ne fais pas de traitement spécial pour ces caractères, 1-A est classé avant 1A. Mais comme vous le faites remarquer, il faudrait que notre ami nous en dît plus pour savoir ce qu'il convient de faire.​
A mromain
Votre suggestion est judicieuse, surtout s'il y a de nombreux remplacements à effectuer dans chaque chaîne de caractères. En cherchant bien, par exemple en choisissant la chaîne

"ŠŒŽšžŸ*ª²³¹ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖÙÚÛÜÝ"

le gain de temps peut dépasser 30%.

Vous aurez aussi remarqué que mon code est un peu écrit à l'arrache si je puis me permettre : il serait judicieux de nettoyer les tableaux oL et nL. Par exemple, "œ" est inutile puisqu'on s'empresse de remplacer s par UCase(s)...​
Cordialement,
ROGER2327
#2598
 

Lii

XLDnaute Impliqué
Re : Tri des feuilles dans un classeur

Bon jour,

Re
...Mais comme vous le faites remarquer, il faudrait que notre ami nous en dît plus pour savoir ce qu'il convient de faire.
...

On pourrait sans doute mettre en place une procédure universelle (mais quel boulot ! et le jeu en vaut-il la chandelle ?) .
A partir de la dernière macro proposée, pour ceux qui veulent gagner plus en se divertissant …
 

Pièces jointes

  • CoupDePoker.zip
    14.3 KB · Affichages: 22

Discussions similaires