Question optimisation macro Le sujet est résolu

Y compris Power BI, Power Query et toute autre question en lien avec Excel
h
hoooodini
Membre habitué
Membre habitué
Messages : 52
Appréciation reçue : 1
Inscrit le : 2 avril 2019
Version d'Excel : 2016FR

Message par hoooodini » 19 avril 2019, 15:44

Bonjour, pas de problème, seulement une question.

J'utilise dans mon code une structure de boucle do.
i = 2
Do
    a = Cells(i, 4).Value
    Cells(i, 4).Value = Year(a)
    i = i + 1
Loop Until IsEmpty(Cells(i, 4))
Je l'utilise en plusieurs endroit, pas pour faire la même chose, mais l’idée est la même (prendre valeur de cette cellule et faire action en fonction)
Mais je ne comprend pas pourquoi c'elle ci est plus rapide.
i = 2
Cells(i, 4).Activate
Do
    a = ActiveCell.Value
    Cells(i, 4).Value = Year(a)
    i = i + 1
    Cells(i, 4).Activate
Loop Until IsEmpty(ActiveCell)
Avec la première structure mon programme met 37s tandis que avec la deuxieme, il met 25s.

Quelqu’un aurait une idée ? Etant donné que j'en suis à l'étape d'optimisation j'aimerais comprendre. :mrgreen:

Hooodini
h
h2so4
Passionné d'Excel
Passionné d'Excel
Messages : 9'136
Appréciations reçues : 376
Inscrit le : 16 juin 2013
Version d'Excel : 365 UK Windows 10

Message par h2so4 » 19 avril 2019, 16:07

bonjour,

chez moi, la première structure est 30 x plus rapide que la seconde, et cela correspond à ce à quoi je m'attendais (activate et select ont une influence négative sur le temps d'exécution).
1 membre du forum aime ce message.
h
hoooodini
Membre habitué
Membre habitué
Messages : 52
Appréciation reçue : 1
Inscrit le : 2 avril 2019
Version d'Excel : 2016FR

Message par hoooodini » 23 avril 2019, 09:16

J'ai réessayer après avoir redémarrer, je gagne effectivement du temps, mais pas autant que j’espérais.
h
hoooodini
Membre habitué
Membre habitué
Messages : 52
Appréciation reçue : 1
Inscrit le : 2 avril 2019
Version d'Excel : 2016FR

Message par hoooodini » 23 avril 2019, 09:54

Bonjour acide sulfurique,

Je ne comprend pas du tout comment cela marche, j'ai relancer encore avec la nouvelle structure, sauf que la j'ai exactement le même temps que avec l'ancienne structure.

Est ce que les performance d'excel varie avec le temps?
J'ai deux macro chronométrée que je lance a la suite, la première le temps varie et la deuxième reste fixe.

La première est celle que je souhaite optimiser, mais le temps varie de 22 a 37 seconde d’exécution sans toucher au code.
Je doit avouer que le temps n'est pas forcement un problème, mais je n'aimerais pas avoir de problème d'exécution qui arrivent aléatoirement.

Cordialement.
Avatar du membre
Pedro22
Passionné d'Excel
Passionné d'Excel
Messages : 3'901
Appréciations reçues : 395
Inscrit le : 26 janvier 2017
Version d'Excel : 2010 FR
Version de Sheets : FR
Téléchargements : Mes applications

Message par Pedro22 » 23 avril 2019, 10:19

Bonjour, salut h2so4

Une piste d'optimisation à tester :
Sub MaMacro()

Dim i As Long 'Déclaration de variables
Application.Calculation = xlCalculationManual 'Désactive le recalcul auto des formule Excel
For i = 2 To Range("D" & Rows.Count).End(xlUp).Row 'Boucle sur les lignes, de la 2ème à la dernière
    If IsDate(Range("D" & i)) Then Range("D" & i) = Year(Range("D" & i)) 'Pas besoin d'une variable intermédiaire
Next i
Application.Calculation = xlCalculationAutomatic

End Sub
Merci de prendre 30 sec pour lire la charte du forum.
Quelques conseils : ici
h
hoooodini
Membre habitué
Membre habitué
Messages : 52
Appréciation reçue : 1
Inscrit le : 2 avril 2019
Version d'Excel : 2016FR

