Plus je fais fonctionner la macro et plus je m'aperçois d'un ralentissement sur

Bapsie Messages postés 3 Date d'inscription vendredi 19 septembre 2008 Statut Membre Dernière intervention 1 février 2013 - 28 janv. 2013 à 14:52
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 - 1 févr. 2013 à 10:20
bonjour,

je n'arrive pas à m'en sortir, la macro est très lente et au fur et à mesure que je la lance, excel se ralenti
Il s'agit simplement à l'aide du bouton IMPRIMER PRODUCTION de faire une mise en page sur la vue numéro 1
de la feuille 4
Cette macro met plus de 2 minutes à s'effectuer puis lorsque je la lance plusieurs fois, toutes les fonctionnalités d'excel se retrouve ralenties
je vous remercie par avance sur d'eventuels suggestions de correction


Private Sub IMPPRODUC_Click()
Application.ScreenUpdating = False
ActiveSheet.Unprotect ("Menu vierge")
ActiveSheet.DisplayPageBreaks = False
Application.DisplayAlerts = False
Application.Calculation = xlCalculationManual
ActiveSheet.Outline.ShowLevels RowLevels:=1, ColumnLevels:=1


With Feuil4.PageSetup
'Définit la zone d'impression pour une plage de cellules.
.PrintArea = "$A2:BB223"

'Mise en page: définit les marges
.LeftMargin = Application.InchesToPoints(0.15)
.RightMargin = Application.InchesToPoints(0.15)
.TopMargin = Application.InchesToPoints(0.47)
.BottomMargin = Application.InchesToPoints(0.43)
.HeaderMargin = Application.InchesToPoints(0.23)
.FooterMargin = Application.InchesToPoints(0.51)
.Orientation = xlPortrait
End With

Application.ScreenUpdating = True
ActiveSheet.Protect ("Menu vierge")
ActiveSheet.DisplayPageBreaks = True
Application.DisplayAlerts = True
Application.Calculation = xlCalculationAutomatic
ActiveSheet.DisplayPageBreaks = True
Application.DisplayAlerts = True
Range("A3:A4").Select



End Sub

7 réponses

4u4me4us Messages postés 780 Date d'inscription lundi 22 janvier 2007 Statut Membre Dernière intervention 30 octobre 2013 3
30 janv. 2013 à 15:43
J'ai pas la solution sorry, mais si g t toi

1)j'ouvrerais ma macro

2)Je cliquerais sur la première instruction du ma fonction (Application.ScreenUpdating = False)

3) je presserais la touche F8 de mon clavier

Ainsi la macro s’exécute en pas à pas. Elle attends que tu presse F8 pour passer à l'instruction suivante.

Le but. Tu pourras observer les lignes où ta macro passe beaucoup de temps et ainsi les réécrire autrement (ci-possible).

Je reconnais que ce n'est pas la solution mais c peut-être un moins d'y arriver.
0
Bapsie Messages postés 3 Date d'inscription vendredi 19 septembre 2008 Statut Membre Dernière intervention 1 février 2013
31 janv. 2013 à 08:25
Merci pour votre réponse, j'ai déjà essayé le pas à pas f8 mais la macro ralentie sur chaque commande, je ne trouve pas de solutions
En tout les cas merci d'avoir pris du temps pour mon pb
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
31 janv. 2013 à 08:42
Bonjour,
Ta macro modifie énormément de mises en forme. Ces modifications restent en mémoire de Excel en vue de l'utilisation éventuelle de Undo. Ce qui fait que, dès le deuxième "coup", Excel garde en mémoire deux fois toutes ces mises en forme (déjà fastidieuses pour lui, chacune d'entre elles).
Tu gagnerais probablement en ré-enregistrant ton classeur juste après chaque modification de l'espèce (Excel "oublierait" ainsi la mise en forme précédente).


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
31 janv. 2013 à 08:48
Et pourquoi inhiber Application.DisplayAlerts ?
Parce que Excel t'a probablement fait savoir que tu lançais une opération fastidieuse ?
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
31 janv. 2013 à 09:03
Lorsque tu m'auras répondu, je te ferai probablement une suggestion salutaire (qui devrait non seulement éviter le ralentissement croissant, mais en plus t'éviter les deux premières minutes de travail)


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0
Bapsie Messages postés 3 Date d'inscription vendredi 19 septembre 2008 Statut Membre Dernière intervention 1 février 2013
1 févr. 2013 à 09:54
Bonjour

j'ai une petite amélioration effectivement en suivant ta suggestion de pré enregistrement, c'est à dire que lorsque je lance la macro j'ai un temps d'exécution d'une minute au lieu de deux.
Mais le ralentissement continue au fur et à mesure que je lance la macro et là je ne comprends toujours pas pourquoi ?
Si tu as une autre solution, c'est avec grand plaisir que je la suivrai, car je ne m'en sors pas
un grand merci par avance
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
1 févr. 2013 à 10:20
Il doit y avoir une autre raison encore quelque part dans ton code, qui provoque un tel ralentissement de plus en plus important. Les hypothèses sont alors nombreuses. Parmi les plus plausibles : la création d'objets ou d'instances sans libérer la mémoire une fois utilisés.

Quoi qu'il en soit et indépendamment de cette seconde raison (à traiter en plus de la première) :
tu éreintes Excel à le charger ainsi de lourdes mises en forme, surtout ainsi répétées sans cesse.
Tu gagnerais probablement à procéder avec deux classeurs :
classeur 1 : tes données et leur mise en forme figée (sans donc jamais modifier autre chose que tes données)
classeur 2 (espèce de miroir) : tes mises en formes telles que souhaitées pour l'impression, sans aucune donnée au départ. Ces mises en forme ne devront jamais être modifiées

Méthode de travail : après n'avoir modifié que tes données dans le classeur 1, tu les "projettes" sur la classeur 2, puis fais sur ce second classeur tes travaux d'impression. De cette manière : pas de travail de mise:remise en forme nécessaire entre chaque impression.
Pour passer uniquement tes données dune feuille d'un classeur à une feuille d'un autre classeur, le mieux (plus rapide) est de passer par le truchement d'un tableau dynamique (toto, dans l'exemple ci-après) :

Exemple :

Dim toto
toto = ThisWorkbook.Worksheets("Feuil1").Range("A1:F10").Value
With Workbooks("....") ' ici le nom de l'autre classeur
  .Worksheets("Feuil1").Cells.ClearContents
  .Worksheets("Feuil1").Range("A1:F10") = toto
End With

A faire pour chaque feuille à traiter.

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0
Rejoignez-nous