Cacher des lignes si aucun contenu dedans
Bonjour,
Je souhaiterai cacher des lignes si il n y a aucun contenu dans celles-ci mais je voudrais qu'il y ait un comptage de ligne vide.
Par exemple si il n y a pas de contenu sur 5 lignes d'affilés (condition) alors cacher les cellules suivante jusqu'à ce qu'il y ait de nouveau du contenu dans une ligne.
Actuellement je sais cacher les lignes que je veux (EntireRow.Hidden) avec leur numéro mais je n'arrive pas à mettre en place ce comptage de lignes vides.
Exemple :
- Contenu dans n'importe quelle colonne de la ligne 1 > passage a la ligne suivante
- Pas de contenu dans n'importe quelle colonne de la ligne 2 > passage a la ligne suivante et incrément de 1 dans un compteur (1 ligne vide)
- Pas de contenu dans n'importe quelle colonne de la ligne 3, 4, 5 et 6 > cacher toutes les lignes (compteur=5 car 5 lignes vides d'affilé donc condition OK) jusqu'à la prochaine ligne ayant du contenu dans une colonne
Je n'ai pas de proposition VBA pour ça car je n'ai aucune idée de comment faire
J'espère que le sujet est clair
D'avance merci,
Paul
Bonjour,
Vu que nous ne disposons d'aucun support, montrez au moins le code que vous avez déjà écrit, nous n'aurons plus qu'à le modifier pour qu'il réponde à vos attentes.
Cdlt
Actuellement, en fonction d'une valeur dans une cellule je cache toutes les lignes du tableur et n'affiche que celle qui m'intéresse. Par exemple pour les valeurs suivante en C8 et C9, j'affiche les lignes 11 à 160 puis 193 à 220 :
If Range("C8").Value = "MOULAGE" And Range("C9").Value = "" Then
Rows("11:160").EntireRow.Hidden = False
Rows("193:220").EntireRowHidden= FalseCependant cette méthode ne me permet de remplir des cellules du tableur en dessous de la ligne 160 sans modifier le code VBA (et changer ce "160") pour les afficher aussi.
J'aimerai donc mettre en place le comptage évoqué dans le premier message afin qu'il vérifie automatiquement si des lignes en dessous ont du contenu ou non et qu'au bout d'un certain nombre de ligne vide d'affilé (5), ça les cachent jusqu'à la prochaine ligne ayant du contenu.
Franchement pas clair du tout:
Actuellement, en fonction d'une valeur dans une cellule je cache toutes les lignes du tableur et n'affiche que celle qui m'intéresse. Par exemple pour les valeurs suivante en C8 et C9, j'affiche les lignes 11 à 160 puis 193 à 220 :
et dans le code, vous les masquez
Rows("11:160").EntireRow.Hidden = False
Rows("193:220").EntireRowHidden= FalseAlors on masque ou on affiche?
Vos explications et vos lignes de codes ne permettent pas de comprendre, un fichier joint (sans données confidentielles) avec le résultat attendu s'avère nécessaire, sinon on va tourner en rond encore longtemps et, les réponses proposées risquent de ne pas être satisfaisantes.
Boujour,
Je n'ai pas tout compris également, ce que j'en retient c'est que si 5 lignes vide s'enchainent tu souhaites les masquer.
Voici un exemple de ce que tu peux faire.
Sub MasqueGroupeVide()
Dim Ref As Integer
Dim derRef As Integer
Dim EnsVide As Long
Dim NbVide As Integer
derRef = Cells(Rows.Count, 2).End(xlUp).Row
For Ref = 3 To derRef
'EnsVide => Ligne qui correspond a la derniere du "groupe"
EnsVide = Cells(Ref, 3).End(xlDown).Row - 1
'Ne pas prendre en compte les ligne a l'extérieur du tableau
If EnsVide >= derRef Then EnsVide = derRef
'Compte le nombre de cellule vide dans cet enssemble groupé
NbVide = WorksheetFunction.CountBlank(Range(Cells(Ref, 3), Cells(EnsVide, 3)))
'Suivant le nombre de cellules vide obtenu
Select Case NbVide
'Si c'est inférieur a 5
Case Is < 5
'On ne fait rien
' Range(Cells(Ref, 3), Cells(EnsVide, 3)).EntireRow.Hidden = False
Ref = EnsVide
Case Else
'Sinon on masque l'enssemble
Range(Cells(Ref + 1, 3), Cells(EnsVide, 3)).EntireRow.Hidden = True
Ref = EnsVide
End Select
Next Ref
End Sub
A+
Je ne comprend pourtant pas ce qui bloque la compréhension..
Je parle de ligne, pas de celulle. C'est en gros un balayage a effectué dans chaque ligne pour voir si il y a du contenu ou non.
Arturo, je ne les masque pas puisque je met la variable cacher = False, j'annule donc le masquage
Geof52 à l'air d'avoir compris, le seul truc est que je ne veux pas uniquement masquer les 5 lignes vides d'affilées. Je veux masquer aussi celle qui viennent après tant qu'aucune ligne rempli n'est rencontrée.
Voila ce que j'ai fais, mais ce que j'aimerai est décrit dans la zone surligné jaune (L137 à 164) qui reprend ce que j'ai déjà dis.
Mon message precedent ne masque pas seulement 5 lignes, mais bien toutes les lignes vide si il y a plus de 5 lignes vide a la suite (jusqu'a un retour de cellule non vide)
'Suivant le nombre de cellules vide obtenu
Select Case NbVide
'Si c'est inférieur a 5
Case Is < 5
'On ne fait rien
Case Else
'Sinon on masque l'enssembleTest mon fichier en ne mettant pas de quantité sur 10/15 lignes
Exact ! Merci pour ta contribution !
Juste petite question. Dans ton programme quelle est la différence entre EnsVide et derRef.
Si tu pouvais reprendre ligne par ligne en "traduisant" pour que je puisse comprendre ce serait parfait ! (je ne connais pas toutes les fonction telle que End() ou Case).
Sinon merci encore
J'avoue que je suis pas terrible dans mes explications et le nom des variables n'est peut-etre pas forcement bien explicite.
N'hésite pas a passer la macro en mode pas a pas avec F8 et jette un oeil dans les variables locales (ça pourra surement aider a la compréhension).
Sub MasqueGroupeVide()
Dim Ref As Integer
Dim derRef As Integer
Dim EnsVide As Long
Dim NbVide As Integer
derRef = Cells(Rows.Count, 2).End(xlUp).RowderRef correspond a la derniere reference de mon tableau (pour éviter que la macro masque les lignes au dela de ma zone de travail)
For Ref = 3 To derRefLa macro va donc concerner la réferences de la ligne 3 a ma derniere ligne donc la 32 et boucler a "chaque groupe" (avec Ref = EnsVide a la fin de la macro)
EnsVide = Cells(Ref, 3).End(xlDown).Row - 1EnsVide correspond a mon groupe.
Suivant la ref donc ligne 3 et colonne 3 [C3] je prend la prochaine valeur en dessous (qui sera une ligne donc Row) et - 1 car on souhaites pas la prochaine valeur mais le derniere cellule vide
=> soit {.End(xlDown)} correspond a une pression de touche Ctrl + Shift + Fleche bas
If EnsVide >= derRef Then EnsVide = derReCette ligne limite le groupe de cellule a ma limite de tableau pour ne pas masquer les colonnes qui ne sont pas concerné pas l'action de masquage (a cause du End down justement)
Traduction, si la cellule du groupe est une ligne en dessous de ma limite de tableau alors on arrete le groupe a la limite du tableau
donc si les 8 dernières lignes du tableau sont vide, les lignes sous le tableau ne seront pas masqué puisque hors limite.
NbVide = WorksheetFunction.CountBlank(Range(Cells(Ref, 3), Cells(EnsVide, 3)))NbVide correspond au nombre de cellules vide (grace a CountBlank) on regarde la ligne de ref jusqu'au groupe EnsVide
Ce qui nous donne forcement le nombre de cellule vide collé les une aux autres car elles sont dans le meme groupe.
Select Case NbVide
Case Is < 5
'si le nombre de cellule vide est inférieur a 5 blablabla
Case Else
'si le nombre de cellule vide est tous sauf ce qu'on a testé avant alors blablabla => Masquage pour ton cas
End SelectSelect case est une fonction si a multiple condition, en haut du site tu peut trouver des explication plus poussé Lien vers Select case
, cette fonction c'est le feu !
Ref = EnsVideLa réference (ma ligne debut de groupe) passe a ma ligne fin de groupe car on ne souhaite pas que la macro passe plussieurs fois dans le même groupe (=> on saute des lignes en gros).
Next RefEt on boucle.
Voila j'ai sorti comme ça me venait, j'imagine que c'est dur de rentrer dans mal tête plein de bordel mais perso je m'y sens bien
A+
D'accord ! Merci beaucoup pour ces explications ! Ca me semble plus limpide, j'irai voir pour la fonction Select Case du coup
Bonne fin de journée