Boucle FOR très lente à la deuxième execution

jesuhsXVII Messages postés 8 Date d'inscription samedi 13 mars 2004 Statut Membre Dernière intervention 6 mars 2009 - 5 mars 2009 à 19:16
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 - 10 mars 2009 à 00:53
Bonjour à tous,

Je travaille sur VBA depuis peu temps et j'ai un soucis avec une boucle "for".
J'execute une macro une contenant la boucle qui suit. 
Lorsque je l'execute une première fois, aucun problème (moins de 1 seconde).
Lorsque je l'execute une seconde fois, c'est nettement plus long (20 secondes en moyenne).

 For col = 0 To 60
   
    aCacher = True
   
    If col Mod 2 = 0 Then
                For jour = 0 To 4
                    If tous Then
                        If ActiveCell.Offset(jour, col + 1).Value <> 0 Then aCacher = False
                    Else:                        If ActiveCell.Offset(jour, col + 1).Value "4" Then aCacher False                        If ActiveCell.Offset(jour, col + 1).Value ssgp1 Then aCacher False                        If ActiveCell.Offset(jour, col + 1).Value ssgp2 Then aCacher False                        If ActiveCell.Offset(jour, col + 1).Value ssgp3 Then aCacher False
                    End If
                Next jour
        If aCacher Then
            ActiveCell.Offset(0, col).EntireColumn.Hidden = True
            ActiveCell.Offset(0, col + 1).EntireColumn.Hidden = True
        End If
    End If
   
    Next col

Pour l'instant, voici ce que j'ai essayé de faire :

Application.Calculation = xlManual
Application.ScreenUpdating = False

'Déclaration de toutes les variables
Dim tous As Boolean
Dim ssgp1 As Integer
Dim ssgp2 As Integer
Dim ssgp3 As Integer
Dim crit As Integer
Dim col As Integer
Dim Plage As Range
Dim Cellule As Range
Dim aCacher As Boolean
Dim jour As Integer


Mais rien n'y change. Ca rame....
Dès que je ferme le fichier et que je le réouvre, il fonctionne magnifiquement...1 fois.
Je ne sais pas comment effacer ou réinitialiser les variables ou VB en entier !!!

Merci pour les réponses que vous pourrez m'apporter...

Roger.
 

3 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
5 mars 2009 à 20:03
Salut
Bizarre
Essaye :
- de changer l'abrorescence des If
- d'éviter de refaire deux fois les mêmes actions :
            ...
                   If tous Then
                        If ActiveCell.Offset(jour, col + 1).Value <> 0 Then aCacher = False
                   ElseIf ActiveCell.Offset(jour, col + 1).Value = "4" Then 
                        aCacher = False
                    ElseIf ActiveCell.Offset(jour, col + 1).Value = ssgp1 Then
                        aCacher = False
                    ElseIf ActiveCell.Offset(jour, col + 1).Value = ssgp2 Then
                        aCacher = False
                    ElseIf ActiveCell.Offset(jour, col + 1).Value = ssgp3 Then
                        aCacher = False
                   End If
                Next jour
        If aCacher Then
            If Not ActiveCell.Offset(0, col).EntireColumn.Hidden Then
               ActiveCell.Offset(0, col).EntireColumn.Hidden = True
               ActiveCell.Offset(0, col + 1).EntireColumn.Hidden = True
            End If
        End If

Vala
Jack, =fr MVP VB
NB : Je ne répondrai pas aux messages privés

<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
jesuhsXVII Messages postés 8 Date d'inscription samedi 13 mars 2004 Statut Membre Dernière intervention 6 mars 2009
6 mars 2009 à 11:31
Merci Jack. C'est un peu plus rapide, mais c'est toujours très long à la seconde execution...
Peut-il s'agir d'une lourdeur des variables qui pèsent sur le programme ?
Comment se fait-il que la macro fonctionne parfaitement des que je ferme et que je réouvre le programme, y a t'il un moyen de vider la mémoire ?

123
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
10 mars 2009 à 00:53
Re
Avec le peu de ligne sous les yeux, je ne saurais te répondre. C'est quand même bizarre.
Il faut peut-être chercher ailleurs :
- Charges/décharges-tu beaucoup de UserForm ?
  Ta méthode est-elle bonne ?
- Idem pour les connexions aux DB
- Tes variables sont-elles bien toutes dimensionnées ?
  et dans un vrai type bien étudié, bien avec le "As ...", sinon donne des types Variant qui sont lourds
- As-tu des données (tableaux) qui grandissent ?
- Tes variables ont-elles des étendues correctes et pas trop vastes (Private/Public) ?
  Revoir les variables qui pourraient n'exister qu'à l'intérieur de procédures (Sub/Function)

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
Rejoignez-nous