Amartin6
Messages postés44Date d'inscriptiondimanche 30 décembre 2007StatutMembreDernière intervention21 septembre 2009
-
3 janv. 2008 à 11:08
Amartin6
Messages postés44Date d'inscriptiondimanche 30 décembre 2007StatutMembreDernière intervention21 septembre 2009
-
4 janv. 2008 à 17:02
Bonjour,
Après avoir créé un Macro VBA sur Excel, la première fois que je l'exécute, tout se passe très rapidement. Mais si j'exécute le macro une deuxième fois, cela prend un temps fou! Par contre si je quitte le fichier, et je le reouvre, tout se passe normalement...
J'imagine que la mémoire est pleine à quelque part, mais où? Et comment la vider? Et cela ne provient pas du presse papier qui est vide!
cs_MPi
Messages postés3877Date d'inscriptionmardi 19 mars 2002StatutMembreDernière intervention17 août 201823 3 janv. 2008 à 11:20
Salut,
J'ai déjà remarqué le phénomène et je n'ai pas de réponse ...
Mais peut-être que si tu mettais un bout de ton code, on pourrait aider à l'améliorer, le cas échéant...
MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA.
Amartin6
Messages postés44Date d'inscriptiondimanche 30 décembre 2007StatutMembreDernière intervention21 septembre 2009 3 janv. 2008 à 11:27
Mon code est assez long, et je ne crois pas que le problème viennent de là mais plutot qu'excel à du mal à appliquer un format après que la macro l'ait déjà fait une fois!
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 3 janv. 2008 à 13:39
"Auriez-vous d'autres solutions?"
Non ... sans avoir une parfaite connaissance de tous les tenants et aboutissants de ton application... et notamment de ce qu'elle crée ici et là et ne tue pas ...
J'espérais que le problème avait pour cause la conservation en mémoire de données pour permettre des "retours en arrière", problème qui aurait été résolu par l'enregistrement de ton classeur... mais tu nous dis que tu as déjà essayé cette méthode sans succès, alors.... ===>> le problème est ailleurs et on ne peut le savoir sans voir la totalité de ton code !
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 3 janv. 2008 à 14:13
salut,
ce lien peut te montrer comment décharger des objets si le problème vient de là, ce qu'on ne peut que lire, pas deviner
++
<hr size="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
For I = 3 To 5
For J = 9 To num
mat(J - 8, I - 2) = Worksheets("Données").Cells(J, I).Value
Next J
Next I
'Removes None Objects
For I = 1 To 3
For J = 9 To num
If mat(J - 8, I) = "NONE" Then
mat(J - 8, I) = ""
End If
If mat(J - 8, I) = "None" Then
mat(J - 8, I) = ""
End If
Next J
Next I
'Puts the matrix in order
k = 0
For I = 1 To num - 8
If I > num - 8 Then
Exit For
ElseIf mat(I, 1) <> "" Then
k = k + 1
mat1(k, 1) = mat(I, 1)
mat1(k, 2) = mat(I, 2)
mat1(k, 3) = mat(I, 3)
mat(I, 1) = ""
mat(I, 2) = ""
mat(I, 3) = ""
For J = I + 1 To num - 8
If J > num - 8 Then
Exit For
ElseIf mat(J, 1) = mat1(k, 1) And mat(J, 1) <> "" Then
k = k + 1
mat1(k, 1) = mat(J, 1)
mat1(k, 2) = mat(J, 2)
mat1(k, 3) = mat(J, 3)
mat(J, 1) = ""
mat(J, 2) = ""
mat(J, 3) = ""
End If
Next J
End If
Next I
k = 0
For I = 1 To num - 8
If I > num - 8 Then
Exit For
ElseIf mat1(I, 1) <> "" Then
k = k + 1
mat2(k, 1) = mat1(I, 1)
mat2(k, 2) = mat1(I, 2)
mat2(k, 3) = mat1(I, 3)
mat1(I, 1) = ""
mat1(I, 2) = ""
mat1(I, 3) = ""
For J = I + 1 To num - 8
If J > num - 8 Then
Exit For
ElseIf mat1(J, 1) mat2(k, 1) And mat1(J, 2) mat2(k, 2) Then
k = k + 1
mat2(k, 1) = mat1(J, 1)
mat2(k, 2) = mat1(J, 2)
mat2(k, 3) = mat1(J, 3)
mat1(J, 1) = ""
mat1(J, 2) = ""
mat1(J, 3) = ""
End If
Next J
End If
Next I
'Removes repeted names
For I = num - 8 To 1 Step -1
If mat2(I, 1) mat2(I, 2) mat2(I, 3) <> "" Then
For J = I - 1 To 1 Step -1
If mat2(I, 1) mat2(J, 1) And mat2(I, 2) mat2(J, 2) And mat2(I, 3) = mat2(J, 3) Then
mat2(J, 1) = ""
mat2(J, 2) = ""
mat2(J, 3) = ""
End If
Next J
End If
Next I
For I = num - 8 To 1 Step -1
If mat2(I, 1) = mat2(I, 2) <> "" Then
For J = I - 1 To 1 Step -1
If mat2(I, 1) mat2(J, 1) And mat2(I, 2) mat2(J, 2) Then
mat2(J, 1) = ""
mat2(J, 2) = ""
End If
Next J
End If
Next I
For I = num - 8 To 1 Step -1
If mat2(I, 1) <> "" Then
For J = I - 1 To 1 Step -1
If mat2(I, 1) = mat2(J, 1) Then
mat2(J, 1) = ""
End If
Next J
End If
Next I
'Counts number of rows with something
k = 0
For I = 1 To num - 8
If mat2(I, 3) <> "" Then
k = k + 1
End If
Next I
ReDim mat3(k, 3)
'Removes gaps
k = 0
For I = 1 To num - 8
If mat2(I, 3) <> "" Then
k = k + 1
mat3(k, 1) = mat2(I, 1)
mat3(k, 2) = mat2(I, 2)
mat3(k, 3) = mat2(I, 3)
End If
Next I
'Invert the columns
ReDim mat4(k, 3)
For I = 1 To 3
For J = 1 To k
mat4(J, I) = mat3(J, 4 - I)
Next J
Next I
'Puts matrix onto Présentation
For I = 1 To k
For J = 1 To 3
Worksheets("Présentation").Cells(4 + I, J + 1).Value = mat4(I, J)
Next J
Next I
'Counts number of row with spaces
Q = 0
For I = 1 To k
For J = 1 To 3
If mat4(I, J) <> "" Then
Q = Q + 1
End If
Next J
If mat4(I, 3) <> "" Then
Q = Q + 1
End If
Next I
Q = Q - 1 ' Deletes added row below the last cat1
'Moves names to correct place
For I = 1 To Q
If Worksheets("Présentation").Cells(4 + I, 3).Value <> "" Then
Worksheets("Présentation").Cells(4 + I + 1, 3).Select
Selection.EntireRow.Insert
End If
If Worksheets("Présentation").Cells(4 + I, 4).Value <> "" Then
Worksheets("Présentation").Cells(4 + I + 1, 4).Select
Case "Janvier"
k = "I"
Case "Février"
k = "L"
Case "Mars"
k = "O"
Case "Avril"
k = "R"
Case "Mai"
k = "U"
Case "Juin"
k = "X"
Case "Juillet"
k = "AA"
Case "Août"
k = "AD"
Case "Septembre"
k = "AG"
Case "Octobre"
k = "AJ"
Case "Novembre"
k = "AM"
Case "Décembre"
k = "AP"
End Select
For I = 1 To Q
'Defines where cat1 & cat 2 stops
EndCat2 = Cells(I + 4, 3).End(xlDown).Row
EndCat1 = Cells(I + 4, 4).End(xlDown).Row
'By Month
If Worksheets("Présentation").Cells(I + 4, 2).Value <> "" Then
If Worksheets("Données").Cells(72, 2).Value = "OK" Then
Else
MsgBox "Veuillez contrôler qu'à toutes
les opérations, le type à été spécifié"
Exit Sub
End If
''' If Worksheets("Données").Cells(4, 5).Value <> "Mois"
Then
'''
''' Else
'''
''' MsgBox "Veuillez spécifier un mois"
'''
''' Exit
Sub
'''
''' End
If
'''
''' If
Worksheets("Données").Cells(4, 5).Value <> "" Then
'''
''' Else
'''
''' MsgBox "Veuillez
spécifier un mois"
'''
''' Exit Sub
'''
''' End
If
If (Worksheets("Données").Cells(4, 5).Value = "Mois") Or (LenB(Worksheets("Données").Cells(4, 5).Value) = 0) Then
'''For I = 9 To
70
''' If Worksheets("Données").Cells(I,
5).Value = "" Then
''' num = I -
1
''' I = 70
''' End If
'''Next
I
'!!!!!!!!!!!!
' 'NUM' ET 'I' NE SONT PAS DéCLARéS?!!!
'!!!!!!!!!!!!
Dim num As Integer
Dim I As Integer
For I = 9 To 70
If LenB(Worksheets("Données").Cells(I, 5).Value) = 0 Then
num = I - 1
Exit For
End If
Next I
'!!!!!!!!!!!!
' ET 'MAT' N'EST PAS
DéCLARé NON PLUS?!!!
'!!!!!!!!!!!!
ReDim mat(num - 8, 3), mat1(num - 8, 3), mat2(num - 8, 3)
'!!!!!!!!!!!!
' PAREIL POUR
'J'?!!!
'!!!!!!!!!!!!
Dim J As Integer
For I = 3 To 5
For J = 9 To num
mat(J - 8, I - 2) = Worksheets("Données").Cells(J, I).Value
Next J
Next I
'Removes None Objects
For I = 1 To 3
''' For J = 9 To
num
'''
''' If mat(J - 8, I) = "NONE" Then
''' mat(J - 8, I) = ""
''' End If
'''
''' If mat(J - 8, I) =
"None" Then
''' mat(J - 8, I) =
""
''' End If
'''
''' Next
J
For J = 9 To num
If LCase$(mat(J - 8, I)) = "none" Then mat(J - 8, I) = ""
Next J
Next I
'Puts the matrix
in order
'!!!!!!!!!!!!
' PAREIL POUR 'k'?!!!
'!!!!!!!!!!!!
Dim k As Integer
k = 0
'''For I = 1 To num - 8
''' If I
> num - 8 Then
''' Exit
For
''' ElseIf mat(I, 1) <> ""
Then
''' k = k + 1
''' mat1(k, 1) = mat(I, 1)
''' mat1(k, 2) = mat(I, 2)
''' mat1(k, 3) = mat(I, 3)
''' mat(I, 1) = ""
''' mat(I, 2) = ""
''' mat(I, 3) = ""
''' For J = I + 1 To num - 8
''' If J > num - 8 Then
''' Exit For
''' ElseIf mat(J, 1) = mat1(k, 1) And mat(J, 1)
<> "" Then
''' k = k +
1
''' mat1(k, 1) = mat(J,
1)
''' mat1(k, 2) = mat(J,
2)
''' mat1(k, 3) = mat(J,
3)
''' mat(J, 1) =
""
''' mat(J, 2) =
""
''' mat(J, 3) =
""
''' End If
''' Next J
''' End
If
'''Next I
For I = 1 To num - 8
If LenB(mat(I, 1)) Then
k = k + 1
'!!!!!!!!!!!!
' D'Où SORT
'mat1'?!!!
'!!!!!!!!!!!!
*********** j'arrête là....., ligne 307
commence par mettre OPTION EXPLICIT tout en haut, tu vas avoir des surprises
bon courage
<hr size="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
bigfish_le vrai
Messages postés1835Date d'inscriptionvendredi 13 mai 2005StatutMembreDernière intervention20 novembre 201315 3 janv. 2008 à 16:44
Salut,
regarde bien la reponse de PCPT, par exemple ici:
'!!!!!!!!!!!!
' 'NUM' ET 'I' NE SONT PAS DéCLARéS?!!!
'!!!!!!!!!!!!
Dim
num
As Integer
Dim
I
As Integer
For
I =
9
To
70
If LenB(Worksheets("Données").Cells(I, 5).Value) = 0 Then
num = I - 1
Exit For
End If
Next
I
une variable non declaree prend beaucoup de place car comme excel ne sait pas ce que tu vas mettre dedans il lui aloue un maximum de place. Donc la premiere fois excel aloue le maximum de place et la deuxieme fois comme ta variable est encore en memoire il n'y a plus de place a lui donner donc ta macro devient lente. En plus vu la facon dont tu t'y prends ta macro doit scintiller a en fair fermer les yeux d'un aveugle ^^... tu n'es pas systematiquement obliger de selectioner tes celules pour travailler decu par exemple tu peux remplacer :
cela evite le scintillement et cela accelere la macro
Enfin pour definitivement eviter le scintillement et accelerer ta macro en plus de ce qui ta deja ete explique met ce qui suis dans ton code :
Sub ConfigLancement() 'a lancer en debut d'execution
Application.ScreenUpdating = False 'supprime le scintillement lor de l'execution
'pour office 2000 ou plus
Application.Calculation = xlCalculationManual
'pour office 97
On Error Resume Next
Application.Calculation = xlManual
End Sub
Sub TheEnd() 'retour à la normal a lancer en fin d'execution
'pour office 2000 ou plus
Application.Calculation = xlCalculationAutomatic
'pour office 97
On Error Resume Next
Application.Calculation = xlAutomatic 'for excel 97
Application.ScreenUpdating = True
End
End Sub
cs_MPi
Messages postés3877Date d'inscriptionmardi 19 mars 2002StatutMembreDernière intervention17 août 201823 4 janv. 2008 à 00:24
Tout à fait d'accord avec BigFish.
Évite tous les Select s'ils ne sont pas nécessaires.
ScreenUpdating évite d'afficher les changements "graphiques" donc il y aura accélération, c'est certain.
Calculation est un peu différent selon les macros. Certaines macros ont besoin que les calculs s'effecteunt avant de pouvoir continuer avec des valeurs fiables. Donc à utiliser en toute connaissance de cause...
----------------------------------------
Évite aussi les
If blabla <> blibli Then
'rien
Else
'action
End If
Mets plutôt
If blabla = blibli Then
'action
End If
-----------------------------------------
Mais je comprends ton problème de ralentissement et je n'ai jamais trouvé comment contrer ce ralentissement. L'idée de JMF de sauvegarder est effectivement une bonne méthode mais qui ne règle pas le problème; mais ça ne peut pas nuire. Déclarer les variables comme PCPT le suggère est aussi très important pour l'organisation en mémoire.
Quand on travaille avec Excel toute la journée, ce qui est mon cas, on se rend compte que les macros roulées tôt le matin sont plus rapides que si elles sont roulées en fin de journée... J'ai aussi remarqué (avec Timer) que Office 2000 est environ 20 fois plus rapide que 2003. C'est pas peu dire ...
Mon commentaire n'aidera pas le problème de lenteur d'Excel, mais les conseils qui te sont donnés t'aideront au moins à optimiser ton code... Je vais continuer à suivre ce Post en espérant que quelqu'un trouve la solution magique... Google étant notre ami, je vais tenter d'y trouver des pistes...
MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA.