Masquer lignes plusieurs feuilles Excel

Bonjour,

Je suis très très débutante en VBA... J'ai un fichier avec plusieurs feuilles dont je voudrais masquer les lignes vides. J'ai trouvé une macro qui fonctionne mais je ne sais pas comment la généraliser à plusieurs feuilles.

En fait, je voudrais masquer les lignes vides de certaines feuilles en utilisant une seule macro. Est-ce possible ?

Voici la macro en question :

Sub Masquer_Lignes_Videsmandats()

Application.ScreenUpdating = False

Range("A11:A799").Select

For Each Cell In Selection

Cpt = 0

For i = 0 To 11

If Cell.Offset(0, i) <> "" Then

Cpt = Cpt + 1

End If

Next

If Cpt = 0 Then

Cell.EntireRow.Hidden = True

Else

Cell.EntireRow.Hidden = False

End If

Next

Application.ScreenUpdating = True

End Sub

Merci pour votre aide

Charlotte

Bonjour,

Tu souhaites le faire sur toutes les feuilles ou seulement certaines ?

Si ce n'es tque sur certaines, est-ce que toutes ces feuilles se suivent ?

Cordialement,

Bonjour,

Pas trop compris le code sachant que tu parcours la colonne A uniquement au niveau de la sélection puis ensuite on contrôle des colonnes à droite...

Quel est le critère exact de la cellule vide ? en colonne A ou ailleurs ?

Est-ce que le code doit être appliqué sur chaque feuille du fichier ? Si non, il faut connaitre le nom ou la position des feuilles non concernées

Amicalement

@ Dan

De ce que j'en ai compris moi :

elle balaie la colonne A de la ligne 11 à 799, et pour chaque ligne, elle vérifie si les 11 premières colonnes sont vides, et si oui elle masque la ligne, sinon si une des colonnes possède une valeur, elle laisse la ligne affichée.

Donc le critère ne serait pas sur 1 cellule mais sur 11 cellules par ligne.

Cordialement,

Zirak,

Evidemment j'ai aussi compris cela mais bon avec une confirmation de la part du demandeur ou mieux un fichier, on ne s'éternise pas dans les fils.

Amicalement

Merci pour vos réponses rapides.

En fait, je veux faire un suivi de compta : à partir des 2 feuilles "dépenses" et "engdépenses", j'alimente les autres feuilles qui sont associées à un numéro de compte.

Les feuilles associées à un numéro de compte (toutes celles du classeur sauf "récap" et "dépenses" et "engdépenses") sont toutes identiques : un premier tableau (lignes 11 à 800) qui renvoit aux dépenses et un second tableau (lignes 806 à 1800) qui renvoient aux eng.

Je vais remplir les 2 feuilles "dépenses" et "engdépenses" au fur et à mesure, j'ai donc prévu beaucoup de lignes sur mes autres feuilles. Pour l'instant, j'ai donc énormément de lignes vides.

Ce sont ces lignes que je voudrais masquer (et démasquer automatiquement si elles se remplissent) tant qu'il n'y a pas de dépenses qui correspond sur toutes les feuilles du classeur sauf "récap" et "dépenses" et "engdépenses".

Ces feuilles se suivent dans mon classeur.

Pour répondre à Dan, j'ai trouvé la macro sur internet et ai essayé de l'adapter.

Merci de vos réponses

Charlotte

76copie-de-test.zip (269.10 Ko)

Alors déjà une question, à la vue de ton fichier, quel est l'intérêt de tester 11 colonnes de chaque ligne alors que ton tableau n'en contient que 7 (les tableaux de tes onglets 723,726,... ne vont que de A à G) ?

Deuxièmement, je ne pense pas que ta macro "fonctionne" vraiment. En fait elle "fonctionne" dans le sens ou elle masque bien les lignes vides, mais pour ce qui est du ré-affichage moi j'ai le droit à un beau message d'erreur une fois que toutes les lignes ont été masquées.

Voici un bout de code qui fonctionne, mais même en repassant de 11 à 7 colonnes de test, cela reste relativement long comme traitement (excel donne l'impression de freezer mais c'est normal), par contre, je n'imagine même pas sur ton fichier réel si il faut réaliser cela sur 30 pages, tu auras le temps d'aller boire un café...

Enfin si tu fais un déclenchement manuel de la macro quand tu sais que tu as X minutes à perdre ça va, mais si tu veux que les lignes se démasquent automatiquement à chaque saisie, cela risque de devenir ingérable. Ou alors il faut partir sur une autre approche et faire du traitement ligne par ligne et non plus par feuille entière.

