Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Ralentissement Macro

8 réponses
Avatar
Alf
Bonjour =C3=A0 tous,
Excel 2016=20

J'ai d=C3=A9velopp=C3=A9 une macro qui fait appara=C3=AEtre plusieurs fen=
=C3=AAtres, qui charge des tableaux en m=C3=A9moire, qui va chercher des do=
nn=C3=A9es dans des gros fichiers Excel etc... Un truc assez lourd.
J'ai remarqu=C3=A9 que lorsque j'ex=C3=A9cute la macro la premi=C3=A8re foi=
s, l'ex=C3=A9cution est super rapide, la deuxi=C3=A8me fois beaucoup moins,=
la troisi=C3=A8me encore moins etc...

Quand je ferme et rouvre mon classeur, que j'ex=C3=A9cute la macro, tout se=
passe bien, c'est tr=C3=A8s rapide. ..

J'ai d=C3=A9j=C3=A0 rentr=C3=A9 les instructions suivantes, Application.Scr=
eenUpdating =3D False, Application.Calculation =3D xlManual.
Je charge plusieurs fen=C3=AAtres avec l'instruction Fenetre.show, j'ouvre =
plusieurs autres fichiers....

Ce que j'ai remarqu=C3=A9, c'est qu'avec la version Excel 2007 =C3=A7a marc=
he tr=C3=A8s bien. Le temps d'ex=C3=A9cution est toujours le m=C3=AAme apr=
=C3=A8s plusieurs lancements.

Merci pour votre aide pr=C3=A9cieuse
Alf

8 réponses

Avatar
MichD
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
Avatar
Alf
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
Avatar
MichD
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
Avatar
MichD
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
Avatar
Alf
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
Avatar
MichD
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
Avatar
MichD
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
Avatar
Alf
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