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

(vba) masquage de lignes trop lent ...

10 réponses
Avatar
j-pascal
Bonsoir à tous,

Sur la Feuil1, j'ai un tableau de 500 lignes x 10 colonnes.

Dans la colonne B de la Feuil1, j'ai des noms classés en ordre alphabétique.
Dans la colonne A de la Feuil1, j'ai ">>" si le nom (de la colonne B) a été
saisi dans la Feuil2.
Seuls les noms précédés de ">>" s'affichent (via une MEFC).

Résultat : les données visibles alternent avec des lignes dont le contenu
est masqué par la MEFC.

Je ne sais pas quelle est la meilleure solution pour que seules les lignes
comportant des données visibles apparaissent dans un tableau sans "vides".

J'ai essayé ceci :

'-------------
Sub MasquageLignes()
Dim i As Long

Application.ScreenUpdating = False

For i = 1 To 500
ActiveSheet.Rows(i).Hidden = InStr(Cells(i, 1), ">>") > 0
Next

End Sub
'-------------

Ca fonctionne, mais c'est incroyablement long !!

Pensez-vous qu'il y a un pb dans ce bout de code (appliqué à ce contexte) ?
Serait-il préférable de passer par une macro "Filtre" ? Si oui, comment ?

Merci d'avance pour vos lumières,

Cordialement,

JP

10 réponses

Avatar
j-pascal
Re,

J'ai oublié de préciser qu'en réalité mon tableau comporte plusieurs
dizaines de colonnes, contenant elles-mêmes de nombreuses formules de
recherche (RECHERCHEV).

Je me demande si la macro en question (masquer les lignes) n'est pas
ralentie par un calcul intempestif ??
Peut-être faudrait-il désactiver le calcul automatique ? Je ne l'ai jamais
fait, et je ne suis pas sûr que le pb vienne de là. Néanmoins, ça rame !

@+

JP

"j-pascal" a écrit dans le message de news:

Bonsoir à tous,

Sur la Feuil1, j'ai un tableau de 500 lignes x 10 colonnes.

Dans la colonne B de la Feuil1, j'ai des noms classés en ordre
alphabétique.
Dans la colonne A de la Feuil1, j'ai ">>" si le nom (de la colonne B) a
été saisi dans la Feuil2.
Seuls les noms précédés de ">>" s'affichent (via une MEFC).

Résultat : les données visibles alternent avec des lignes dont le contenu
est masqué par la MEFC.

Je ne sais pas quelle est la meilleure solution pour que seules les lignes
comportant des données visibles apparaissent dans un tableau sans "vides".

J'ai essayé ceci :

'-------------
Sub MasquageLignes()
Dim i As Long

Application.ScreenUpdating = False

For i = 1 To 500
ActiveSheet.Rows(i).Hidden = InStr(Cells(i, 1), ">>") > 0
Next

End Sub
'-------------

Ca fonctionne, mais c'est incroyablement long !!

Pensez-vous qu'il y a un pb dans ce bout de code (appliqué à ce contexte)
?
Serait-il préférable de passer par une macro "Filtre" ? Si oui, comment ?

Merci d'avance pour vos lumières,

Cordialement,

JP


Avatar
isabelle
bonjour Jp,

t'as raison, c'est une piste à essayer,

Application.Calculation = xlManual
'ta macro
Application.Calculation = xlAutomatic


isabelle

Re,

J'ai oublié de préciser qu'en réalité mon tableau comporte plusieurs
dizaines de colonnes, contenant elles-mêmes de nombreuses formules de
recherche (RECHERCHEV).

Je me demande si la macro en question (masquer les lignes) n'est pas
ralentie par un calcul intempestif ??
Peut-être faudrait-il désactiver le calcul automatique ? Je ne l'ai
jamais fait, et je ne suis pas sûr que le pb vienne de là. Néanmoins, ça
rame !

@+

JP

"j-pascal" a écrit dans le message de news:

Bonsoir à tous,

Sur la Feuil1, j'ai un tableau de 500 lignes x 10 colonnes.

Dans la colonne B de la Feuil1, j'ai des noms classés en ordre
alphabétique.
Dans la colonne A de la Feuil1, j'ai ">>" si le nom (de la colonne B)
a été saisi dans la Feuil2.
Seuls les noms précédés de ">>" s'affichent (via une MEFC).