Tu es sûr d'avoir besoin de tester toutes les colonnes ? Il n'y en a pas une (comme le numéro de mandat par exemple) qui est obligatoirement remplie lors d'une saisie et sur laquelle tu pourrais te baser ?

Sub Masquer_Lignes_Videsmandats()

Dim i As Integer, j As Integer, k As Integer

Application.ScreenUpdating = False

For j = 1 To ActiveWorkbook.Worksheets.Count

If Worksheets(j).Name <> "recap" And Worksheets(j).Name <> "DEPENSES" And Worksheets(j).Name <> "engDEPENSES" Then

Worksheets(j).Activate

For k = 11 To 799
    Cpt = 0
    For i = 1 To 7
        If Cells(k, i).Value <> "" Then
            Cpt = Cpt + 1
        End If
    Next i
    If Cpt = 0 Then
        Cells(k, i).EntireRow.Hidden = True
    Else
        Cells(k, i).EntireRow.Hidden = False
    End If
Next k

End If

Next j

Worksheets("DEPENSES").Activate

Application.ScreenUpdating = True

End Sub

Cordialement,

Re,

Essaie déjà avec ce code mais bon comme Zirak le dit. Tes colonnes vont de A à G (et non de A à K comme dans le code)

Au niveau ligne, cela descend plus bas que 799.

Sub Masquer_Lignes_Videsmandats()
Dim cel As Range
Dim i As Byte
Application.ScreenUpdating = False
For i = 1 To Sheets.Count
    With Sheets(i)
        If Sheets(i).Name <> "recap" And Sheets(i).Name <> "DEPENSES" And _
            Sheets(i).Name <> "engDEPENSES" Then
        For Each cel In .Range("A11:A799")
            If WorksheetFunction.Count(.Range("A" & cel.Row & ":G" & cel.Row)) = 0 Then
                .Rows(cel.Row).EntireRow.Hidden = True
            Else: .Rows(cel.Row).EntireRow.Hidden = False
            End If
        Next
        End If
    End With
Next
Application.ScreenUpdating = True
End Sub

Le code ne gére que jusque la ligne 799 et s'applique sur les feuilles 7XX.

Sinon cela me semble un peu lourd à gérer toutes ces formules et le masquage prend du temps évidemment vu le nombre de ligne à traiter.

Amicalement

Bonjour

Juste pour le sport une autre méthode

Sub B64Masquer_Lignes_Videsmandats()
Dim I As Byte
Dim T
T = Time

  Application.ScreenUpdating = False
  For I = 1 To Sheets.Count
    If Sheets(I).Name <> "recap" And Sheets(I).Name <> "DEPENSES" And _
              Sheets(I).Name <> "engDEPENSES" Then
      With Sheets(I)
        .Rows.Hidden = False
        .Columns(1).Insert
        With .Range("A11:A800")
          .Formula = "=TRIM(RC[1]& RC[2]& RC[3]&RC[4]& RC[5]& RC[6]& RC[7])"
          .Value = .Value
          On Error Resume Next
          .SpecialCells(xlCellTypeBlanks).EntireRow.Hidden = True
          On Error GoTo 0
        End With
        .Columns(1).Delete
      End With
    End If
  Next
  Application.ScreenUpdating = True

  MsgBox "Durée " & Format(Time - T, "hh:mm:ss")
End Sub

Merci ! Je viens de tester les macros. C'est effectivement très long !

Vous avez raison, je n'ai besoin de tester que sur une colonne. j'ai donc changé le code en conséquence...

Sub Masquer_Lignes_Videsmandats()

Dim i As Integer, j As Integer, k As Integer

Application.ScreenUpdating = False

For j = 1 To ActiveWorkbook.Worksheets.Count

If Worksheets(j).Name <> "recap" And Worksheets(j).Name <> "DEPENSES" And Worksheets(j).Name <> "engDEPENSES" Then

Worksheets(j).Activate

For k = 11 To 799

Cpt = 0

For i = 1 To 1

If Cells(k, i).Value <> "" Then

Cpt = Cpt + 1

End If

Next i

If Cpt = 0 Then

Cells(k, i).EntireRow.Hidden = True

Else

Cells(k, i).EntireRow.Hidden = False

End If

Next k

End If

Next j

Worksheets("DEPENSES").Activate

Application.ScreenUpdating = True

End Sub

Le fichier est effectivement très lourd. mais je n'ai pas d'autres idées... Si vous en avez, je suis preneuse !

Merci beauxoup

Bonjour

As tu testé la macro que j'ai posté

Il doit y avoir un gain de temps non ou alors je me suis planté

Super merci Banzai64 ! Ca marche nickel !

Rechercher des sujets similaires à "masquer lignes feuilles"