OVH Cloud OVH Cloud

amélioration de macro - lenteur...

4 réponses
Avatar
Eric
bonjour à tous

dans mon fichier excel, j'ai mis en place une macro qui fonctionne bien,
mais qui est malheureusement très lent.

n'étant pas un spécialiste en langage vb, tout ce que j'ai essayé pour
épurer le code ne fonctionne pas..... ;(

si quelqu'un peut me donner des infos sur la possibilité d'améliorer ce
code, d'avance merci.

d'abord petit explicatif du fichier

dans une feuille nommée "saisie", l'on remplit différentes zones sur une
colonne de cette feuille, la macro est activée par un bouton.

le but de cette macro est d'imprimer une page de ce qui a été saisi,
puis de copier la colonne saisie et de la coller en ligne dans une autre
feuille "journal" (cette feuille est protégée et cachée),
puis la macro vide les zones saisies dans la feuille nommée "saisie" et
prépare ainsi cette feuille pour une nouvelle saisie....
elle fait en plus qlqes autres bidules telles que copies de diverses autres
cellules
voilà

maintenant le code de la macro

Sheets("print").Select
Range("A13:C64").Select
Selection.ClearContents
Sheets("saisie").Select
Range("A6:A56,C6:D56").Select
Range("C6").Activate
Selection.Copy
Sheets("print").Select
Range("A13").Select
Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:=
_
xlNone, SkipBlanks:=False, Transpose:=False
ActiveSheet.ListObjects.Add(xlSrcRange, Range("$A$13:$C$63"), ,
xlYes).Name = _
"Liste1"
Range("A13:C64").Select
Selection.AutoFilter Field:=1, Criteria1:="<>"
Rows("8:12").Select
Selection.EntireRow.Hidden = False
ActiveWindow.SelectedSheets.PrintOut Copies:=2
Rows("8:12").Select
Selection.EntireRow.Hidden = True
Sheets("journal").Visible = True
Sheets("journal").Select
ActiveSheet.Unprotect
Rows("5:5").Select
Selection.Insert Shift:=xlDown
Sheets("saisie").Select
Range("c2").Select
Selection.Copy
Sheets("journal").Select
Range("c5").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone,
SkipBlanks _
:=False, Transpose:=False
Selection.NumberFormat = "dd.mm.yyyy;@"
Sheets("saisie").Select
Range("c1:d1").Select
Selection.Copy
Sheets("journal").Select
Range("a5").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone,
SkipBlanks _
:=False, Transpose:=False
Sheets("saisie").Select
Range("F9").Select
Selection.Copy
Sheets("journal").Select
Range("d5").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone,
SkipBlanks _
:=False, Transpose:=False
Sheets("saisie").Select
Range("C2:C51").Select
Selection.Copy
Sheets("journal").Select
Range("e5").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone,
SkipBlanks _
:=False, Transpose:=True
Range("a5").Select
Selection.Copy
Range("c2").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone,
SkipBlanks _
:=False, Transpose:=True
ActiveSheet.Protect DrawingObjects:=True, Contents:=True,
Scenarios:=True
ActiveWindow.SelectedSheets.Visible = False
Sheets("saisie").Select
Range("A5,C5,A7:A56").Select
Selection.ClearContents
Range("A5").Select


l'éxecution de cette macro prend pas mal de temps, mon but maintenant est
d'essayer de l'alléger pour la rendre plus rapide, d'avance merci si
quelqu'un peu m'aider.

Meilleures salutations

Eric

4 réponses

Avatar
Pierre Fauconnier
Bonjour

Sans détailler ton code, je peux te donner les conseils suivants :

En début de macro, ajoute la ligne
application.screenupdating = false

et en fin de macro
application.screenupdating = true

Ces lignes feront en sorte qu'Excel travaille sans raffraichissement
d'écran, ce qui accélerera déjà grandement l'exécution...

Ensuite, tu n'es pas obligé de sélectionner les cellules pour travailler
avec.

Ainsi,
Range("a1").select
selection = "Bonjour"
Peut s'écrire
Range("A1") = "Bonjour"

Là aussi, tu gagneras du temps car Excel ne devra pas constamment
sélectionner ou activer de nouveaux objets.

Ainsi, tu peux réaliser l'opération suivante
Feuil1.Range("a1").Copy Destination:þuil2.Range("b4")
plus rapidement qu'en sélectionnant la source pour la copier, puis
sélectionner la cible, ...

Lorsque tu as plusieurs manipulations à effectuer avec la même plage, crée
et utilise un objet Plage
Dim Plage as range
set Plage = feuil1.range("A1:B6")
plage.copy destination:= feuil2.range("B19")
Plage.interior.color = vbred
Plage.clearcontents...

ETc...

Ok?


--
Pierre Fauconnier ()
"Le bonheur n'est pas au bout du chemin. Le bonheur EST le chemin ( proverbe
zen )
Remplacez nospam.nospam par pfi.be pour répondre. Merci

"Eric" a écrit dans le message de news:
%
bonjour à tous