Résultat : les données visibles alternent avec des lignes dont le
contenu est masqué par la MEFC.

Je ne sais pas quelle est la meilleure solution pour que seules les
lignes comportant des données visibles apparaissent dans un tableau
sans "vides".

J'ai essayé ceci :

'-------------
Sub MasquageLignes()
Dim i As Long

Application.ScreenUpdating = False

For i = 1 To 500
ActiveSheet.Rows(i).Hidden = InStr(Cells(i, 1), ">>") > 0
Next

End Sub
'-------------

Ca fonctionne, mais c'est incroyablement long !!

Pensez-vous qu'il y a un pb dans ce bout de code (appliqué à ce
contexte) ?
Serait-il préférable de passer par une macro "Filtre" ? Si oui, comment ?

Merci d'avance pour vos lumières,

Cordialement,

JP





Avatar
Jac
Bonjour j-pascal,
plutôt que de masquer le lignes les unes après les autres, essaye de mettre
en place un filtre automatique et d'appliquer sur la colonne A le critère
"Vides".
Si le temps de réponse est dans le domaine de l'acceptable, alors il n'y a
peut-être même pas besoin de macro.

Jac


"j-pascal" a écrit dans le message de news:
%
Re,

J'ai oublié de préciser qu'en réalité mon tableau comporte plusieurs
dizaines de colonnes, contenant elles-mêmes de nombreuses formules de
recherche (RECHERCHEV).

Je me demande si la macro en question (masquer les lignes) n'est pas
ralentie par un calcul intempestif ??
Peut-être faudrait-il désactiver le calcul automatique ? Je ne l'ai jamais
fait, et je ne suis pas sûr que le pb vienne de là. Néanmoins, ça rame !

@+

JP

"j-pascal" a écrit dans le message de news:

Bonsoir à tous,

Sur la Feuil1, j'ai un tableau de 500 lignes x 10 colonnes.

Dans la colonne B de la Feuil1, j'ai des noms classés en ordre
alphabétique.
Dans la colonne A de la Feuil1, j'ai ">>" si le nom (de la colonne B) a
été saisi dans la Feuil2.
Seuls les noms précédés de ">>" s'affichent (via une MEFC).

Résultat : les données visibles alternent avec des lignes dont le contenu
est masqué par la MEFC.

Je ne sais pas quelle est la meilleure solution pour que seules les
lignes comportant des données visibles apparaissent dans un tableau sans
"vides".

J'ai essayé ceci :

'-------------
Sub MasquageLignes()
Dim i As Long

Application.ScreenUpdating = False

For i = 1 To 500
ActiveSheet.Rows(i).Hidden = InStr(Cells(i, 1), ">>") > 0
Next

End Sub
'-------------

Ca fonctionne, mais c'est incroyablement long !!

Pensez-vous qu'il y a un pb dans ce bout de code (appliqué à ce contexte)
?
Serait-il préférable de passer par une macro "Filtre" ? Si oui, comment ?

Merci d'avance pour vos lumières,

Cordialement,

JP





Avatar
j-pascal
Bonsoir Isabelle,

Merci, c'était effectivement là que ça coinçait !

J'ai même ajouté le code à une "Private Sub Worksheet_Activate()"

'---------------
Private Sub Worksheet_Activate()
'Sub MasquageLignes()
Dim i As Long

ActiveSheet.Unprotect Password:="toto"
Application.Calculation = xlManual

Application.ScreenUpdating = False

For i = 4 To 270
ActiveSheet.Rows(i).Hidden = InStr(Cells(i, 1), ">>") = 0
Next

ActiveWindow.ScrollRow = 4
[a4].Select

Application.Calculation = xlAutomatic
ActiveSheet.Protect "toto", True, True

End Sub
'---------------

1 - Dès lors que ce code est dans un module de "Feuil", la mention :
"ActiveSheet" est-elle nécessaire ?

2 - L'avantage d'avoir inséré le code dans "Private Sub
Worksheet_Activate()" c'est que toute nouvelle saisie dans la Feuil2
actualise les lignes visibles dès qu'on resélectionne la Feuil1 ! Je suis
néanmoins surpris qu'il ne soit pas nécessaire de réafficher toutes les
lignes avant de masquer celles qui doivent l'être ! Assurément, c'est une
bonne surprise ;-)

