IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Optimiser le temps d'éxecution d'une macro


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2018
    Messages : 5
    Par défaut Optimiser le temps d'éxecution d'une macro
    je voudrai bien que vous m'aidez à optimiser le temps d’exécution de la macro suivante qui ' Copie depuis un tableau la premiere ligne puis elle met le resultat de cette ligne ( qui est dans une autre feuille) dans une feuille appelé Feuil2 et puis elle pase à la ligne suivante et agrège les résultats de chaque ligne dans cette feuille , ceci tout en calculant le temps écouplé , le temps restant d'éxecution et le temps total estimé , et renvoie ) la fin le temps effectivement écoulé .
    Voila le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    Sub ElapsedTime()
       Dim StartTime As Double, EndTime As Double
       'Stores start time in variable "StartTime"
       StartTime = Timer
       'Aggregation"
       i = 2
       j = 2
       k = 4
     
       Application.ScreenUpdating = False
       For k = 8 To 11517
        Application.StatusBar = (k - 8) * 100 / 11509 & "%" & "  " & Format$(Timer - StartTime) & "s ecoulées " & "    Temps restant estimé :" & (11517 - k) * Format$(Timer - StartTime) / k & "s" & "Durée total d'éxecution " & Format$(Timer - StartTime) + (11517 - k) * Format$(Timer - StartTime) / k
        DoEvents
     
        Sheets("MP").Select
        Rows(k).Select
        Application.CutCopyMode = False
        Selection.Copy
        Rows(3).Select
        ActiveSheet.Paste
     
        For i = 2 To 100
            For j = 2 To 36
            Sheets("Feuil1").Select
            Cells(i, j) = Cells(i, j) + Worksheets(6).Cells(i, j).Value
     
     
            Next j
        Next i
    Next k
     
     Application.StatusBar = False
     Application.ScreenUpdating = True
       'Stores end time in variable "EndTime"
       EndTime = Timer
       'Prints execution time in the debug window
       Debug.Print "Execution time in seconds: ", EndTime - StartTime
    'Shows Message Box with elapsed time
       MsgBox "Execution time in seconds: " + Format$(EndTime - StartTime)
    End Sub

  2. #2
    Membre émérite
    Homme Profil pro
    Responsable des études(en disponibilité)
    Inscrit en
    Juin 2007
    Messages
    367
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable des études(en disponibilité)
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 367
    Par défaut
    essaye de supprimer les select

    remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     Sheets("MP").Select
        Rows(k).Select
        Application.CutCopyMode = False
        Selection.Copy
        Rows(3).Select
        ActiveSheet.Paste
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      Sheets("MP").Range("A" & k & ":d" & k).Copy ActiveSheet.Range("a3:d3")
    à adapter au nombre de colonnes à copier

    ajouter application.screenupdating

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2018
    Messages : 5
    Par défaut
    Merci , j'ai essayé mais ceci ne réduit pas le temps d'exécution c'est presque le même .

  4. #4
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 680
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 680
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
       For k = 8 To 11517
     [...]
        For i = 2 To 100
            For j = 2 To 36
               [...]
            Next j
        Next i
    Next k
    11510*99*35=39.882.150, tu écris donc cellule par cellule dans près de 40 millions de cellules, ça t'étonnes vraiment que ce soit long ?

    Je n'ai peut être pas bien compris comment fonctionne ta macro mais dans tes boucles for i et j je ne vois aucune référence à k, est ce normal ? As tu vraiment besoin de les mettre dans la boucle k ?

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2018
    Messages : 5
    Par défaut
    En fait moi ça m'étonne pas mais mon encadrant ( je suis en stage ) m'a dit qu' il y a certainement moyen pour minimiser le temps il m'a proposé de désactiver les calculs automatiques quand je copie mes lignes .Mais sinon , dans chaque itération de K je dois actualiser 100*30 Cellules ( j’agrège les résultats ) et ensuite je passe au K suivant parce que quand je change de ligne y'a 2 feuilles de calcul qui s'actualisent en fonctino des valeurs de cette ligne tu vois ? donc oui les 2 boucles doivent impérativement être dans la boucle K .

  6. #6
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Bonjour,

    Il y a quelques aberrations dans ton code alors que tu souhaites optimiser la durée !
    Il faut savoir que VBA est du code interprété donc chaque ligne est lue par le compilateur et exécutée donc, la ligne ci-dessous ralentit inutilement le code puisque le compilateur doit appeler des fonctions (Format, Timer) et effectuer des calculs et ça, 11517 fois :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Application.StatusBar = (k - 8) * 100 / 11509 & "%" & "  " & Format$(Timer - StartTime) & "s ecoulées " & "    Temps restant estimé :" & (11517 - k) * Format$(Timer - StartTime) / k & "s" & "Durée total d'éxecution " & Format$(Timer - StartTime) + (11517 - k) * Format$(Timer - StartTime) / k
    L'instruction "DoEvents" permet de laisser la main donc, le compilateur fait une pause pour que des actions puissent être exécutées par Excel.
    La copie de valeurs (ici, tu demande la ligne entière alors que tu as probablement que quelques dizaines de cellules) prend plus de temps que l'affectation de valeurs.
    Si tu as de nombreuses fonction dans tes feuilles, il serait préférable de paramétrer le calcul en manuel en début de code et le remettre en automatique en la fin.
    Et toujours sur un grand nombre de valeurs il est préférable d'affecter ces valeurs à un tableau en mémoire puis une fois les modifications apportées directement dans le tableau, coller ce dernier dans la feuille plutôt que de travailler directement sur les cellules.

  7. #7
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Re,

    Et surtout, il te faut éviter absolument tous les Select et Activate qui ne servent à rien si ce n'est à ralentir le code et faire scintiller l'écran !

    Dans ce bloc de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Sheets("MP").Select
    Rows(K).Select
    Application.CutCopyMode = False
    Selection.Copy
    Rows(3).Select
    ActiveSheet.Paste
    qui peux s'écrire simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Sheets("MP").Rows(K).Copy ActiveSheet.Rows(3)
    tu colles plus de 11000 fois les valeurs sur la même ligne, à savoir la ligne 3 ???

  8. #8
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2018
    Messages : 5
    Par défaut
    Citation Envoyé par Theze Voir le message

    tu colles plus de 11000 fois les valeurs sur la même ligne, à savoir la ligne 3 ???
    Oui oui parce que les calculs effectués dans les 2 autres feuilles font référence à la ligne 3. Donc une fois j'ai terminé avec une ligne dans mon tableau je passse à la ligne suivante en la copaint dans la ligne 3 .

  9. #9
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2018
    Messages : 5
    Par défaut
    Citation Envoyé par Theze Voir le message
    Bonjour,

    Il y a quelques aberrations dans ton code alors que tu souhaites optimiser la durée !
    Il faut savoir que VBA est du code interprété donc chaque ligne est lue par le compilateur et exécutée donc, la ligne ci-dessous ralentit inutilement le code puisque le compilateur doit appeler des fonctions (Format, Timer) et effectuer des calculs et ça, 11517 fois :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Application.StatusBar = (k - 8) * 100 / 11509 & "%" & "  " & Format$(Timer - StartTime) & "s ecoulées " & "    Temps restant estimé :" & (11517 - k) * Format$(Timer - StartTime) / k & "s" & "Durée total d'éxecution " & Format$(Timer - StartTime) + (11517 - k) * Format$(Timer - StartTime) / k
    L'instruction "DoEvents" permet de laisser la main donc, le compilateur fait une pause pour que des actions puissent être exécutées par Excel.
    La copie de valeurs (ici, tu demande la ligne entière alors que tu as probablement que quelques dizaines de cellules) prend plus de temps que l'affectation de valeurs.
    Si tu as de nombreuses fonction dans tes feuilles, il serait préférable de paramétrer le calcul en manuel en début de code et le remettre en automatique en la fin.
    Et toujours sur un grand nombre de valeurs il est préférable d'affecter ces valeurs à un tableau en mémoire puis une fois les modifications apportées directement dans le tableau, coller ce dernier dans la feuille plutôt que de travailler directement sur les cellules.
    Merciii beaucoup , j'ai tout essayé j'ai pas gagné beaucoup de temps mais bon je dirai 20 sec sur 400 lignesau lieu de 250 sec , maint c'est 230 .

Discussions similaires

  1. [XL-2010] Comment optimiser le temps de fonctionnement d'une macro
    Par MichaSarah dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 21/02/2016, 09h15
  2. [XL-2010] Comment optimiser le temps de fonctionnement d'une macro
    Par MichaSarah dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 23/12/2015, 00h29
  3. Allongement d'uin temps d'exécution d'une macro
    Par avanrill dans le forum Access
    Réponses: 2
    Dernier message: 06/03/2006, 19h29
  4. Réponses: 4
    Dernier message: 24/11/2005, 08h34
  5. Réponses: 9
    Dernier message: 20/06/2005, 12h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo