Lenteur macro

Résolu
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

7 réponses

  1. Contributeur
    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
    1. 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
      1. 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
        1. Contributeur
          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
          1. Contributeur
            Bonjour,

            Aucun écho ???
            0
        2. Contributeur
          Bonjour,

          et tu as mis Application.ScreenUpdating = False au début de cette proc ?
          eric
          0
          1. Bonjour Eric
            Oui j'ai bien mis Application.ScreenUpdating = False au début de la procédure
            merci
            0
        3. 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
          1. Contributeur
            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