Ralentissement Macro

Le
Alf
Bonjour à tous,
Excel 2016

J'ai développé une macro qui fait apparaître plusieurs fen=
êtres, qui charge des tableaux en mémoire, qui va chercher des do=
nnées dans des gros fichiers Excel etc Un truc assez lourd.
J'ai remarqué que lorsque j'exécute la macro la première foi=
s, l'exécution est super rapide, la deuxième fois beaucoup moins,=
la troisième encore moins etc

Quand je ferme et rouvre mon classeur, que j'exécute la macro, tout se=
passe bien, c'est très rapide. ..

J'ai déjà rentré les instructions suivantes, Application.Scr=
eenUpdating = False, Application.Calculation = xlManual.
Je charge plusieurs fenêtres avec l'instruction Fenetre.show, j'ouvre =
plusieurs autres fichiers.

Ce que j'ai remarqué, c'est qu'avec la version Excel 2007 ça marc=
he très bien. Le temps d'exécution est toujours le même apr=
ès plusieurs lancements.

Merci pour votre aide précieuse
Alf

  • Partager ce contenu :
Vos réponses
Trier par : date / pertinence
MichD
Le #26520028
Le 25/06/19 à 01:22, Alf a écrit :
Bonjour à tous,
Excel 2016
J'ai développé une macro qui fait apparaître plusieurs fenêtres, qui charge des tableaux en mémoire, qui va chercher des données dans des gros fichiers Excel etc... Un truc assez lourd.
J'ai remarqué que lorsque j'exécute la macro la première fois, l'exécution est super rapide, la deuxième fois beaucoup moins, la troisième encore moins etc...
Quand je ferme et rouvre mon classeur, que j'exécute la macro, tout se passe bien, c'est très rapide. ..
J'ai déjà rentré les instructions suivantes, Application.ScreenUpdating = False, Application.Calculation = xlManual.
Je charge plusieurs fenêtres avec l'instruction Fenetre.show, j'ouvre plusieurs autres fichiers....
Ce que j'ai remarqué, c'est qu'avec la version Excel 2007 ça marche très bien. Le temps d'exécution est toujours le même après plusieurs lancements.
Merci pour votre aide précieuse
Alf


Bonjour,
Sans rien voir, c'est très hasardeux de répondre!
Tu peux toujours ajouter ces 2 lignes de code:
Au tout début de la procédure :
Application.EnableEvents = False
et comme dernière ligne de code :
Application.EnableEvents = True
Si tu as beaucoup de données qui sont demeurées dans le presse-papier,
tu peux exécuter cette procédure pour le vider avant l'exécution de ton
code, tu n'as qu'à l'appeler au début de ta procédure générale.
Call Vider_Presse_Papier
Dans le haut d'un module standard, déclaration des API
Declare Function OpenClipboard Lib "user32" _
(ByVal hwnd As Long) As Long
Declare Function EmptyClipboard Lib "user32" () As Long
Declare Function CloseClipboard Lib "user32" () As Long
Et la procédure :
'--------------------------
Sub Vider_Presse_Papier()
OpenClipboard 0
EmptyClipboard
CloseClipboard
End Sub
'--------------------------
MichD
Alf
Le #26520048
Le mardi 25 juin 2019 07:22:15 UTC+2, Alf a écrit :
Bonjour à tous,
Excel 2016
J'ai développé une macro qui fait apparaître plusieurs fen êtres, qui charge des tableaux en mémoire, qui va chercher des do nnées dans des gros fichiers Excel etc... Un truc assez lourd.
J'ai remarqué que lorsque j'exécute la macro la première f ois, l'exécution est super rapide, la deuxième fois beaucoup moin s, la troisième encore moins etc...
Quand je ferme et rouvre mon classeur, que j'exécute la macro, tout se passe bien, c'est très rapide. ..
J'ai déjà rentré les instructions suivantes, Application.S creenUpdating = False, Application.Calculation = xlManual.
Je charge plusieurs fenêtres avec l'instruction Fenetre.show, j'ouvr e plusieurs autres fichiers....
Ce que j'ai remarqué, c'est qu'avec la version Excel 2007 ça ma rche très bien. Le temps d'exécution est toujours le même ap rès plusieurs lancements.
Merci pour votre aide précieuse
Alf

OK Mich
Je vais essayer tout cela.
Mais quelle est la référence à cocher pour avoir la biblioth èque "user32" ?
Merci pour ton aide
Alf
MichD
Le #26520051
OK Mich
Je vais essayer tout cela.
Mais quelle est la référence à cocher pour avoir la bibliothèque "user32" ?
Merci pour ton aide

Tu n'as pas besoin de cocher une référence particulière dans Excel.
"API" tient pour "Windows application programming interface".
En fait, ce sont des fonctions que Windows utilise au besoin pour sa
propre gestion. Elles ne font pas partie d'une bibliothèque
supplémentaire, elles sont toujours disponibles, il s'agit de les
appeler correctement.
MichD
MichD
Le #26520099
Le 26/06/19 à 01:36, Alf a écrit :
Le mardi 25 juin 2019 07:22:15 UTC+2, Alf a écrit :
Bonjour à tous,
Excel 2016
J'ai développé une macro qui fait apparaître plusieurs fenêtres, qui charge des tableaux en mémoire, qui va chercher des données dans des gros fichiers Excel etc... Un truc assez lourd.
J'ai remarqué que lorsque j'exécute la macro la première fois, l'exécution est super rapide, la deuxième fois beaucoup moins, la troisième encore moins etc...
Quand je ferme et rouvre mon classeur, que j'exécute la macro, tout se passe bien, c'est très rapide. ..
J'ai déjà rentré les instructions suivantes, Application.ScreenUpdating = False, Application.Calculation = xlManual.
Je charge plusieurs fenêtres avec l'instruction Fenetre.show, j'ouvre plusieurs autres fichiers....
Ce que j'ai remarqué, c'est qu'avec la version Excel 2007 ça marche très bien. Le temps d'exécution est toujours le même après plusieurs lancements.
Merci pour votre aide précieuse
Alf

Bonjour,
Avec Excel 2007, ça fonctionne, mais avec Excel 2016, ça me génère une erreur de compilation.
En fait, dès que je pose ces déclarations dans le code, ça les met en défaut.
Merci du temps consacré :-)
Alf


Quelle est la version d'Excel qui pose problème?
Est-ce que cette version est 32 ou 64 bits?
Lors du message d'erreur, quelle est la ligne de code met en couleur
(jaune)?
Est-ce que le code a été placé dans un module standard?
Tu dois être plus explicite dans tes commentaires, je ne suis pas devin...
Si dans ton code, cette ligne de code est sur 2 lignes, est-ce le
caractère "_" est présent à la fin de la première ligne dans ton code?
Declare Function OpenClipboard Lib "user32" _
(ByVal hwnd As Long) As Long
MichD
Alf
Le #26520157
Le mardi 25 juin 2019 07:22:15 UTC+2, Alf a écrit :
Bonjour à tous,
Excel 2016
J'ai développé une macro qui fait apparaître plusieurs fen êtres, qui charge des tableaux en mémoire, qui va chercher des do nnées dans des gros fichiers Excel etc... Un truc assez lourd.
J'ai remarqué que lorsque j'exécute la macro la première f ois, l'exécution est super rapide, la deuxième fois beaucoup moin s, la troisième encore moins etc...
Quand je ferme et rouvre mon classeur, que j'exécute la macro, tout se passe bien, c'est très rapide. ..
J'ai déjà rentré les instructions suivantes, Application.S creenUpdating = False, Application.Calculation = xlManual.
Je charge plusieurs fenêtres avec l'instruction Fenetre.show, j'ouvr e plusieurs autres fichiers....
Ce que j'ai remarqué, c'est qu'avec la version Excel 2007 ça ma rche très bien. Le temps d'exécution est toujours le même ap rès plusieurs lancements.
Merci pour votre aide précieuse
Alf