dans mon fichier excel, j'ai mis en place une macro qui fonctionne bien,
mais qui est malheureusement très lent.

n'étant pas un spécialiste en langage vb, tout ce que j'ai essayé pour
épurer le code ne fonctionne pas..... ;(

si quelqu'un peut me donner des infos sur la possibilité d'améliorer ce
code, d'avance merci.

d'abord petit explicatif du fichier

dans une feuille nommée "saisie", l'on remplit différentes zones sur une
colonne de cette feuille, la macro est activée par un bouton.

le but de cette macro est d'imprimer une page de ce qui a été saisi,
puis de copier la colonne saisie et de la coller en ligne dans une autre
feuille "journal" (cette feuille est protégée et cachée),
puis la macro vide les zones saisies dans la feuille nommée "saisie" et
prépare ainsi cette feuille pour une nouvelle saisie....
elle fait en plus qlqes autres bidules telles que copies de diverses
autres
cellules
voilà

maintenant le code de la macro

Sheets("print").Select
Range("A13:C64").Select
Selection.ClearContents
Sheets("saisie").Select
Range("A6:A56,C6:D56").Select
Range("C6").Activate
Selection.Copy
Sheets("print").Select
Range("A13").Select
Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats,
Operation: > _
xlNone, SkipBlanks:úlse, Transpose:úlse
ActiveSheet.ListObjects.Add(xlSrcRange, Range("$A$13:$C$63"), ,
xlYes).Name = _
"Liste1"
Range("A13:C64").Select
Selection.AutoFilter Field:=1, Criteria1:="<>"
Rows("8:12").Select
Selection.EntireRow.Hidden = False
ActiveWindow.SelectedSheets.PrintOut Copies:=2
Rows("8:12").Select
Selection.EntireRow.Hidden = True
Sheets("journal").Visible = True
Sheets("journal").Select
ActiveSheet.Unprotect
Rows("5:5").Select
Selection.Insert Shift:=xlDown
Sheets("saisie").Select
Range("c2").Select
Selection.Copy
Sheets("journal").Select
Range("c5").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone,
SkipBlanks _
:úlse, Transpose:úlse
Selection.NumberFormat = "dd.mm.yyyy;@"
Sheets("saisie").Select
Range("c1:d1").Select
Selection.Copy
Sheets("journal").Select
Range("a5").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone,
SkipBlanks _
:úlse, Transpose:úlse
Sheets("saisie").Select
Range("F9").Select
Selection.Copy
Sheets("journal").Select
Range("d5").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone,
SkipBlanks _
:úlse, Transpose:úlse
Sheets("saisie").Select
Range("C2:C51").Select
Selection.Copy
Sheets("journal").Select
Range("e5").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone,
SkipBlanks _
:úlse, Transpose:=True
Range("a5").Select
Selection.Copy
Range("c2").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone,
SkipBlanks _
:úlse, Transpose:=True
ActiveSheet.Protect DrawingObjects:=True, Contents:=True,
Scenarios:=True
ActiveWindow.SelectedSheets.Visible = False
Sheets("saisie").Select
Range("A5,C5,A7:A56").Select
Selection.ClearContents
Range("A5").Select


l'éxecution de cette macro prend pas mal de temps, mon but maintenant est
d'essayer de l'alléger pour la rendre plus rapide, d'avance merci si
quelqu'un peu m'aider.

Meilleures salutations

Eric




Avatar
HD
Un petit article intéressant pour optimiser tout ça :

Accélération du code VBA
http://xcell05.free.fr/pages/prog/accvba.htm
--
@+
HD
Avatar
Eric
merci des conseils

je vais essayés tout ça

merci beaucoup

Eric

"Pierre Fauconnier" a écrit dans le
message de news:
Bonjour

Sans détailler ton code, je peux te donner les conseils suivants :

En début de macro, ajoute la ligne
application.screenupdating = false

et en fin de macro
application.screenupdating = true

Ces lignes feront en sorte qu'Excel travaille sans raffraichissement
d'écran, ce qui accélerera déjà grandement l'exécution...

Ensuite, tu n'es pas obligé de sélectionner les cellules pour travailler
avec.

Ainsi,
Range("a1").select
selection = "Bonjour"
Peut s'écrire
Range("A1") = "Bonjour"

Là aussi, tu gagneras du temps car Excel ne devra pas constamment
sélectionner ou activer de nouveaux objets.

Ainsi, tu peux réaliser l'opération suivante
Feuil1.Range("a1").Copy Destination:þuil2.Range("b4")
plus rapidement qu'en sélectionnant la source pour la copier, puis
sélectionner la cible, ...

Lorsque tu as plusieurs manipulations à effectuer avec la même plage, crée
et utilise un objet Plage
Dim Plage as range
set Plage = feuil1.range("A1:B6")
plage.copy destination:= feuil2.range("B19")
Plage.interior.color = vbred
Plage.clearcontents...

ETc...

Ok?


--
Pierre Fauconnier ()
"Le bonheur n'est pas au bout du chemin. Le bonheur EST le chemin (
proverbe

zen )
Remplacez nospam.nospam par pfi.be pour répondre. Merci