@+ ?

JP
Avatar
j-pascal
Re,

Aïe !

Sur la "Feuil1" s'affiche un UF et autour de ce "Menu" s'affiche des
"Shapes" (type info-bulles) sous la forme suivante :

'-------------
Private Sub Rep_G_MouseMove(ByVal Button As Integer, ByVal Shift As Integer,
ByVal X As Single, ByVal Y As Single)

If Not Actif Then Exit Sub
If X < 2 Or X > Rep_G.Width - 2 Or Y < 2 Or Y > Rep_G.Height - 2 Then
If centre = True Then
entrée = False
centre = False
ActiveSheet.Shapes("Aide13").Visible = False
End If
Else
With ActiveSheet
.Shapes("Aide1").Visible = False
.Shapes("Aide2").Visible = False
.Shapes("Aide3").Visible = False
.Shapes("Aide4").Visible = False
.Shapes("Aide5").Visible = False
.Shapes("Aide6").Visible = False
.Shapes("Aide7").Visible = False
.Shapes("Aide8").Visible = False
.Shapes("Aide9").Visible = False
.Shapes("Aide10").Visible = False
.Shapes("Aide11").Visible = False
.Shapes("Aide12").Visible = False
.Shapes("Aide13").Visible = True 'ok
End With
centre = True
DoEvents
End If

End Sub
'-------------

Problème : maintenant que seules les lignes comportant des données sont
visibles, la plupart des "Shapes" ne le sont plus !!

Est-il possible d'ancrer mes Shapes autour de mon UF quelques soient les
lignes visibles situées en dessous ?

@+ ?

JP
Avatar
j-pascal
Bonsoir Jac,

Merci pour ta proposition, mais je souhaite laisser le moins d'initiatives
possibles aux différents utilisateurs ...
Par ailleurs, j'imagine que le filtre en question ne s'actualisera pas tout
seul ?!

Le problème de rapidité semble résolu et en plus je suis surpris de
l'actualisation radicale de l'affichage de nouvelles lignes par la procédure
"Private Sub Worksheet_Activate()" (sans passer par le ré-affichage total
des lignes masquées !).

Mon pb maintenant c'est les "Shapes" qui ne sont plus à leurs places ;-(

@+ ?

JP

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

Bonjour j-pascal,
plutôt que de masquer le lignes les unes après les autres, essaye de
mettre en place un filtre automatique et d'appliquer sur la colonne A le
critère "Vides".
Si le temps de réponse est dans le domaine de l'acceptable, alors il n'y a
peut-être même pas besoin de macro.

Jac


"j-pascal" a écrit dans le message de news:
%
Re,

J'ai oublié de préciser qu'en réalité mon tableau comporte plusieurs
dizaines de colonnes, contenant elles-mêmes de nombreuses formules de
recherche (RECHERCHEV).

Je me demande si la macro en question (masquer les lignes) n'est pas
ralentie par un calcul intempestif ??
Peut-être faudrait-il désactiver le calcul automatique ? Je ne l'ai
jamais fait, et je ne suis pas sûr que le pb vienne de là. Néanmoins, ça
rame !

@+

JP

"j-pascal" a écrit dans le message de news:

Bonsoir à tous,

Sur la Feuil1, j'ai un tableau de 500 lignes x 10 colonnes.

Dans la colonne B de la Feuil1, j'ai des noms classés en ordre
alphabétique.
Dans la colonne A de la Feuil1, j'ai ">>" si le nom (de la colonne B) a
été saisi dans la Feuil2.
Seuls les noms précédés de ">>" s'affichent (via une MEFC).

Résultat : les données visibles alternent avec des lignes dont le
contenu est masqué par la MEFC.

Je ne sais pas quelle est la meilleure solution pour que seules les
lignes comportant des données visibles apparaissent dans un tableau sans
"vides".

J'ai essayé ceci :

'-------------
Sub MasquageLignes()
Dim i As Long

Application.ScreenUpdating = False

For i = 1 To 500
ActiveSheet.Rows(i).Hidden = InStr(Cells(i, 1), ">>") > 0
Next

End Sub
'-------------

Ca fonctionne, mais c'est incroyablement long !!

Pensez-vous qu'il y a un pb dans ce bout de code (appliqué à ce
contexte) ?
Serait-il préférable de passer par une macro "Filtre" ? Si oui, comment
?

