VBA excel: script qui marche, mais pas toujours

Teuk65 Messages postés 13 Date d'inscription lundi 16 août 2010 Statut Membre Dernière intervention 24 septembre 2010 - 23 sept. 2010 à 17:21
Teuk65 Messages postés 13 Date d'inscription lundi 16 août 2010 Statut Membre Dernière intervention 24 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.

Merci de m'éclairer!

3 réponses

cs_Jack Messages postés 14007 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 78
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)
0
cs_Jack Messages postés 14007 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 78
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.
0
Teuk65 Messages postés 13 Date d'inscription lundi 16 août 2010 Statut Membre Dernière intervention 24 septembre 2010 2
24 sept. 2010 à 16:53
DoEvents ne marche pas, mais par contre, si on active le workBook (wb.Activate) avant, il n'y a plus de problème!
Merci d'avoir esayé en tout cas
0