"Eric" a écrit dans le message de news:
%
bonjour à tous

dans mon fichier excel, j'ai mis en place une macro qui fonctionne bien,
mais qui est malheureusement très lent.

n'étant pas un spécialiste en langage vb, tout ce que j'ai essayé pour
épurer le code ne fonctionne pas..... ;(

si quelqu'un peut me donner des infos sur la possibilité d'améliorer ce
code, d'avance merci.

d'abord petit explicatif du fichier

dans une feuille nommée "saisie", l'on remplit différentes zones sur une
colonne de cette feuille, la macro est activée par un bouton.

le but de cette macro est d'imprimer une page de ce qui a été saisi,
puis de copier la colonne saisie et de la coller en ligne dans une autre
feuille "journal" (cette feuille est protégée et cachée),
puis la macro vide les zones saisies dans la feuille nommée "saisie" et
prépare ainsi cette feuille pour une nouvelle saisie....
elle fait en plus qlqes autres bidules telles que copies de diverses
autres
cellules
voilà

maintenant le code de la macro

Sheets("print").Select
Range("A13:C64").Select
Selection.ClearContents
Sheets("saisie").Select
Range("A6:A56,C6:D56").Select
Range("C6").Activate
Selection.Copy
Sheets("print").Select
Range("A13").Select
Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats,
Operation: > > _
xlNone, SkipBlanks:úlse, Transpose:úlse
ActiveSheet.ListObjects.Add(xlSrcRange, Range("$A$13:$C$63"), ,
xlYes).Name = _
"Liste1"
Range("A13:C64").Select
Selection.AutoFilter Field:=1, Criteria1:="<>"
Rows("8:12").Select
Selection.EntireRow.Hidden = False
ActiveWindow.SelectedSheets.PrintOut Copies:=2
Rows("8:12").Select
Selection.EntireRow.Hidden = True
Sheets("journal").Visible = True
Sheets("journal").Select
ActiveSheet.Unprotect
Rows("5:5").Select
Selection.Insert Shift:=xlDown
Sheets("saisie").Select
Range("c2").Select
Selection.Copy
Sheets("journal").Select
Range("c5").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone,
SkipBlanks _
:úlse, Transpose:úlse
Selection.NumberFormat = "dd.mm.yyyy;@"
Sheets("saisie").Select
Range("c1:d1").Select
Selection.Copy
Sheets("journal").Select
Range("a5").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone,
SkipBlanks _
:úlse, Transpose:úlse
Sheets("saisie").Select
Range("F9").Select
Selection.Copy
Sheets("journal").Select
Range("d5").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone,
SkipBlanks _
:úlse, Transpose:úlse
Sheets("saisie").Select
Range("C2:C51").Select
Selection.Copy
Sheets("journal").Select
Range("e5").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone,
SkipBlanks _
:úlse, Transpose:=True
Range("a5").Select
Selection.Copy
Range("c2").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone,
SkipBlanks _
:úlse, Transpose:=True
ActiveSheet.Protect DrawingObjects:=True, Contents:=True,
Scenarios:=True
ActiveWindow.SelectedSheets.Visible = False
Sheets("saisie").Select
Range("A5,C5,A7:A56").Select
Selection.ClearContents
Range("A5").Select


l'éxecution de cette macro prend pas mal de temps, mon but maintenant
est


d'essayer de l'alléger pour la rendre plus rapide, d'avance merci si
quelqu'un peu m'aider.

Meilleures salutations

Eric








Avatar
gh
c'est une mine d'or cette réponse

je prends note moi aussi

merci


"Pierre Fauconnier" a écrit dans le
message de news:
Bonjour

Sans détailler ton code, je peux te donner les conseils suivants :

En début de macro, ajoute la ligne
application.screenupdating = false

et en fin de macro
application.screenupdating = true

Ces lignes feront en sorte qu'Excel travaille sans raffraichissement
d'écran, ce qui accélerera déjà grandement l'exécution...

Ensuite, tu n'es pas obligé de sélectionner les cellules pour travailler
avec.

Ainsi,
Range("a1").select
selection = "Bonjour"
Peut s'écrire
Range("A1") = "Bonjour"

Là aussi, tu gagneras du temps car Excel ne devra pas constamment
sélectionner ou activer de nouveaux objets.

Ainsi, tu peux réaliser l'opération suivante
Feuil1.Range("a1").Copy Destination:þuil2.Range("b4")
plus rapidement qu'en sélectionnant la source pour la copier, puis
sélectionner la cible, ...

Lorsque tu as plusieurs manipulations à effectuer avec la même plage, crée
et utilise un objet Plage
Dim Plage as range
set Plage = feuil1.range("A1:B6")
plage.copy destination:= feuil2.range("B19")
Plage.interior.color = vbred
Plage.clearcontents...

ETc...

Ok?


--
Pierre Fauconnier ()
"Le bonheur n'est pas au bout du chemin. Le bonheur EST le chemin (
proverbe

zen )
Remplacez nospam.nospam par pfi.be pour répondre. Merci