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
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
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
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
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
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
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
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
déclaration des API
on devrait lire
#If
#else
#end if
Mich
Le 27/06/19 à 06:29, MichD a écrit :
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