Masquer ligne selon critère dans une colonne

Bonjour à tous,

Je tâtonne sur VBA, et je suis actuellement bloqué.

Je cherche à masquer les lignes de mon fichier excel selon le résultat d'une colonne donnée (en l’occurrence, dans la colonne Y, je mets des croix si je souhaite que la ligne apparaisse, et donc la ligne est masquée si le résultat est vide).

Cela fonctionne bien sur une feuille, mais dès que j'essaye d'ajouter d'autres feuilles dans mon code, j'ai un message d'erreur.

Voici mon code qui fonctionne sur une feuille (mais dont l’exécution est très lente... une idée pour optimiser le code ?) :

Sub Masquer()

'Masquer

Dim cel As Range

For Each cel In Range("Y1:Y999")

If cel = "" Then

cel.EntireRow.Hidden = True

End If

Next

'Afficher

For Each cel In Range("Y1:Y999")

If cel <> "" Then

cel.EntireRow.Hidden = False

End If

Next

End Sub

Mais comment faire cette même procédure sur plusieurs feuilles ?

Merci d'avance,

roro

Bonjour RoRo,

je ne suis pas un expert en VBA, mais quand tu code sur plusieurs feuilles je pense qu'il faille déclarer ces feuilles

Voici ce que je ferais:

dim ws as woskrsheet

set ws = activesheet
'ou pour selectionner une autre feuille

set ws = sheets("nom de feuille")

'apres quoi tu continue ton code:
for each cel in ws.range("Y1:Y999")
.
.
.
next

dis-moi si ça fonctionne

Yves

Bonjour Yves,

Non, ça ne fonctionne pas. Voici le code que j'ai testé :

Sub Masquer()

'Ma feuille 1

Dim ws As Worksheet

Set ws = Sheets("Ma feuille 1")

'Masquer

Dim cel As Range

For Each cel In Range("Y1:Y999")

If cel = "" Then

cel.EntireRow.Hidden = True

End If

Next

'Afficher

For Each cel In Range("Y1:Y999")

If cel <> "" Then

cel.EntireRow.Hidden = False

End If

Next

'Ma feuille 2

Dim ws As Worksheet

Set ws = Sheets("Ma feuille 2")

'Masquer

Dim cel As Range

For Each cel In Range("Y1:Y999")

If cel = "" Then

cel.EntireRow.Hidden = True

End If

Next

'Afficher

For Each cel In Range("Y1:Y999")

If cel <> "" Then

cel.EntireRow.Hidden = False

End If

Next

End Sub

regarde bien que j'ai écrit:

for each cel in ws.Range("Y1:Y999")

essaie cette fois et dis-moi si ça marche

si tu veux changer de feille il faudra la declarer aussi:

'une fois fait MaFeuille, tu as peut-etre MaFeuille2

set ws = Sheets("MaFeuille2")
'et tu continues

' Tu pourrais aussi faire pur toutes les feuilles

Dim wb as workbook
dim ws as worksheet

for each ws in wb.Worksheets
.
.
.
next ws

Re-

Ça fonctionne !

J'ai encore du mal à bien comprendre comment les choses s'imbriquent les unes dans les autres, mais en tout cas, merci Alain.

Roro

Ce qui se passe en VBA, c'est que la macro doit savoir ou elle doit opérer.

quand on écrit:

cell.EntireRow.Hidden = True

VBA considère que Cell se trouve dans la feuille qui est activée.

Si on ecrit:

set ws = Sheets("Feuil2") 

Cela ne veut pas dire que l'on a active Feuil2. Ca veut tout simplement dire que ws a change de nom; donc dans ce cas-ci, la valeur de Cell reste dans Feuil1 car VBA ne sait pas que l'on veut changer de feuille.

Une autre facon d'ecrire et qui fonctionne aussi, serait d'active la feuille avant d'ecrire le code:

set ws = Sheets("Feuile2")
ws.activate

A partir de la VBA reconnait que la feuille active est bien Feuil2.

C'est un peu moins le brouillard?

Yves

Bonjour rom3210, AustinRunner, le forum,

Une autre proposition à tester, d'après ce que j'ai compris, à savoir:

Si j'ai un x en colonne Y, la ligne est visible, sinon elle est masquée (macro masquer).

Si je veux tout afficher, y compris les lignes sans x, j’exécute la macro afficher.

Sub Masquer()

'Masquer

Dim DernLigne As Long, a As Long
Dim i As Byte

  For i = 1 To Sheets.Count   'de la feuille 1 à la dernière feuille nommée
               Sheets(i).Activate   'on sélectionne les  feuilles

    With Sheets(i)

       DernLigne = Range("Y" & Rows.Count).End(xlUp).Row
   For a = 1 To DernLigne

If Range("Y" & a) = "x" Then
  .Rows(a).EntireRow.Hidden = False
Else
  .Rows(a).EntireRow.Hidden = True
End If
   Next a

   End With
  Next
End Sub

Sub afficher()

'Afficher

Dim DernLigne As Long, a As Long
Dim i As Byte

   For i = 1 To Sheets.Count
                Sheets(i).Activate

    With Sheets(i)

       DernLigne = Range("Y" & Rows.Count).End(xlUp).Row
   For a = 1 To DernLigne

 .Rows(a).EntireRow.Hidden = False

   Next a

    End With
  Next

End Sub

Cordialement,

19rom3210.xlsm (16.93 Ko)
Rechercher des sujets similaires à "masquer ligne critere colonne"