En complément à ce qui a été dit ci-dessus, voici une solution particulièrement simple de renvoyer la liste triée des feuilles d'un classeur. On utilise la propriété .Sorted d'un contrôle ListView, ainsi quelques lignes suffisent. Cette méthode est susceptible de fonctionner également pour toutes sortes de collections de chaînes de texte (les nombres sont triés comme du texte).
Noter qu'ici je me contente de renvoyer la liste des feuilles (qu'on peut alors reprendre dans un ListBox etc.), je ne les trie pas physiquement, mais l'adaptation serait également rapide à réaliser.
Function TriListeWs(Optional Wb As Workbook) As Collection
'Ti
Dim Liste As New ListView, Ws As Worksheet, Bcle%
If Wb Is Nothing Then Set Wb = ActiveWorkbook
With Liste
.Sorted = True
For Each Ws In Wb.Worksheets
.ListItems.Add Text:=Ws.Name
Next Ws
Set TriListeWs = New Collection
For Bcle = 1 To .ListItems.Count
TriListeWs.Add .ListItems(Bcle).Text
Next Bcle
End With
End Function
Sub ListeFeuilles()
Dim Feuilles As Collection
'renvoi de la liste des feuilles triées du classeur actif
Set Feuilles = TriListeWs
'pour lister les feuilles d'un classeur particulier, on pourrait
'appeler la fonction ainsi :
'Set Feuilles = TriListeWs(Workbooks("NomDuClasseur"))
'Feuilles est une collection, c'est à dire qu'on peut manipuler ses éléments
' dans une boucle For Each ... In et qu'on peut en connaître le
'nombre avec sa propriété Count.
'Dim Item
'For Each Item In Feuilles
' MsgBox Item
'Next Item
'ou alors :
'Dim Bcle%
'For Bcle = 1 To Feuilles.Count
' MsgBox Feuilles(Bcle)
'Next Bcle
End Sub
******************
une évolution de la méthode précédente permet de renvoyer tout aussi simplement une liste triée sans doublons. Pour simplifier cet exemple, j'utilise des nombres (qui ne seront pas triés correctement puisqu'ils sont considérés comme du texte) mais en situation réelle, on remplacera ces nombres aléatoires par des chaînes de texte.
Function TriListe(Col As Collection) As Collection
'Ti
Dim Liste As New ListView, Item, Bcle%
With Liste
.Sorted = True
For Each Item In Col
.ListItems.Add Text:=Item
Next Item
Set TriListe = New Collection
For Bcle = 1 To .ListItems.Count
TriListe.Add .ListItems(Bcle).Text
Next Bcle
End With
End Function
Sub ListeTriee()
Dim Feuilles As Collection, Bcle%, Nbre%
Set Feuilles = New Collection
On Error Resume Next
For Bcle = 1 To 5000
Nbre = Int((5000 * Rnd) + 1)
Feuilles.Add Nbre, CStr(Nbre)
Next Bcle
'pour vérifier combien de doublons ont été éliminés
MsgBox 5000 - Feuilles.Count & " doublons ont été éliminés sur 5000 valeurs"
Set Feuilles = TriListe(Feuilles)
End Sub