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

[VBA] amélioration code

5 réponses
Avatar
coco74
Bonjour à tous,

Soit 3 macros :

Dim blk
Sub MasquerLignes()
Application.ScreenUpdating = False
F2.Unprotect
blk = 1
For rwIndex = 21 To 294
With F2.Cells(rwIndex, 1)
If .Value = 0 Then .EntireRow.Hidden = True
End With
Next rwIndex
blk = 0
F2.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
Application.ScreenUpdating = True
End Sub
-------------------------------
Sub AfficherLignes()
Application.ScreenUpdating = False
F2.Unprotect
Rows("21:294").EntireRow.Hidden = False
F2.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
Application.ScreenUpdating = True
End Sub
--------------------------------
Sub Aperçu()
ActiveWindow.SelectedSheets.PrintPreview
End Sub

Le but est de masquer les lignes dont la valeur de la première cellule de
chacune d'entres elles est égale à 0 !
Je ne suis pas programmeur, mais ca marche quand je veux afficher ou masquer
les lignes, avec une vitesse d'execution convenable.
Le problème est que si j'execute la macro "Apercu", il se passe je ne sais
quel phénomène qui fait que la macro "MasquerLignes" devient tout à coup très
lente !
Celà dépasse mes connaissances ; pourriez-vous m'éclairer ?

Merci d'avance de votre aide ! !

--
coco

5 réponses

Avatar
Rémi
Salut

Il y a autre chose que tu peux faire pour améliorer la vitesse
néanmoins je ne sais pas si ça va être efficace dans ton cas, c'est
désactiver le calcul automatique des cellules :

en début de fonction : Application.Calculation = xlCalculationManual
en fin de fonction : Application.Calculation = xlCalculationAutomatic

Si tu veux retrouver le meme parametre qu'avant l'exécution de la
fonction du peux aussi enregistrer sa valeur dans une variable et la
lui réatribuer à la fin...

En espérant que ça puisse aider
Rémi



On 26 juin, 17:16, coco74 wrote:
Bonjour à tous,

Soit 3 macros :

Dim blk
Sub MasquerLignes()
Application.ScreenUpdating = False
F2.Unprotect
blk = 1
For rwIndex = 21 To 294
With F2.Cells(rwIndex, 1)
If .Value = 0 Then .EntireRow.Hidden = True
End With
Next rwIndex
blk = 0
F2.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
Application.ScreenUpdating = True
End Sub
-------------------------------
Sub AfficherLignes()
Application.ScreenUpdating = False
F2.Unprotect
Rows("21:294").EntireRow.Hidden = False
F2.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
Application.ScreenUpdating = True
End Sub
--------------------------------
Sub Aperçu()
ActiveWindow.SelectedSheets.PrintPreview
End Sub

Le but est de masquer les lignes dont la valeur de la première cellule de
chacune d'entres elles est égale à 0 !
Je ne suis pas programmeur, mais ca marche quand je veux afficher ou masq uer
les lignes, avec une vitesse d'execution convenable.
Le problème est que si j'execute la macro "Apercu", il se passe je ne s ais
quel phénomène qui fait que la macro "MasquerLignes" devient tout à coup très
lente !
Celà dépasse mes connaissances ; pourriez-vous m'éclairer ?

Merci d'avance de votre aide ! !

--
coco


Avatar
Michel Pierron
Bonjour Coco74;

1- Explication:
Après un aperçu avant impression, Excel affiche les repères topographiques
des plages d'impression (pointillés) sur la feuille.
Lorsque tu réexécute la macro MasquerLignes après un aperçu avant
impression, à chaque ligne masquée par la boucle, Excel repositionne les
repères horizontaux des plages d'impression sur la feuille; c'est ce qui
fait que le temps d'exécution de la macro s'en trouve considérablement
augmenté.

2- Solution:
Tu dois masquer en une seule fois l'ensemble des lignes qui répondent au
critère indiqué dans la boucle; ainsi, tu n'auras qu'un seul
repositionnement en tout et pour tout et la durée d'exécution de ta macro
n'en sera pas affectée.

