Lenteur de la macro de suivi dates

popu -  
 Popu -
Bonjour,

Je me suis mise récemment à VBA et j'ai réalisé une macro qui met relativement longtemps à s'exécuter. Comme je suis encore débutante, je me demande si mon programme n'est pas trop lourd ce qui expliquerai la lenteur de la macro.

Je réalise un tableau qui permet de suivre l'avancée de 200 projets environ. Pour chaque projet, il y a une ligne avec des dates prévisionnelles, et la ligne suivante avec les dates réelles. Il y a une quinzaine de dates pour chaque projet.
J'ai réalisé une macro pour que si la date prévisionnelle est antérieure à la date d'aujourd'hui, la date prévionnelle est automatiquement ajoutée à la date réelle (de manière à ce qu'on ait pas à resaisir la date 2 fois).Par contre on ne réalise cette fonction que si la case "date réelle" est vide.

J'ai programmé de la manière suivante :
(les dates sont de la colonne 12 à 27,
la cellule AK1 convient la fonction "=AOUJOURDHUI" qui renvoie la date du jour)

j = 3
While Range("D" & j).Value <> ""
For col = 12 To 27
Cells(j, col).Select
If (IsEmpty(Cells(j, col).Value)) And (ActiveCell.Offset(-1, 0).Value <> "") And (ActiveCell.Offset(-1, 0).Value Range("AK1")) Then
ActiveCell.Value = ActiveCell.Offset(-1, 0).Value
Cells(j, col).Interior.ColorIndex = 15
End If
Next col
j = j + 2

Wend

Comme il y a quand meme un gros volume de cellules à traiter, je pense que ca explique la lenteur, mais on ne sait jamais, si vous aviez une autre idée...
Merci d'avance!!!
A voir également:

1 réponse

Ivan-hoe Messages postés 433 Date d'inscription   Statut Membre Dernière intervention   309
 
Bonjour Popu,
déjà, tu peux commencer ton code par :
Appplication.ScreenUpDating = False
et rétablir à la fin du code :
Application.ScreenUpDating = True
(ça bloque la mise à jour de l'affichage pendant l'exécution de la macro et ça fait gagner en efficacité)

Ensuite, tu peux tester tes trois conditions une par une au lieu de les tester toutes les trois ensemble : ainsi, si déjà la première condition est fausse, les autres sont "sautées"
(Je n'en suis pas très sûr, mais fais des essais en chronométrant le temps d'exécution, avec une variable Date à laquelle tu fais faire le calcul Heure de Fin - Heure de début)

Proposition :

Sub Lenteur()
Application.ScreenUpdating = False
Dim Chrono As Date: Chrono = Now

j = 3
While Range("D" & j).Value <> ""
For col = 12 To 27
cells(j, col).Select

If IsEmpty(cells(j, col)) Then
If ActiveCell.Offset(-1, 0).Value <> "" Then
If ActiveCell.Offset(-1, 0).Value = Range("AK1") Then
ActiveCell.Value = ActiveCell.Offset(-1, 0).Value
cells(j, col).Interior.ColorIndex = 15
End If
End If
End If
Next col
j = j + 2

Wend
Application.ScreenUpdating = False
Chrono = Now - Chrono: MsgBox Chrono
End Sub

A suivre...
0
Popu
 
Merci beaucoup!!! les commandes Application.ScreenUpDating font que c'est quasi instantané maintenant!!! Merci de tes conseils et de la rapidité de ta réponse, tu m'as été d'une grande aide!!!
0