Merci d'avance pour vos lumières,

Cordialement,

JP









Avatar
j-pascal
Re,

Pb "ancrage" des shapes résolu : "ne pas déplacer ..." ;-)

JP
Avatar
isabelle
bonjour Jp,

une possibilité,

With ActiveSheet
For i = 1 To 12
.Shapes("Aide" & i).Visible = False
.Shapes("Aide" & i).Top = 5 * i 'à modifier selon la dimention des shapes
.Shapes("Aide" & i).Left = 10
Next
.Shapes("Aide13").Visible = True 'ok
End With

isabelle

Bonsoir Jac,

Merci pour ta proposition, mais je souhaite laisser le moins
d'initiatives possibles aux différents utilisateurs ...
Par ailleurs, j'imagine que le filtre en question ne s'actualisera pas
tout seul ?!

Le problème de rapidité semble résolu et en plus je suis surpris de
l'actualisation radicale de l'affichage de nouvelles lignes par la
procédure "Private Sub Worksheet_Activate()" (sans passer par le
ré-affichage total des lignes masquées !).

Mon pb maintenant c'est les "Shapes" qui ne sont plus à leurs places ;-(

@+ ?

JP

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

Bonjour j-pascal,
plutôt que de masquer le lignes les unes après les autres, essaye de
mettre en place un filtre automatique et d'appliquer sur la colonne A
le critère "Vides".
Si le temps de réponse est dans le domaine de l'acceptable, alors il
n'y a peut-être même pas besoin de macro.

Jac


"j-pascal" a écrit dans le message de news:
%
Re,

J'ai oublié de préciser qu'en réalité mon tableau comporte plusieurs
dizaines de colonnes, contenant elles-mêmes de nombreuses formules de
recherche (RECHERCHEV).

Je me demande si la macro en question (masquer les lignes) n'est pas
ralentie par un calcul intempestif ??
Peut-être faudrait-il désactiver le calcul automatique ? Je ne l'ai
jamais fait, et je ne suis pas sûr que le pb vienne de là. Néanmoins,
ça rame !

@+

JP

"j-pascal" a écrit dans le message de news:

Bonsoir à tous,

Sur la Feuil1, j'ai un tableau de 500 lignes x 10 colonnes.

Dans la colonne B de la Feuil1, j'ai des noms classés en ordre
alphabétique.
Dans la colonne A de la Feuil1, j'ai ">>" si le nom (de la colonne
B) a été saisi dans la Feuil2.
Seuls les noms précédés de ">>" s'affichent (via une MEFC).

Résultat : les données visibles alternent avec des lignes dont le
contenu est masqué par la MEFC.

Je ne sais pas quelle est la meilleure solution pour que seules les
lignes comportant des données visibles apparaissent dans un tableau
sans "vides".

J'ai essayé ceci :

'-------------
Sub MasquageLignes()
Dim i As Long

Application.ScreenUpdating = False

For i = 1 To 500
ActiveSheet.Rows(i).Hidden = InStr(Cells(i, 1), ">>") > 0
Next

End Sub
'-------------

Ca fonctionne, mais c'est incroyablement long !!

Pensez-vous qu'il y a un pb dans ce bout de code (appliqué à ce
contexte) ?
Serait-il préférable de passer par une macro "Filtre" ? Si oui,
comment ?

Merci d'avance pour vos lumières,

Cordialement,

JP












Avatar
j-pascal
Bonsoir Isabelle,

Merci pour cette proposition très intéressante que je vais certainement
mettre à profit.

Je t'avais répondu sur l'autre fil que j'avais trouvé une solution en
sélectionnant les Shapes :
"Ne pas déplacer ou dimensionner avec les cellules", ce qui semble
manifestement très efficace.

JPascal

PS : j'ai revu tout mon code pour insérer ça et là :
Application.Calculation = xlManual / Application.Calculation =
xlAutomatic

J'imagine que si l'on omet "xlAutomatic" en fin de procédure, le calcul
reste en manuel ?? J'hésite car je me rends compte que les fins de
procédures sans "Application.ScreenUpdating = True" n'ont (en général ?) pas
d'effet sur l'efficacité du code.

Question subsidiaire :

Est-il possible de compacter sous une forme telle que :

