Vitesse d'exécution de code variable selon l'appel

Mic13710

XLDnaute Junior
Bonjour à tous,

Sur Excel 2010, je ne comprends pas comment la vitesse d’exécution d'un code peut varier dans des proportions extrèmement importantes selon la méthode d'appel de la procédure.

Je m'explique.

Si j'exécute le code suivant :
Code:
Sub MonCodeDirect()
Dim Temps as Single
Temps = Timer
ici mon code .....
.......
Temps = Temps - Timer
MsgBox Temps
End sub
le temps d'exécution est de seulement 0.2 sec malgré un code assez chargé.

Mais si j'exécute le même code à partir d'une autre procédure où il n'y a qu'un appel vers celle au dessus :
Code:
Sub MonCodeIndirect()
MonCodeDirect
End Sub
le temps d'exécution passe à 2 sec, soit 10 fois plus !

Alors que sur la version 2007 les mêmes procédures donnent les mêmes temps en direct ou indirect, soit 2 sec.

Ce qui me surprends le plus c'est surtout la vitesse supersonique en adressage direct avec 2010, et qu'ensuite cette vitesse ne soit pas maintenue en adressage indirect.

Si quelqu'un a une explication sur ce comportement très étrange, je suis preneur.

Cordialement,

Michel
 

Mic13710

XLDnaute Junior
Re : Vitesse d'exécution de code variable selon l'appel

Bonjour à tous,

Personne n'a une petite idée pourquoi la même procédure peut-être en mode Formule 1 ou en mode brouette selon qu'elle est appelée en direct ou via une autre procédure ?
Bien sûr ce serait très bien d'avoir le mode Formule 1 dans les 2 cas, mais c'est surtout cette différence de temps d'exécution à environnement identique qui est totalement incompréhensible.

Michel
 

Mic13710

XLDnaute Junior
Re : Vitesse d'exécution de code variable selon l'appel

Je viens de faire d'autres essais et en fait pour le mode direct, ma macro était lancée par un bouton, alors que le mode indirect l'était depuis VBA. En lançant ma macro directement de VBA, le temps est alors le même qu'en indirect, ce qui est plus logique.
Dans mes derniers tests les temps obtenus sont les suivants : 0.2 sec par le bouton et 3 sec directement dans vba.

Histoire de dire que je ne rêvais pas, j'ai créé un bouton qui renvoit vers une macro lancée normalement par le programme. Cette macro inclus 3 appels à 3 procédures distinctes. En exécution via un lancement direct dans Vba : 7 à 9 sec.
Temps d'exécution via le bouton : mois d'1 sec .... Comprend qui peut.

Et donc la question devient : pourquoi dans excel 2010 le lancement d'une macro par un bouton est beaucoup plus rapide en exécution qu'un lancement à partir du code lui-même ?

Edit : petite précision : le bouton est de type Formulaire. Le bouton de type ActiveX produit les même temps que l'appel par le programme, ce qui me semble là aussi assez logique puisque dans ce cas c'est le programme qui renvoit vers la macro et non le bouton lui-même comme c'est le cas avec le type Formulaire.
 
Dernière édition:

Mic13710

XLDnaute Junior
Re : Vitesse d'exécution de code variable selon l'appel

Bonjour mapomme,

Je comprends bien, mais le fichier est très gros, difficile à réduire, et les macros font appel à des données sur les feuilles les plus chargées.
Je n'ai pas trop de temps en ce moment pour essayer de diminuer ce fichier. Si j'y arrive, je ne manquerai pas de revenir le poster.
Merci d'avoir essayé.
Michel
 

Dranreb

XLDnaute Barbatruc
Re : Vitesse d'exécution de code variable selon l'appel

Bonjour.
Je serais tout de même très étonné si, en Excel 2010, il existait un nouveau dispositif analysant les Sub attachées à des boutons de formulaires ou de commande et capable de remplacer automatiquement les appels à Range ou Cells (très pénalisants) par des consultations de tableaux de variants transmis en une fois à la procédure, système qui ne détecterait donc pas les procédures appelées indirectement…
Hormis cette éventualité très douteuse, il n'existe dans ce que vous nous soumettez comme éléments de réflexion aucune explication possible à ce que vous décrivez. Nous en somme donc conduits à penser que l'explication tient en ce que vous ne nous dites pas, forcément, puisque vous même vous ne le soupçonnez pas…
 

Mic13710

XLDnaute Junior
Re : Vitesse d'exécution de code variable selon l'appel

Merci Dranreb pour cette explication. Mais enfin ...
Je suis l'auteur et l'unique développeur de ce fichier sur lequel je travaille régulièrement depuis plus de 4 ans. J'en connais les codes dans leurs moindres détails.
Le premier développement a été fait sur Excel 2003. Il a fallu ensuite le modifier pour qu'il fonctionne en mode compatibilité sous 2007 (et oui, cette version a des difficultés avec les formes protégées, mais pas 2003 et pas 2010...). Puis à nouveau pour qu'il fonctionne sous 2010 (les MFC n'acceptent plus les formules matricielles sur cette version).
Comme la compatibilité n'est jamais à 100%, il faut invariablement retravailler les formules et/ou les codes pour permettre de passer aux versions supérieures.
Chaque version a son fonctionnement propre.
J'ai ensuite abandonné le format 97-2003 pour passer au format xlsm. Je ne travaille pas encore avec 2013 avec lequel je suppose il va falloir revoir la copie. Mais déjà, entre 2007 et 2010, les différences sont notables, à commencer par la taille du fichier qui est variable en fonction de la version : 1.4M sous 2007 et 1.9M sous 2010.
Bref, ceci pour dire que je maitrise assez bien Excel et que je connais particulièrement bien mon fichier.
Aussi, je ne peux que confirmer cette différence de comportement entre chaque bouton avec la version 2010 et uniquement cette version. Peut-être aussi que la version 64bit a un impact, mais je ne saurais le dire.
Pour être complet, le code du bouton activeX est le suivant :
Code:
Private Sub CommandButton1_click()
MonCodeDirect
End Sub
et que le bouton formulaire pointe vers MonCodeDirect.
Les deux boutons lancent bien le même code, rien de plus, mais les vitesses d'exécution sont radicalement différentes, et à cela, je n'ai aucune explication logique.
On ne peut-être plus direct et je ne vois pas ce qu'on peut soupçonner.