Teuk65
Messages postés13Date d'inscriptionlundi 16 août 2010StatutMembreDernière intervention24 septembre 2010
-
23 sept. 2010 à 17:21
Teuk65
Messages postés13Date d'inscriptionlundi 16 août 2010StatutMembreDernière intervention24 septembre 2010
-
24 sept. 2010 à 16:53
Bonjour,
j'ai crée dans mon projet un sub qui trie les pages d'un WorkBook par ordre chronologique (leur nom est du type "année - S semaine") dont voici le code:
Sub trifeuilles(Optional wb As Workbook)
' remet les feuilles des semaines dans l'ordre
Dim ws As Worksheet
Dim noms() As String
Dim a1 As Integer, a2 As Integer
Dim s1 As Integer, s2 As Integer
Dim u As String
Dim i As Integer
Dim tri As Boolean
If wb Is Nothing Then Set wb = ActiveWorkbook
'Comptage des feuilles à trier (correspondant au format)
'(Il y a d'autres feuilles qu'on ne touche pas)
For Each ws In wb.Worksheets '
If ws.Name Like "#### - S#" _
Or ws.Name Like "#### - S##" Then
i = i + 1
ReDim Preserve noms(i - 1)
noms(i - 1) = ws.Name
End If
Next
tri = False
'tri par bulles
While tri = False
tri = True
For i = 0 To UBound(noms) - 1
a1 = Val(Left(noms(i), 4)) 'extraction de l'année
a2 = Val(Left(noms(i + 1), 4))
s1 = Val(Mid(noms(i), 9, 2)) 'extraction de la semaine
s2 = Val(Mid(noms(i + 1), 9, 2))
'si 2 pages ne sont pas dans l'ordre
If a1 > a2 Or (a1 = a2 And s1 > s2) Then
tri = False
u = noms(i) 'on inverse leur position
noms(i) = noms(i + 1)
noms(i + 1) = u
End If
Next
Wend
'mise dans l'ordre
For i = 1 To UBound(noms)
wb.Sheets(noms(i)).Move After:=wb.Sheets(noms(i - 1))
Next
End Sub
Ca marche bien!
Sauf le déplacement effectif des feuilles (dernière boucle)... En effet, souvent, l'instruction n'est pas effectuée pour i = 1, mais des fois si.
Et quand je fais passer cette boucle en mode pas à pas, ca marche à tout les coups.
Qu'est-ce qu'il ne marche pas? Y a-t-il un moyen d'arranger ca?
Pour info, la page la plus ancienne est archivée (déplacée) dans un autre WorkBook après le tri, donc si la mauvaise page est archivée, c'est gênant.
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 23 sept. 2010 à 18:35
Salut
Quand i = 1, tu lui demande de la placer après la feuille 0 ... qui n'existe pas.
Il te faut donc gérer la première feuille hors de la boucle, puis enchainer avec les suivantes (de 2 à X)
De plus, à l'intérieur de ta boucle, ajoute un DoEvents pour que les éléments graphiques aient le temps de suivre.
" si la mauvaise page est archivée, c'est gênant "
Certes, mais c'est parce que tu dois la désigner avec son index et pas avec son nom.
Avec son nom, aucun risque que le programme se trompe de feuille.
Vala
Jack, =fr MVP VB NB : Je ne répondrai pas aux messages privés
Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 23 sept. 2010 à 18:37
Ah si, pardon, c'est l'index 0 de ton tableau 'noms' et pas le n° de la feuille
Donc pas de soucis avec la boucle.
Pense au DoEvents, je pense que le problème vient de la rapidité d'exécution.