With Application
.Calculation = ----
.ScreenUpdating = ---
End With

(je ne suis pas sûr que cette question soit intelligente ;-) )


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

bonjour Jp,

une possibilité,

With ActiveSheet
For i = 1 To 12
.Shapes("Aide" & i).Visible = False
.Shapes("Aide" & i).Top = 5 * i 'à modifier selon la
dimention des shapes
.Shapes("Aide" & i).Left = 10
Next
.Shapes("Aide13").Visible = True 'ok
End With

isabelle

Bonsoir Jac,

Merci pour ta proposition, mais je souhaite laisser le moins
d'initiatives possibles aux différents utilisateurs ...
Par ailleurs, j'imagine que le filtre en question ne s'actualisera pas
tout seul ?!

Le problème de rapidité semble résolu et en plus je suis surpris de
l'actualisation radicale de l'affichage de nouvelles lignes par la
procédure "Private Sub Worksheet_Activate()" (sans passer par le
ré-affichage total des lignes masquées !).

Mon pb maintenant c'est les "Shapes" qui ne sont plus à leurs places ;-(

@+ ?

JP

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

Bonjour j-pascal,
plutôt que de masquer le lignes les unes après les autres, essaye de
mettre en place un filtre automatique et d'appliquer sur la colonne A le
critère "Vides".
Si le temps de réponse est dans le domaine de l'acceptable, alors il n'y
a peut-être même pas besoin de macro.

Jac


"j-pascal" a écrit dans le message de news:
%
Re,

J'ai oublié de préciser qu'en réalité mon tableau comporte plusieurs
dizaines de colonnes, contenant elles-mêmes de nombreuses formules de
recherche (RECHERCHEV).

Je me demande si la macro en question (masquer les lignes) n'est pas
ralentie par un calcul intempestif ??
Peut-être faudrait-il désactiver le calcul automatique ? Je ne l'ai
jamais fait, et je ne suis pas sûr que le pb vienne de là. Néanmoins,
ça rame !

@+

JP

"j-pascal" a écrit dans le message de news:

Bonsoir à tous,

Sur la Feuil1, j'ai un tableau de 500 lignes x 10 colonnes.

Dans la colonne B de la Feuil1, j'ai des noms classés en ordre
alphabétique.
Dans la colonne A de la Feuil1, j'ai ">>" si le nom (de la colonne B)
a été saisi dans la Feuil2.
Seuls les noms précédés de ">>" s'affichent (via une MEFC).

Résultat : les données visibles alternent avec des lignes dont le
contenu est masqué par la MEFC.

Je ne sais pas quelle est la meilleure solution pour que seules les
lignes comportant des données visibles apparaissent dans un tableau
sans "vides".

J'ai essayé ceci :

'-------------
Sub MasquageLignes()
Dim i As Long

Application.ScreenUpdating = False

For i = 1 To 500
ActiveSheet.Rows(i).Hidden = InStr(Cells(i, 1), ">>") > 0
Next

End Sub
'-------------

Ca fonctionne, mais c'est incroyablement long !!

Pensez-vous qu'il y a un pb dans ce bout de code (appliqué à ce
contexte) ?
Serait-il préférable de passer par une macro "Filtre" ? Si oui,
comment ?

Merci d'avance pour vos lumières,

Cordialement,

JP














Avatar
isabelle
bonjour Jp,

J'imagine que si l'on omet "xlAutomatic" en fin de procédure, le calcul
reste en manuel ??


c'est exact, et je trouve que c'est dangereux de ne pas remettre à "xlAutomatic", un oublie et sans est fait de la validité du calcul.

J'hésite car je me rends compte que les fins de
procédures sans "Application.ScreenUpdating = True" n'ont (en général ?)
pas d'effet sur l'efficacité du code.


ScreenUpdating a son utilité car cela évite un rafraichissement de l'écran lors de l'exécution,
cela minimise les ressources mémoire utilisé par la carte graphique.

Question subsidiaire :
Est-il possible de compacter sous une forme telle que :

With Application
.Calculation = ----
.ScreenUpdating = ---
End With

(je ne suis pas sûr que cette question soit intelligente ;-) )


oui rassure toi, c'est la bonne facon de faire

isabelle
qui vous souhaite à toutes et tous une merveilleuse année 2008.