Lenteur macro

Résolu/Fermé
julia Namor Messages postés 524 Date d'inscription jeudi 27 mars 2014 Statut Membre Dernière intervention 13 janvier 2024 - 10 mars 2016 à 15:17
eriiic Messages postés 24600 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 21 octobre 2024 - 16 mars 2016 à 12:56
Bonjour chers toutes et tous
J'ai une macro qui prend une éternité pour s'exécuter ( series de boucles ++++)
Y aurait un moyen pour réduire le temps d’exécution?
je vous remercie de votre aide

https://www.cjoint.com/c/FCkonHYey6y

A voir également:

7 réponses

gbinforme Messages postés 14946 Date d'inscription lundi 18 octobre 2004 Statut Contributeur Dernière intervention 24 juin 2020 4 709
10 mars 2016 à 22:42
Bonjour,

En fonctionnant à partir de la feuille comme tu fais, il ne faut pas espérer pouvoir gagner beaucoup de temps. Il faudrait pouvoir fonctionner en table mémoire, ce qui diviserait fortement la durée. Cependant tu as mis des paramètres dans les commentaires et donc il faudrait complétement revoir la structure.
D'autre part, sans connaitre le contexte et les contraintes c'est difficile de reprendre ta belle œuvre mais lorsque l'on écrit autant de code, il faut bien se douter qu'il lui faut du temps pour s'exécuter...
J'avais créé un classeur qui générait une application HTML à partir des feuilles comme toi qui durait de longues minutes et en la reprenant en table mémoire, cela prend quelques secondes...
0
julia Namor Messages postés 524 Date d'inscription jeudi 27 mars 2014 Statut Membre Dernière intervention 13 janvier 2024 33
11 mars 2016 à 09:15
Bonjour
Merci de ta réponse gbinforme

Je n'y connais absolument rien en table mémoire mais si c'est l'unique solution pour executer le code en quelques secondes je veux bien apprendre.
Peux tu m'envoyer des liens?
Par ailleurs je vais esayer de regrouper quelques boucles et retirer des "select" , histoire de voir si je peux grappiller quelques secondes

Cordialement
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 310
11 mars 2016 à 16:47
bonjour

un exemple comparatif de vitesse macro (variable tableau=table mémoire)
http://www.cjoint.com/c/FClpSZC5NYv

un tuto là dessus
https://silkyroad.developpez.com/vba/tableaux/

0
julia namor
14 mars 2016 à 10:00
Bonjour
je me rends compte que la lenteur vient de cette macro qui gére les valeurs des commentaires.

 On Error Resume Next

For L_1 = 11 To 36 'boucle ligne



Set Plage_1 = .Range(localisedeb_1 & L_1 & ":" & Localisefin_1 & L_1) 'mise en memoire

For Each o_1 In Plage_1 'boucle colonnes
If Not o_1.Comment Is Nothing Then 'cellule avec commentaire
coco_RC_1 = InStr(o_1.Comment.Text, "Rc") <> 0
If coco_RC_1 = True Then
TC_RC_1 = Split(o_1.Comment.Text, ":") 'ReCUP_IDE_SSRNUTeration nombre dans TC_RC (1)
If IsNumeric(TC_RC_1(1)) Then 'test si numerique
.Range("RA" & L_1).Offset(0, 0).Value = .Range("RA" & L_1).Offset(0, 0).Value + CDbl(TC_RC_1(1)) 'addition des nombres commentaires
.Range("RA" & L_1).Offset(0, 0).NumberFormat = "0""h"".0"
End If
End If
End If
Next

For Each o_1 In Plage_1 'boucle colonnes
If Not o_1.Comment Is Nothing Then 'cellule avec commentaire
coco_Hsup_1 = InStr(o_1.Comment.Text, "Hsup") <> 0
If coco_Hsup_1 = True Then
TC_Hsup_1 = Split(o_1.Comment.Text, ":") 'ReCUP_IDE_SSRNUTeration nombre dans TC_Hsup_1(1)
If IsNumeric(TC_Hsup_1(1)) Then 'test si numerique
.Range("QZ" & L_1).Offset(0, 0).Value = .Range("QZ" & L_1).Offset(0, 0).Value + CDbl(TC_Hsup_1(1)) 'addition des nombres commentaires
.Range("QZ" & L_1).Offset(0, 0).NumberFormat = "0""h"".0"
End If
End If
End If
Next


Est ce possible de l'optimiser à fond ?

cordialement
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
gbinforme Messages postés 14946 Date d'inscription lundi 18 octobre 2004 Statut Contributeur Dernière intervention 24 juin 2020 4 709
14 mars 2016 à 13:24
Bonjour,

Pour l'optimiser à fond il faut réfléchir longuement mais simplement en remplaçant ces lignes, cela devrait être très sensible :
For Each o_1 In Plage_1.SpecialCells(xlCellTypeComments)     'boucle colonnes

0
gbinforme Messages postés 14946 Date d'inscription lundi 18 octobre 2004 Statut Contributeur Dernière intervention 24 juin 2020 4 709
16 mars 2016 à 08:57
Bonjour,

Aucun écho ???
0
eriiic Messages postés 24600 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 21 octobre 2024 7 240
14 mars 2016 à 23:39
Bonjour,

et tu as mis Application.ScreenUpdating = False au début de cette proc ?
eric
0
julia Namor Messages postés 524 Date d'inscription jeudi 27 mars 2014 Statut Membre Dernière intervention 13 janvier 2024 33
15 mars 2016 à 07:50
Bonjour Eric
Oui j'ai bien mis Application.ScreenUpdating = False au début de la procédure
merci
0
julia Namor Messages postés 524 Date d'inscription jeudi 27 mars 2014 Statut Membre Dernière intervention 13 janvier 2024 33
16 mars 2016 à 11:12
Bonjour Gbinforme
Oui j'ai remplacé par "SpecialCells(xlCellTypeComments)" .Je ne connaissais pas la méthode SpecialCells().
Mais il me semble que c'est sensiblement plus rapide.
Autre astuce????
Cordialment
0
eriiic Messages postés 24600 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 21 octobre 2024 7 240
16 mars 2016 à 12:56
Bonjour,

oui, une excellente astuce : ne jamais mettre On Error Resume Next pour se débarrasser des erreurs.
C'est mettre la poussière sous le tapis et ne plus voir des énormités.
Une autre qui ne te fera gagner aucun temps non plus : les .Offset(0, 0) sont inutiles et embrouillent la lecture pour rien.

Et une dernière qui t'en fera gagner un peu : sortir les .NumberFormat des boucles et l'appliquer aux colonnes ou plages concernées avant de quitter (dans la mesure où c'est le seul format utilisé)
Il y a tant de colonnes que ça à traiter ? Parce que pour seulement 25 lignes à faire ça parait étrange qu'une lenteur apparaisse. C'est quoi le temps de cette partie ?
Peut-être qu'un fichier exemple permettra d'y voir plus clair.
eric
0