Sub MasquerLignes()
Application.ScreenUpdating = False
Dim Rng As Range, Cel As Range
F2.Activate
F2.Unprotect
For Each Cel In Range("A21:A294")
If Cel = 0 Then
If Rng Is Nothing Then
Set Rng = Cel
Else
Set Rng = Union(Rng, Cel)
End If
End If
Next Cel
Rng.EntireRow.Hidden = True
Set Rng = Nothing
F2.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
End Sub

Une remarquecomplémentaire, l'instruction ScreenUpdating est automatiquement
remise à True en sortie de procédure; il n'est pas nécessaire de l'indiquer
(tu gagnes un coup d'horloge).

Sub AfficherLignes()
Application.ScreenUpdating = False
F2.Unprotect
F2.Rows("21:294").Hidden = False
F2.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
End Sub

MP


"coco74" a écrit dans le message de news:

Bonjour à tous,

Soit 3 macros :

Dim blk
Sub MasquerLignes()
Application.ScreenUpdating = False
F2.Unprotect
blk = 1
For rwIndex = 21 To 294
With F2.Cells(rwIndex, 1)
If .Value = 0 Then .EntireRow.Hidden = True
End With
Next rwIndex
blk = 0
F2.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
Application.ScreenUpdating = True
End Sub
-------------------------------
Sub AfficherLignes()
Application.ScreenUpdating = False
F2.Unprotect
Rows("21:294").EntireRow.Hidden = False
F2.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
Application.ScreenUpdating = True
End Sub
--------------------------------
Sub Aperçu()
ActiveWindow.SelectedSheets.PrintPreview
End Sub

Le but est de masquer les lignes dont la valeur de la première cellule de
chacune d'entres elles est égale à 0 !
Je ne suis pas programmeur, mais ca marche quand je veux afficher ou
masquer
les lignes, avec une vitesse d'execution convenable.
Le problème est que si j'execute la macro "Apercu", il se passe je ne sais
quel phénomène qui fait que la macro "MasquerLignes" devient tout à coup
très
lente !
Celà dépasse mes connaissances ; pourriez-vous m'éclairer ?

Merci d'avance de votre aide ! !

--
coco


Avatar
coco74
Ouh là là ! !
Ca c'est du grand art ! Merci Michel !
J'ai bien compris l'explication, compris aussi le raisonnement de la
solution. J'ai un peu plus de mal avec le code mais en tout cas celà
fonctionne parfaitement.

Merci encore
--
coco



Bonjour Coco74;

1- Explication:
Après un aperçu avant impression, Excel affiche les repères topographiques
des plages d'impression (pointillés) sur la feuille.
Lorsque tu réexécute la macro MasquerLignes après un aperçu avant
impression, à chaque ligne masquée par la boucle, Excel repositionne les
repères horizontaux des plages d'impression sur la feuille; c'est ce qui
fait que le temps d'exécution de la macro s'en trouve considérablement
augmenté.

2- Solution:
Tu dois masquer en une seule fois l'ensemble des lignes qui répondent au
critère indiqué dans la boucle; ainsi, tu n'auras qu'un seul
repositionnement en tout et pour tout et la durée d'exécution de ta macro
n'en sera pas affectée.

Sub MasquerLignes()
Application.ScreenUpdating = False
Dim Rng As Range, Cel As Range
F2.Activate
F2.Unprotect
For Each Cel In Range("A21:A294")
If Cel = 0 Then
If Rng Is Nothing Then
Set Rng = Cel
Else
Set Rng = Union(Rng, Cel)
End If
End If
Next Cel
Rng.EntireRow.Hidden = True
Set Rng = Nothing
F2.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
End Sub

Une remarquecomplémentaire, l'instruction ScreenUpdating est automatiquement
remise à True en sortie de procédure; il n'est pas nécessaire de l'indiquer
(tu gagnes un coup d'horloge).

Sub AfficherLignes()
Application.ScreenUpdating = False
F2.Unprotect
F2.Rows("21:294").Hidden = False
F2.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
End Sub

MP


"coco74" a écrit dans le message de news:

Bonjour à tous,

Soit 3 macros :

Dim blk
Sub MasquerLignes()
Application.ScreenUpdating = False
F2.Unprotect
blk = 1
For rwIndex = 21 To 294
With F2.Cells(rwIndex, 1)
If .Value = 0 Then .EntireRow.Hidden = True
End With
Next rwIndex
blk = 0
F2.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
Application.ScreenUpdating = True
End Sub
-------------------------------
Sub AfficherLignes()
Application.ScreenUpdating = False
F2.Unprotect
Rows("21:294").EntireRow.Hidden = False
F2.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
Application.ScreenUpdating = True
End Sub
--------------------------------
Sub Aperçu()
ActiveWindow.SelectedSheets.PrintPreview
End Sub

Le but est de masquer les lignes dont la valeur de la première cellule de
chacune d'entres elles est égale à 0 !
Je ne suis pas programmeur, mais ca marche quand je veux afficher ou
masquer
les lignes, avec une vitesse d'execution convenable.
Le problème est que si j'execute la macro "Apercu", il se passe je ne sais
quel phénomène qui fait que la macro "MasquerLignes" devient tout à coup
très
lente !
Celà dépasse mes connaissances ; pourriez-vous m'éclairer ?

Merci d'avance de votre aide ! !

--
coco







Avatar
Michel Pierron
Bonjour Coco74;
Pour éviter une erreur si aucune ligne n'est concernée, il faudrait ajouter
une ligne d'instruction:
...
Next Cel
If Rng Is Nothing Then Exit Sub
Rng.EntireRow.Hidden = True
Set Rng = Nothing
....

MP

"coco74" a écrit dans le message de news:

Ouh là là ! !
Ca c'est du grand art ! Merci Michel !
J'ai bien compris l'explication, compris aussi le raisonnement de la
solution. J'ai un peu plus de mal avec le code mais en tout cas celà
fonctionne parfaitement.

Merci encore
--
coco



Bonjour Coco74;

1- Explication:
Après un aperçu avant impression, Excel affiche les repères
topographiques
des plages d'impression (pointillés) sur la feuille.
Lorsque tu réexécute la macro MasquerLignes après un aperçu avant
impression, à chaque ligne masquée par la boucle, Excel repositionne les
repères horizontaux des plages d'impression sur la feuille; c'est ce qui
fait que le temps d'exécution de la macro s'en trouve considérablement
augmenté.

2- Solution:
Tu dois masquer en une seule fois l'ensemble des lignes qui répondent au
critère indiqué dans la boucle; ainsi, tu n'auras qu'un seul
repositionnement en tout et pour tout et la durée d'exécution de ta macro
n'en sera pas affectée.

Sub MasquerLignes()
Application.ScreenUpdating = False
Dim Rng As Range, Cel As Range
F2.Activate
F2.Unprotect
For Each Cel In Range("A21:A294")
If Cel = 0 Then
If Rng Is Nothing Then
Set Rng = Cel
Else
Set Rng = Union(Rng, Cel)
End If
End If
Next Cel
Rng.EntireRow.Hidden = True
Set Rng = Nothing
F2.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
End Sub

Une remarquecomplémentaire, l'instruction ScreenUpdating est
automatiquement
remise à True en sortie de procédure; il n'est pas nécessaire de
l'indiquer
(tu gagnes un coup d'horloge).

Sub AfficherLignes()
Application.ScreenUpdating = False
F2.Unprotect
F2.Rows("21:294").Hidden = False
F2.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
End Sub

MP


"coco74" a écrit dans le message de
news:

Bonjour à tous,

Soit 3 macros :

Dim blk
Sub MasquerLignes()
Application.ScreenUpdating = False
F2.Unprotect
blk = 1
For rwIndex = 21 To 294
With F2.Cells(rwIndex, 1)
If .Value = 0 Then .EntireRow.Hidden = True
End With
Next rwIndex
blk = 0
F2.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
Application.ScreenUpdating = True
End Sub
-------------------------------
Sub AfficherLignes()
Application.ScreenUpdating = False
F2.Unprotect
Rows("21:294").EntireRow.Hidden = False
F2.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
Application.ScreenUpdating = True
End Sub
--------------------------------
Sub Aperçu()
ActiveWindow.SelectedSheets.PrintPreview
End Sub

Le but est de masquer les lignes dont la valeur de la première cellule
de
chacune d'entres elles est égale à 0 !
Je ne suis pas programmeur, mais ca marche quand je veux afficher ou
masquer
les lignes, avec une vitesse d'execution convenable.
Le problème est que si j'execute la macro "Apercu", il se passe je ne
sais
quel phénomène qui fait que la macro "MasquerLignes" devient tout à
coup
très
lente !
Celà dépasse mes connaissances ; pourriez-vous m'éclairer ?

Merci d'avance de votre aide ! !

--
coco









Avatar
coco74
OK je vois !

Merci
--
coco



Bonjour Coco74;
Pour éviter une erreur si aucune ligne n'est concernée, il faudrait ajouter
une ligne d'instruction:
....
Next Cel
If Rng Is Nothing Then Exit Sub
Rng.EntireRow.Hidden = True
Set Rng = Nothing
.....

MP

"coco74" a écrit dans le message de news:

Ouh là là ! !
Ca c'est du grand art ! Merci Michel !
J'ai bien compris l'explication, compris aussi le raisonnement de la
solution. J'ai un peu plus de mal avec le code mais en tout cas celà
fonctionne parfaitement.

Merci encore
--
coco



Bonjour Coco74;

1- Explication:
Après un aperçu avant impression, Excel affiche les repères
topographiques
des plages d'impression (pointillés) sur la feuille.
Lorsque tu réexécute la macro MasquerLignes après un aperçu avant
impression, à chaque ligne masquée par la boucle, Excel repositionne les
repères horizontaux des plages d'impression sur la feuille; c'est ce qui
fait que le temps d'exécution de la macro s'en trouve considérablement
augmenté.

2- Solution:
Tu dois masquer en une seule fois l'ensemble des lignes qui répondent au
critère indiqué dans la boucle; ainsi, tu n'auras qu'un seul
repositionnement en tout et pour tout et la durée d'exécution de ta macro
n'en sera pas affectée.

Sub MasquerLignes()
Application.ScreenUpdating = False
Dim Rng As Range, Cel As Range
F2.Activate
F2.Unprotect
For Each Cel In Range("A21:A294")
If Cel = 0 Then
If Rng Is Nothing Then
Set Rng = Cel
Else
Set Rng = Union(Rng, Cel)
End If
End If
Next Cel
Rng.EntireRow.Hidden = True
Set Rng = Nothing
F2.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
End Sub

Une remarquecomplémentaire, l'instruction ScreenUpdating est
automatiquement
remise à True en sortie de procédure; il n'est pas nécessaire de
l'indiquer
(tu gagnes un coup d'horloge).

Sub AfficherLignes()
Application.ScreenUpdating = False
F2.Unprotect
F2.Rows("21:294").Hidden = False
F2.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
End Sub

MP


"coco74" a écrit dans le message de
news:

Bonjour à tous,

Soit 3 macros :

Dim blk
Sub MasquerLignes()
Application.ScreenUpdating = False
F2.Unprotect
blk = 1
For rwIndex = 21 To 294
With F2.Cells(rwIndex, 1)
If .Value = 0 Then .EntireRow.Hidden = True
End With
Next rwIndex
blk = 0
F2.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
Application.ScreenUpdating = True
End Sub
-------------------------------
Sub AfficherLignes()
Application.ScreenUpdating = False
F2.Unprotect
Rows("21:294").EntireRow.Hidden = False
F2.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
Application.ScreenUpdating = True
End Sub
--------------------------------
Sub Aperçu()
ActiveWindow.SelectedSheets.PrintPreview
End Sub

Le but est de masquer les lignes dont la valeur de la première cellule
de
chacune d'entres elles est égale à 0 !
Je ne suis pas programmeur, mais ca marche quand je veux afficher ou
masquer
les lignes, avec une vitesse d'execution convenable.
Le problème est que si j'execute la macro "Apercu", il se passe je ne
sais
quel phénomène qui fait que la macro "MasquerLignes" devient tout à
coup
très
lente !
Celà dépasse mes connaissances ; pourriez-vous m'éclairer ?

Merci d'avance de votre aide ! !

--
coco