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
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 SubCordialement,
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 SubLe 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 SubMerci ! 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 !