Masquer une ligne sous deux conditions
Utilisateur anonyme
-
Utilisateur anonyme -
Utilisateur anonyme -
Bonjour,
J'utilise la macro suivante sous Excel 2003 afin de masquer des lignes suivant 2 conditions.
Elle fonctionne mais met beaucoup trop de temps !
Auriez-vous des idées pour l'améliorer afin que ça aille plus vite.
Merci d'avance.
Sub Masquer ()
' masque les lignes inutiles
Dim MyPlage As Range
Dim Plage As Range
Dim derlign As Integer
Dim y As Integer
Dim cell As Range
derlign = Sheets(2).Range("P2").Value
y = Sheets(2).Range("O2").Value
With Worksheets(y)
Set MyPlage = Sheets(y).Range("A4:A" & derlign)
For Each cell In MyPlage
If cell.Value = Sheets(2).Range("M2").Value Then
cell.EntireRow.Hidden = False
ElseIf cell.Value <> Sheets(2).Range("M2").Value Then
cell.EntireRow.Hidden = True
End If
Next
Set MyPlage = Sheets(y).Range("E4:E" & derlign)
For Each cell In MyPlage
If cell.Value <> Sheets(2).Range("R2").Value Then
cell.EntireRow.Hidden = True
End If
Next
End With
End Sub
J'utilise la macro suivante sous Excel 2003 afin de masquer des lignes suivant 2 conditions.
Elle fonctionne mais met beaucoup trop de temps !
Auriez-vous des idées pour l'améliorer afin que ça aille plus vite.
Merci d'avance.
Sub Masquer ()
' masque les lignes inutiles
Dim MyPlage As Range
Dim Plage As Range
Dim derlign As Integer
Dim y As Integer
Dim cell As Range
derlign = Sheets(2).Range("P2").Value
y = Sheets(2).Range("O2").Value
With Worksheets(y)
Set MyPlage = Sheets(y).Range("A4:A" & derlign)
For Each cell In MyPlage
If cell.Value = Sheets(2).Range("M2").Value Then
cell.EntireRow.Hidden = False
ElseIf cell.Value <> Sheets(2).Range("M2").Value Then
cell.EntireRow.Hidden = True
End If
Next
Set MyPlage = Sheets(y).Range("E4:E" & derlign)
For Each cell In MyPlage
If cell.Value <> Sheets(2).Range("R2").Value Then
cell.EntireRow.Hidden = True
End If
Next
End With
End Sub
A voir également:
- Masquer une ligne sous deux conditions
- Partager photos en ligne - Guide
- Mètre en ligne - Guide
- Comment faire deux colonnes sur word - Guide
- Nombre de jours entre deux dates excel - Guide
- Deux ecran pc - Guide
10 réponses
Bonjour,
Essaie ainsi :
Peut-être plus rapide (je ne fais qu'une boucle....)
A voir
Essaie ainsi :
Sub Masquer()
Dim MyPlage As Range, Cell As Range
Dim DerLign As Long
With Worksheets(Sheets(2).Range("O2").Value)
DerLign = .Cells.Find("*", , , , xlByRows, xlPrevious).Row
Set MyPlage = .Range("A4:A" & DerLign)
.Cells.EntireRow.Hidden = False
For Each Cell In MyPlage
Cell.EntireRow.Hidden = Cell.Value <> Sheets(2).Range("M2").Value
Cell.EntireRow.Hidden = Cell.Offset(, 4).Value <> Sheets(2).Range("R2").Value
Next
End With
End Sub
Peut-être plus rapide (je ne fais qu'une boucle....)
A voir
Bonjour,
Et ainsi, est-ce que cela fait gagner un peu de temps?
Bonne nuit
Et ainsi, est-ce que cela fait gagner un peu de temps?
Sub Masquer2()
Dim MyPlage As Range, Cell As Range
Dim DerLign As Long
With Application
.Calculation = xlCalculationManual
.ScreenUpdating = False
With Worksheets(Sheets(2).Range("O2").Value)
DerLign = .Cells.Find("*", , , , xlByRows, xlPrevious).Row
Set MyPlage = .Range("A4:A" & DerLign)
.Cells.EntireRow.Hidden = False
For Each Cell In MyPlage
Cell.EntireRow.Hidden = Cell.Value <> Sheets(2).Range("M2").Value
Cell.EntireRow.Hidden = Cell.Offset(, 4).Value <> Sheets(2).Range("R2").Value
Next
End With
.Calculation = xlCalculationAutomatic
End With
End Sub
Bonne nuit
Bonjour,
Avec mon précédent code, cela masquait-il bien?
C'est exactement le même....
A la rigueur, rajoute cette ligne, en fin de code :
Avec mon précédent code, cela masquait-il bien?
C'est exactement le même....
A la rigueur, rajoute cette ligne, en fin de code :
End With
.Calculation = xlCalculationAutomatic
.ScreenUpdating = True ' <---- celle-ci
End With
End Sub
Bonjour,
Merci de m'aider.
Je vous envois ci-joint un exemple de mon fichier.
http://www.cijoint.fr/cjlink.php?file=cj201009/cijgBr6cSo.xls
L'utilisateur doit sélectionner un élément en D18 et en D20 sélectionner «Envoyer Une Demande de Correction» ce qui ouvre un formulaire.
Pour le test je choisis donc « CC » et « Envoyer Une Demande de Correction » ensuite dans le formulaire il doit sélectionner un trimestre et un service ; la macro doit donc masquer toutes les lignes ne correspondant pas à ce critère.
Ma macro est dans le module1, elle est appelée par la macro de l'UserForm7.
Laure
Merci de m'aider.
Je vous envois ci-joint un exemple de mon fichier.
http://www.cijoint.fr/cjlink.php?file=cj201009/cijgBr6cSo.xls
L'utilisateur doit sélectionner un élément en D18 et en D20 sélectionner «Envoyer Une Demande de Correction» ce qui ouvre un formulaire.
Pour le test je choisis donc « CC » et « Envoyer Une Demande de Correction » ensuite dans le formulaire il doit sélectionner un trimestre et un service ; la macro doit donc masquer toutes les lignes ne correspondant pas à ce critère.
Ma macro est dans le module1, elle est appelée par la macro de l'UserForm7.
Laure
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Re-,
Eh ben, pour une usine à gaz....
En mode pas-à-pas, j'ai réussi à faire fonctionner un code, qui balayait toutes les cellules de la colonne A, mais en automatique, cela ne fonctionnait pas nominalement...
Aussi je te propose ce code, qui fonctionne, et qui utilise les filtres automatiques...
Le code met environ 3.5 secondes pour masquer les lignes qui ne correspondent pas aux critères...
Tu remplaces ta macro "Masquer_IT_IP" par celle-là (n'oublie pas de la renommer, ou de changer la commande dans l'usf7
Bon courage
PS, pour tout ré afficher, tu fais Données/Filtre/Afficher tout
Eh ben, pour une usine à gaz....
En mode pas-à-pas, j'ai réussi à faire fonctionner un code, qui balayait toutes les cellules de la colonne A, mais en automatique, cela ne fonctionnait pas nominalement...
Aussi je te propose ce code, qui fonctionne, et qui utilise les filtres automatiques...
Le code met environ 3.5 secondes pour masquer les lignes qui ne correspondent pas aux critères...
Sub Masquer3()
With Application
.Calculation = xlCalculationManual
.ScreenUpdating = False
With Worksheets(Sheets(2).Range("O2").Value)
With .Range("A3:E3")
.AutoFilter Field:=1, Criteria1:=Sheets(2).Range("M2").Value
.AutoFilter Field:=5, Criteria1:=Sheets(2).Range("R2").Value
End With
End With
.ScreenUpdating = True
.Calculation = xlCalculationAutomatic
End With
End Sub
Tu remplaces ta macro "Masquer_IT_IP" par celle-là (n'oublie pas de la renommer, ou de changer la commande dans l'usf7
Bon courage
PS, pour tout ré afficher, tu fais Données/Filtre/Afficher tout
Re-,
J'ai fait plusieurs essais, et pas de soucis...
Que mets-tu comme conditions, dans la page "Menu"?
@ te relire
J'ai fait plusieurs essais, et pas de soucis...
Que mets-tu comme conditions, dans la page "Menu"?
@ te relire
Re-,
Ton fichier, vu son poids, donne de gros soucis de fiabilité....
De plus, avec tous les codes, les usf.....
Pour la feuille CC, cela fonctionne bien, j'ai voulu modifier pour la DD, ça n'a pas voulu, je l'ai enregistré, fermé Excel, redémarré, et là, ça a fonctionné....
A mon avis, tu risques d'avoir des soucis à l'avenir avec ce fichier....
J'ai un "peu" allégé ton fichier, avec un code de nettoyage, il ne fait plus que 1.5 Mo
http://www.cijoint.fr/cjlink.php?file=cj201009/cijupQuscF.zip
Bon courage
Ton fichier, vu son poids, donne de gros soucis de fiabilité....
De plus, avec tous les codes, les usf.....
Pour la feuille CC, cela fonctionne bien, j'ai voulu modifier pour la DD, ça n'a pas voulu, je l'ai enregistré, fermé Excel, redémarré, et là, ça a fonctionné....
A mon avis, tu risques d'avoir des soucis à l'avenir avec ce fichier....
J'ai un "peu" allégé ton fichier, avec un code de nettoyage, il ne fait plus que 1.5 Mo
http://www.cijoint.fr/cjlink.php?file=cj201009/cijupQuscF.zip
Bon courage
Bonjour,
Merci pour vos explications.
Je viens de constater qu'il y a un probléme avec vos procédures qui tournent en boucle inutilement.
Je fait un test et vous donnerai une réponse.
Merci pour vos explications.
Je viens de constater qu'il y a un probléme avec vos procédures qui tournent en boucle inutilement.
Je fait un test et vous donnerai une réponse.
Bonjour,
Dans votre procédure il faut désactiver le mode de calcul automatique (à cause de la fonction SI() en colonne [Cause]).
Vous insérez dans votre code l'instruction :
Application.Calculation = xlCalculationManual
Entre Y= Sh.... Et With Wo....
Et réactiver le mode calcul automatique comme si dessous :
Dans votre procédure il faut désactiver le mode de calcul automatique (à cause de la fonction SI() en colonne [Cause]).
Vous insérez dans votre code l'instruction :
Application.Calculation = xlCalculationManual
Entre Y= Sh.... Et With Wo....
y = Sheets(2).Range("O2").Value
Application.Calculation = xlCalculationManual
With Worksheets(y)
Et réactiver le mode calcul automatique comme si dessous :
End With Application.Calculation = xlCalculationAutomatic End SubLe temps d'exécution est d'environ 2 à 4 secondes.
Re-
Le code (de Laurent Longre, gourou d'Excel)
Par contre, je ne comprends pas "suivant les 2 conditions...."
@ te relire
Le code (de Laurent Longre, gourou d'Excel)
Sub NettoieEtDerniereCellule() ' Laurent Longre
Dim Sht As Worksheet, DCell As Range, Calc As Long
On Error Resume Next
Calc = Application.Calculation
With Application
.Calculation = xlCalculationManual
.StatusBar = "Nettoyage en cours..."
.EnableCancelKey = xlErrorHandler
.ScreenUpdating = False
End With
For Each Sht In Worksheets
If Sht.UsedRange.Address <> "$A$1" Or Not IsEmpty(Sht.[A1]) Then
Set DCell = Sht.Cells.Find("*", , , , xlByRows, xlPrevious)(2)
If Not DCell Is Nothing Then
Sht.Range(DCell, Sht.Cells([A:A].Count, 1)).EntireRow.Delete
Set DCell = Nothing
Set DCell = Sht.Cells.Find("*", , , , xlByColumns, xlPrevious)(, 2)
If Not DCell Is Nothing Then _
Sht.Range(DCell, Sht.[IV1]).EntireColumn.Delete
End If
End If
Next Sht
Application.StatusBar = False
Application.Calculation = Calc
End Sub
Par contre, je ne comprends pas "suivant les 2 conditions...."
@ te relire
Trop lent ne veut rien dire, pouvez-vous indiqué la grandeur du fichier à traiter et le temps d'exécution de la procédure?
Salutations.
Le Pingou
Mon fichier a une taille totale de 6,51 MO.
Sur la feuille où s'exécute la macro il n'y a pour le moment que 95 lignes (ça évolue dans le temps). Elle m'a mis 10 min pour me masquer les lignes en questions.
Laure