Bonjour,
La version Excel 2016 est en 64 bits.
J'ai inséré "PrtSafe" après "Declare" et c'est Ok, plus d'er reur de compilation.
J'essaie avec toutes ces commandes et je te dirais si ça améliore la rapidité.
Merci
A+
Alf
MichD
Le #26520176
Si le fichier s'ouvre avec différentes versions, fais la déclaration des
API de cette manière (c'est ce qu'on appelle une compilation
conditionnelle) dans le haut d'un module standard.
Tu as quelques explications supplémentaires à cette adresse :
http://msdn.microsoft.com/fr-fr/library/office/gg264421(v=office.15).aspx
#If Vba7 Then
Declare PtrSafe Function OpenClipboard Lib "user32" Alias _
"OpenClipboard" (ByVal hwnd As LongPtr) As Long
Declare PtrSafe Function EmptyClipboard Lib "user32" Alias _
"EmptyClipboard" () As Long
Declare PtrSafe Function CloseClipboard Lib "user32" Alias _
"CloseClipboard" () As Long
Else
Declare Function OpenClipboard Lib "user32" _
(ByVal hwnd As Long) As Long
Declare Function EmptyClipboard Lib "user32" () As Long
Declare Function CloseClipboard Lib "user32" () As Long
End IF

MichD
MichD
Le #26520190
Attention, j'ai oublié le "symbole #" devant le Else and End if dans la
déclaration des API
on devrait lire
#If
#else
#end if
Mich

Le 27/06/19 à 06:29, MichD a écrit :
Si le fichier s'ouvre avec différentes versions, fais la déclaration des
API de cette manière (c'est ce qu'on appelle une compilation
conditionnelle) dans le haut d'un module standard.
Tu as quelques explications supplémentaires à cette adresse :
http://msdn.microsoft.com/fr-fr/library/office/gg264421(v=office.15).aspx
#If Vba7 Then
Declare PtrSafe Function OpenClipboard Lib "user32" Alias _
"OpenClipboard" (ByVal hwnd As LongPtr) As Long
Declare PtrSafe Function EmptyClipboard Lib "user32" Alias _
"EmptyClipboard" () As Long
Declare PtrSafe Function CloseClipboard Lib "user32" Alias _
"CloseClipboard" () As Long
Else
Declare Function OpenClipboard Lib "user32" _
    (ByVal hwnd As Long) As Long
Declare Function EmptyClipboard Lib "user32" () As Long
Declare Function CloseClipboard Lib "user32" () As Long
End IF

MichD
Alf
Le #26520357
Le mardi 25 juin 2019 07:22:15 UTC+2, Alf a écrit :
Bonjour à tous,
Excel 2016
J'ai développé une macro qui fait apparaître plusieurs fen êtres, qui charge des tableaux en mémoire, qui va chercher des do nnées dans des gros fichiers Excel etc... Un truc assez lourd.
J'ai remarqué que lorsque j'exécute la macro la première f ois, l'exécution est super rapide, la deuxième fois beaucoup moin s, la troisième encore moins etc...
Quand je ferme et rouvre mon classeur, que j'exécute la macro, tout se passe bien, c'est très rapide. ..
J'ai déjà rentré les instructions suivantes, Application.S creenUpdating = False, Application.Calculation = xlManual.
Je charge plusieurs fenêtres avec l'instruction Fenetre.show, j'ouvr e plusieurs autres fichiers....
Ce que j'ai remarqué, c'est qu'avec la version Excel 2007 ça ma rche très bien. Le temps d'exécution est toujours le même ap rès plusieurs lancements.
Merci pour votre aide précieuse
Alf

Bonjour,
Merci pour toutes ces infos.
Pour en revenir à mon problème initial, le fait d'insérer ce s lignes de codes supplémentaires font que la macro s’exé cute rapidement à chaque lancement. Plus de lenteur !
Je pense que le fait de vider le presse papier avant l’exécuti on, améliore grandement...
Merci pour ton aide
Alf
Poster une réponse
Anonyme