Macro très longue à s'éxécuter

Bonjour à tous,

J'ai créé une macro, fonctionnant très bien au niveau des résultats à produire, mais le soucis, c'est le temps d'exécution de la macro.

Lorsque je la lance, celle-ci mets plus d'une minute à s'exécuter, avec un "Excel ne répond pas" entre temps.

Je ne pense pas que ce soit un problème de taille de fichier ou de pc, mon projet comporte un tas d'autres macros beaucoup plus longues qui ne posent aucun problème.

Voici le code :

Sub Copier()

Dim i As Integer

Application.ScreenUpdating = False

For i = 1 To Range("B10")

Range("A16:I37").Copy Range("A" & Rows.Count).End(xlUp).Offset(1, 0)

Next i

For i = 1 To ActiveSheet.Range("B9")

ActiveSheet.Rows(i * 12 + 5).Resize(11).Hidden = True

Next i

End Sub

Peut-être parce que je travaille avec la même variable deux fois ?

Merci à vous si vous y voyez une solution !

Bonjour,

Il y a des choses qu'on ne sait pas dans ta macro (par exemple on ne sait pas deviner ce qu'il y a dans la Range("B10")). Pour être efficace, il faut ton fichier qui va avec et quelques lignes d'explication de ce que tu veux obtenir comme résultat. On pourra simplifier la macro.

Bonjour Raja,

Ci-joint un fichier avec ma macro et les explications sur le résultat :

46macroflo456.xlsm (32.55 Ko)

Merci à vous !

Bonjour,

chez moi pas de problème de lenteur sur ton fichier.

Sinon tu peux remplacer ta 1ère boucle par :

Range("A16:I37").Copy Range("A" & Rows.Count).End(xlUp).Offset(1, 0).Resize(Range("B10") * 22, 9)

Ca ne fait qu'un seul collé.

eric

Bonjour,

A tout hasard, tu n'aurais pas une procédure évènementielle Worksheet.Change parmi tes nombreuses macros ?

A+

Bonjour Eric,

Bonjour Frangy,

Tout d'abord merci à toi Eric, je vais raccourcir ma boucle oui merci !

Puis Frangy je crois que tu as trouvé d'où vient mon problème, j'ai bien une procédure du type dans la feuille, je vais voir pour l'intégrer à ma macro, je vous tiens au courant, merci !

Re, Salut à tous,

Tu devrais remettre la ligne suivante avant la fin de la macro :

Application.ScreenUpdating = True

J'ai testé et le délai de la fin de macro est de 2 secondes

J'ai toujours le même soucis...

Le problème peut-il venir du fait que j'ai toutes mes macros dans les feuilles et non en modules ?

J'ai essayé avec le code sur un autre fichier, un nouveau, cela fonctionne parfaitement, je ne vois pas où est le problème...

Peut-être des validation de données dans chaque cellule avec des listes ?

Re,

Le problème peut-il venir du fait que j'ai toutes mes macros dans les feuilles et non en modules ?

Non, ça ne change rien..

Mais comme tu as dit avoir un Worksheet.Change, as-tu ajouté :

Application.EnableEvents = False

au début de ta macro ?

Remettre à true en fin de macro.

Et constates-tu les mêmes lenteurs sur le fichier exemple que tu as livré ?

eric

En fait j'avais une macro contenant Worksheet.Change, je l'ai supprimé provisoirement car elle n'est pas indispensable, afin de voir le résultat.

Et non sur le fichier d'exemple tout fonctionne parfaitement..

Je vais encore essayer mais c'est toujours la même chose sur mon fichier complet... Le pire c'est qu'avec toutes les autres macros, aucun soucis

Re,

Sans le fichier c'est un peu à taton qu'il faut chercher...

Ajoute au début :

mlCalcStatus = Application.Calculation

Application.Calculation = xlCalculationManual

et en fin :

Application.Calculation = mlCalcStatus

Si tu as des MFC un peu complexes (matricielles) elles peuvent ralentir aussi, il faudra les désactiver.

Tu n'es pas sur réseau ?

ni de liaisons vers des classeurs fermés ?

eric

Oui je sais bien, mais il est trop lourd pour envoyer le tout :/

En tout cas je te remercie, car je viens d'entrer tes codes ci-dessus et ça fonctionne nickel !

J'avais déjà réduit le temps d'exécution en effaçant toutes les cellules "copiées-collées" appelant les données de cette feuille.

Le temps est alors passé à une vingtaine de secondes, et là, en ajoutant tes codes, la macro s'exécute directement !

Vraiment merci beaucoup Eric, tu m'as sauvé.. Enfin ce fichier est ok !

Merci beaucoup, et bonne soirée !

Bonjour,

Ok, mais il faut que tu rajoutes un Calculate à la fin aussi.

eric

Bonjour Eric,

Tu parles du "Application.Calculation = mlCalcStatus" en fin de macro ?

Bonjour,

Non, de Calculate tout court, pour forcer le recalcul du classeur comme tu l'as bloqué en début de macro.

eric

Ah oui d'accord, je le mets avant mon End Sub ?

Oui.

Application.Calculation = xlCalculationManual empêche les calculs le temps que tu fasses toutes les opérations.

Calculate recalcule ton classeur et le met à jour si besoin.

eric

Très bien merci pour cette information

Par contre j'ai mis Calculate, mais une fois ma macro terminée, le classeur ne se mets pas à jour, il se mets seulement à jour lorsque je le ferme et l'ouvre à nouveau, est-ce normal ?

Je pensais que ça suffirait, bizarre... Essaie avec :

Application.Calculate

eric

Les calculs ne se font toujours pas..

J'ai enlevé le Application.Calculation = xlCalculationManual au départ, relancer le fichier et toujours rien, les cellules ne s'actualisent pas..

Y a-t-il quelque chose à faire ?


En fait les cellules s'actualisent seulement lors de l'enregistrement :/

Rechercher des sujets similaires à "macro tres longue executer"