Message par hoooodini » 23 avril 2019, 13:37

Merci beaucoup,

Effectivement ça marche aussi. en changeant quelque bloc de mon code j'ai gagner un seconde. Je suis en train de regarder ce que je pourrais améliorer d'autre.

Sur ce, je vais clore le sujet.
Avatar du membre
Pedro22
Passionné d'Excel
Passionné d'Excel
Messages : 3'901
Appréciations reçues : 395
Inscrit le : 26 janvier 2017
Version d'Excel : 2010 FR
Version de Sheets : FR
Téléchargements : Mes applications

Message par Pedro22 » 23 avril 2019, 13:49

hoooodini a écrit :
23 avril 2019, 13:37
Effectivement ça marche aussi.
C'est un premier pas, mais est-ce plus rapide ??
Merci de prendre 30 sec pour lire la charte du forum.
Quelques conseils : ici
h
hoooodini
Membre habitué
Membre habitué
Messages : 52
Appréciation reçue : 1
Inscrit le : 2 avril 2019
Version d'Excel : 2016FR

Message par hoooodini » 23 avril 2019, 15:17

oui mais ça m'as seulement permis de gagner une seconde.

J'ai réussi a descendre encore plus avec :
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.EnableEvents = False


Application.ScreenUpdating = True
Application.Calculation = Application.Calculation
Application.EnableEvents = ActivationEvents
Maintenant je sais pas ce que je peut faire de plus.
h
h2so4
Passionné d'Excel
Passionné d'Excel
Messages : 9'136
Appréciations reçues : 376
Inscrit le : 16 juin 2013
Version d'Excel : 365 UK Windows 10

Message par h2so4 » 24 avril 2019, 10:58

hoooodini a écrit :
23 avril 2019, 15:17

Maintenant je sais pas ce que je peut faire de plus.
bonjour,

travailler avec des arrays VBA.

exemple si date en colonne A
    dl = Cells(Rows.Count, 1).End(xlUp).Row 'nombre de lignes
    ad = Range("A1:A" & dl) 'on charge les dates dans un tableau
    For i = 1 To dl
        ad(i, 1) = Year(ad(i, 1)) 'on ne garde que l'année
    Next i
    Range ("A1:A") & dl = ad 'on remet le tableau dans la feuille
h
hoooodini
Membre habitué
Membre habitué
Messages : 52
Appréciation reçue : 1
Inscrit le : 2 avril 2019
Version d'Excel : 2016FR

Message par hoooodini » 24 avril 2019, 14:22

Je ne comprend pas ton code, c'est quoi "ad" ?
Tu luis attribue un range et tu fait parcourir chaque cellule pour rentrer = Year(ad(i, 1)).
En quoi est-ce différent de moi ?
La différence que je voit c'est que tu utilise "for-next" alors que moi j'utilise "do-loop". Est ce que un est plus rapide que l'autre?
Répondre Sujet précédentSujet suivant
  • Sujets similaires
    Réponses
    Vues
    Dernier message
  • Optimisation de ma macro
    par Floo73 » 31 juillet 2014, 10:24 » dans Excel - VBA
    2 Réponses
    245 Vues
    Dernier message par Floo73
    31 juillet 2014, 11:58
  • Optimisation Macro
    par deton » 10 mai 2016, 17:21 » dans Excel - VBA
    8 Réponses
    274 Vues
    Dernier message par deton
    2 juin 2016, 08:14
  • OPTIMISATION DE MACRO
    par gouloom » 24 mai 2017, 16:51 » dans Excel - VBA
    6 Réponses
    114 Vues
    Dernier message par gouloom
    24 mai 2017, 20:48
  • Optimisation de macro
    par quik09 » 21 janvier 2018, 22:09 » dans Excel - VBA
    9 Réponses
    115 Vues
    Dernier message par LouReeD
    23 janvier 2018, 23:15
  • Optimisation de ma macro
    par Jauster » 26 septembre 2017, 10:07 » dans Excel - VBA
    3 Réponses
    124 Vues
    Dernier message par Efgé
    26 septembre 2017, 13:28
  • optimisation macro
    par djeanphi » 1 octobre 2014, 13:09 » dans Excel - VBA
    3 Réponses
    283 Vues
    Dernier message par eriiic
    1 octobre 2014, 14:21