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 :

Enorme différence de performance entre VBE et Excel


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Chef équipe
    Inscrit en
    Décembre 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef équipe
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2012
    Messages : 3
    Par défaut Enorme différence de performance entre VBE et Excel
    Bonjour à tous,


    Après avoir lu...beaucoup de messages sur le sujet, je viens ici pour vous exposer mon constat.


    Pour planter le décor, je ne suis pas un pro en Vba mais....au bout de quelques années d'expérience, je sais un minimum de choses ^^

    Ayant donc développé quelques centaines de macros, je n'avais jamais vraiment pris conscience de l'énorme (le mot est faible !) différence de vitesse d'exécution d'une macro (dans mon cas au moins), selon qu'elle soit exécutée depuis un bouton d'une feuille ou depuis...VBE !!!

    Mon dernier exemple : une macro qui charge une page du Net, la décortique, fait des copies et des calculs dans tous les sens entre plusieurs feuilles d'un classeur passe de 5 secondes depuis un bouton environ à 0,5s maxi depuis VBE !!!

    Sur le Net on voit fleurir les innombrables recommandations pour améliorer les performances de ses macros.
    Dans mon cas, cela n'a que peu amélioré les choses.

    Et de toute façon, je suis simplement impressionné par la vitesse obtenue depuis l'interface VBE !!!

    Avez-vous déjà constaté cela ?
    Auriez-vous une idée géniale encore inconnue sur le Net ?


    En vous remerciant par avance pour vos échanges constructifs,

    Cordialement.

    PS : vieil inscrit , je n'ai effectivement jamais rien posté jusqu'alors. Si ma demande d'aide vous parait insupportable, je disparaitrai sans bruit... ^^

  2. #2
    Membre Expert Avatar de mfoxy
    Homme Profil pro
    Automation VBA
    Inscrit en
    Février 2018
    Messages
    752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Automation VBA
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2018
    Messages : 752
    Par défaut
    Bonsoir,

    Personnelement, je n'ai jamais rencontré ce souci.
    A titre d'expérience, s'il s'agit d'un site web public (non intranet) ,pourriez-vous déposer votre code que je test de mon côté ?

    Bav,

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Chef équipe
    Inscrit en
    Décembre 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef équipe
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2012
    Messages : 3
    Par défaut
    Bonsoir mfoxy,


    Je redis bien que, au fond, ce n'est pas un vrai soucis, juste un constat. Si je n'avais pas été attiré par une différence d'exécution de temps en temps au cours du dev, je n'aurai jamais creusé.

    Je ne souhaite pas passer mon travail sur le forum (désolé), mais il suffit de fabriquer une macro qui va manipuler de grosse quantités de données entre feuilles pour le constater.

    Et pour constater, exécuter sa macro depuis un bouton de feuille (noter son temps d'exécution précisément) et faire de même depuis VBE.

    Merci quand même pour votre réponse,


    Bien cordialement.

  4. #4
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 252
    Par défaut
    hello,
    Lorsque vous utilisez une macro qui effectue un grand nombre de modifications sur une ou des feuilles,
    Excel actualise l'affichage à chaque modification ce qui peut considérablement ralentir la macro.


    Pour demander à Excel de ne pas actualiser l'affichage, ajoutez ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub exemple()
        Application.ScreenUpdating = False
     
        'Code ici 
     
        Application.ScreenUpdating = True 'Facultatif    
    End Sub
    Sinon si il y a beaucoup de formules et que l'on est en calcul automatique on peut essayer de repasser en mode calcul manuel au début de la macro :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Application.Calculation = xlCalculationManual 
    'Application.Calculation = xlCalculationAutomatic

    Ami calmant, J.P

  5. #5
    Membre Expert
    Avatar de cavo789
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2004
    Messages
    1 797
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 797
    Par défaut
    Bonjour

    Est-ce que je comprends bien : strictement la même macro; une fois exécutée depuis une feuille (p.ex. un bouton placé sur une feuille et assignation de macro) et l'autre fois exécutée depuis l'éditeur VBA donnerait des temps fortement différent ?

    Perso, je n'ai jamais constaté cela et je n'en vois pas la raison. Excepté, comme dit ci-dessus, le fait de devoir rafraîchir l'écran (Application.ScreenUpdating) dans un cas et pas dans l'autre. Cela se règle aisément du coup.

    As-tu reproduit ce problème à de multiples reprises ? Pour valider ton sentiment ? (au lieu de noter la durée, autant prévoir un petit msgbox qui afficherait le temps pris afin d'être sûr de bien démarrer/arrêter le chrono).

    Bonne journée.

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Chef équipe
    Inscrit en
    Décembre 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef équipe
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2012
    Messages : 3
    Par défaut
    Bonjour,


    Effectivement Cavo et Jurassic...je parle bien strictement de la même macro sans aucune modification !

    Et oui, ce n'est pas un sentiment, c'est quelque chose que j'ai vérifié avec une mesure entre le début et la fin de macro en utilisant un Now à chaque fois.

    Dans mon cas, et cela est donc très lié à mes traitements qui , je le répète, recopient pas mal de données (plusieurs milliers de lignes) entre feuilles avec des calculs entre-temps, l'exécution passe donc de 7 secondes en moyenne à 1,5s maxi.

    D'ailleurs, au passage, je suis un peu épaté de la relative performance d'Excel sur mon ordi au vu de ce que je lui demande : 1,5s pour faire tout ça, à la réflexion....c'est très très bien !!!


    Pour terminer, cela est totalement reproductible, à volonté :-)

    Avez-vous déjà lu les échanges sur le Net constatant la même chose (plutôt forum anglophones) et proposant de lancer VBE par code et déclencher l'exécution de la macro depuis la fenêtre d'exécution ?


    Cela m'interpelle...


    Cordialement.

  7. #7
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 478
    Par défaut
    Bonjour,

    Je n'ai pas souvenir d'avoir eu ce problème, mais ...
    j'ai déjà eu des macros qui ne fonctionnaient que si le VBE était lancé (sans en avoir trouvé la raison).
    Il y a une quinzaine d'années, c'était Excel 2002 ou 2003.

    Sans le code, il est difficile de savoir pourquoi, ça peut être lié à la sauvegarde automatique.

    Quelle version d'Excel utilises-tu ? avec quel OS ?

  8. #8
    Rédacteur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2013
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Août 2013
    Messages : 1 041
    Par défaut
    Bonjour.
    Comme le sujet m'a interpellé, j'ai fait des tests ce matin.
    Et à force de tester, je suis tombé sur un cas bizarre: (ma configuration : Windows 10, Excel 2016).
    J'ouvre Excel, puis un classeur vierge. Je ne saisis rien dans la feuille de calcul et passe directement dans le VBE.
    je tape ce code pour afficher un compteur en A1, c'est tout bête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Public Sub TestZZ()
    T = Timer
    For i = 1 To 10000
    Range("A1") = i
    Next i
    MsgBox "durée : " & Timer - T
    End Sub
    Je demande une compilation au cas où il y aurait une erreur.
    je lance la procédure depuis le VBE : durée = 8 secondes. Impossible avec si peut de traitement. Je relance = idem.
    Je vais sur la feuille de calcul, et j'y tape n'importe quoi dans une cellule.
    Je lance une nouvelle fois ma procédure : durée = 0,2 secondes.
    Vous imaginez bien que j'ai refais cette expérience plusieurs fois avant de vous la présenter.
    Souvent c'était pareil, mais parfois ça me donnait bien 0,2 du premier coup.

    A noter que j'ai l'impression que la procédure lancée depuis un bouton sur la feuille de calcul me semble légèrement plus rapide que depuis le VBE.
    Voilà, c'est tout.
    Cordialement.

  9. #9
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 478
    Par défaut
    Bonjour le Fil

    @Laurent_ott : J'ai à peu près la même chose avec W10 et 2016 (32 bits)

    C'est l'actualisation de l'écran qui prend du temps.
    Sur de nombreux essais, c'est plus lent au début puis ça se stabilise mais il y a parfois des fluctuations d'une à deux secondes :
    - Depuis le VBE : 13 secondes au début puis se stabilise autour de 11 secondes
    - Depuis Excel, VBE ouvert : 12 secondes au début puis se stabilise autour de 9 secondes
    - Depuis Excel, VBE fermé : 11 secondes au début puis se stabilise autour de 8 secondes

    Mais depuis le VBE avec la fenêtre Excel minimisée : 0.5 secondes
    Et depuis VBE si la fenêtre Excel est visible on revient à 11 secondes

    Si on ajoute un ScrenUpdating = False, les temps depuis le VBE et depuis Excel sont similaires : 0.5 secondes

    Constat similaire avec Excel 2007 sauf quand la fenêtre est minimisée : 4.5 secondes alors qu'avec screenupdating=false j'ai 0.5 secondes.

  10. #10
    Rédacteur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2013
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Août 2013
    Messages : 1 041
    Par défaut
    Par curiosité j'ai complété mon test de ce matin (qui donne 8 secondes si je ne mets rien dans une cellule de la feuille active) en enregistrant le classeur. Puis en l'ouvrant et en lançant le code par le VBE : toujours pareil avec 8 secondes de traitement.
    Si je mets n'importe quoi dans une cellule. J'enregistre et je ferme. J'ouvre, je relance : 0,2 secondes.
    Curieux.
    Mais ça peut être bon à savoir.

    j'ai refais le test en ajoutant cette fois Application.ScreenUpdating = False dans le code.
    Et là ça donne bien 0,2 dans tous les cas.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Sub test()
    Application.ScreenUpdating = False
    T = Timer
    For i = 1 To 10000
    Range("A1") = i
    Next i
    Debug.Print "Durée: " & Timer - T
    End Sub
    Cordialement.

  11. #11
    Membre Expert
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 817
    Billets dans le blog
    10
    Par défaut
    Salut,

    Vous voulez rire?


    Essayez ce test (le votre en fait légèrement modifié) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub test()
    Dim T As Single, i As Long
    Application.ScreenUpdating = False
    T = Timer
    For i = 1 To 50000
    Range("A" & i) = i
    Next i
    Debug.Print "Durée: " & Timer - T
    End Sub
    Puis, lancez cette macro :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub ModifieHauteur()
    Dim i As Long
    Application.ScreenUpdating = False
    For i = 1 To 50000 Step 150
        Range("A" & i).RowHeight = 24
    Next i
    End Sub
    Et refaites le 1er test...

    Cela pour dire que sans les données, ni le code, ni la feuille, il est ardu de tester...

  12. #12
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 478
    Par défaut
    Bonjour Franck,
    Citation Envoyé par pijaku Voir le message
    Vous voulez rire?
    Essayez ce test
    ...
    Puis, lancez cette macro :
    ...
    Et refaites le 1er test...
    Chez moi aucune différence ...
    (sur une feuille vierge au départ)

  13. #13
    Membre Expert
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 817
    Billets dans le blog
    10
    Par défaut
    Chez moi, aucune différence entre l'exécution depuis VBE et l'exécution depuis un bouton.
    Par contre, une différence notable entre le 1er test et le second après avoir modifié la hauteur des lignes.
    Je passe de 0,2 s à 3,8...

    Tout ceci confirme que ce sujet, sans classeur, code, feuille, données, etc... ne pourra aboutir que difficilement...

Discussions similaires

  1. Enorme différence de performance entre deux environnements
    Par NoPr0n dans le forum Administration
    Réponses: 7
    Dernier message: 10/09/2016, 04h16
  2. [PC portable] Différence de performance entre processeur 2 Ghz et 2,5 GHz
    Par debdev dans le forum Ordinateurs
    Réponses: 5
    Dernier message: 02/11/2009, 13h41
  3. Différence de performance entre localhost et serveur
    Par Borowsky dans le forum Décisions SGBD
    Réponses: 5
    Dernier message: 10/09/2009, 01h56
  4. Réponses: 14
    Dernier message: 12/04/2009, 21h47
  5. Différence de performance entre JOIN et Subselect ?
    Par guidav dans le forum Requêtes
    Réponses: 1
    Dernier message: 20/07/2007, 11h01

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