Microsoft 365 Boucle pour afficher et masquer des lignes

shf

XLDnaute Nouveau
Bonjour,
Je ne maitrise pas super bien les boucles donc voici ma question.
j'ai en colonne A des IDs avec des cellules vides entre chaque, j'ai déjà fait en sorte qu'en appuyant sur une image + ça affiche les lignes masquées et un bouton - pour les masquer.
Mais si j'ai 200 entrées j'aurai un code sans fin.
Voici le code sur 3 clics d'images:

Sub Masquées_Les_Lignes_()
Dim SelectionCellule As Long
Dim Signe_Moins_1
Signe_Moins_1 = [_1er].Select
SelectionCellule = Range(Cells(ActiveCell.Offset(1, 0).Row, "A"), _
Cells(ActiveCell.Row, "A").End(xlDown).Offset(-1, 0)).Select
With selection
.EntireRow.Hidden = True
End With
End Sub
'******************************************************************************
Sub Afficher_Les_Lignes_Masquées()
Dim SelectionCellule As Long
Dim Signe_Plus_1
Signe_Plus_1 = [_1er].Select
SelectionCellule = Range(Cells(ActiveCell.Offset(1, 0).Row, "A"), _
Cells(ActiveCell.Row, "A").End(xlDown).Offset(-1, 0)).Select
With selection
.EntireRow.Hidden = False
End With
End Sub
'******************************************************************************
Sub Masquées_Les_Lignes2()
Dim SelectionCellule2 As Long
Dim Signe_Moins_2
Signe_Moins_2 = [_2ième].Select
SelectionCellule2 = Range(Cells(ActiveCell.Offset(1, 0).Row, "A"), _
Cells(ActiveCell.Row, "A").End(xlDown).Offset(-1, 0)).Select
With selection
.EntireRow.Hidden = True
End With
End Sub
'******************************************************************************
Sub Afficher_Les_Lignes_Masquées2()
Dim SelectionCellule2 As Long
Dim Signe_Plus_2
Signe_Plus_2 = [_2ième].Select
SelectionCellule2 = Range(Cells(ActiveCell.Offset(1, 0).Row, "A"), _
Cells(ActiveCell.Row, "A").End(xlDown).Offset(-1, 0)).Select
With selection
.EntireRow.Hidden = False
End With
End Sub
'******************************************************************************
Sub Masquées_Les_Lignes3()
Dim SelectionCellule3 As Long
Dim Signe_Moins_3
Signe_Moins_3 = [_3ième].Select
SelectionCellule3 = Range(Cells(ActiveCell.Offset(1, 0).Row, "A"), _
Cells(ActiveCell.Row, "A").End(xlDown).Offset(-1, 0)).Select
With selection
.EntireRow.Hidden = True
End With
End Sub
 
Solution
Bonjour,
pour grp: il s'agit juste de l'abréviation de groupe. Cela sert pour reconnaitre le nom des cellules nommées. Ces dernières devant toutes commencer leur nom par ces trois lettres.
Dans le code cela se trouve là :
VB:
...
'Si le nom commence par grp et que la cellule double-cliqué correspond au nom alors
            If Not (Intersect(Target, Range(nom.Name)) Is Nothing) And Left(nom.Name, 3) = "grp" Then
            ...
Après pour différencié ces cellules, on peut mettre ce que l'on veut, le plus simple ces de mettre le numéro de ligne.
Ensuite il faut connaitre le nombre de lignes à masquer. C'est pourquoi il y à ce caractère " _ " suivi du nombre de lignes à masquer.
En faisant ainsi tous est dans le nom de la cellule.

Phil69970

XLDnaute Barbatruc
Bonjour @shf

C'est beaucoup plus lisible en mettant le code entre balise

1715933045658.png


J'ai pas vu ton fichier ;)
 

piga25

XLDnaute Barbatruc
Bonjour à tous,
Un essai pour masquer toutes les lignes vide et pour les afficher.
Voir feuil2
VB:
Sub Masque()
For i = 6 To 40  'Ici tu mets le nombre le ligne
    If Range("A" & i) = "" Then ' je test si la cellule A est vide
        Rows(i).Select  'Selectionne la ligne
        Selection.EntireRow.Hidden = True   'masque la ligne
    End If
        Next i
End Sub

Sub demasque()
   Cells.EntireRow.Hidden = False
End Sub
 

Pièces jointes

  • Liste de tâches exemple01 (1).xlsm
    33.5 KB · Affichages: 2

shf

XLDnaute Nouveau
@shf

et pourquoi tu ne fais pas ceci

Regarde la pièce jointe 1197033

C'est tellement plus simple et sans 1 ligne de VBA
(Pour info c'est aussi faisable en VBA bien sur)

Merci de ton retour
Je connais cette fonction, mais j'ai d'autre chose à faire en VBA donc je préfère le faire avec. Après je voudrai également mettre le + au dessus du - pour que l'un s'affiche quand l'autre et sélectionné etc après une fois que tout est fait je veux masquer justement toutes les barres et règles afin de maximiser l'affichage écran.
 

shf

XLDnaute Nouveau
Bonjour à tous,
Un essai pour masquer toutes les lignes vide et pour les afficher.
Voir feuil2
VB:
Sub Masque()
For i = 6 To 40  'Ici tu mets le nombre le ligne
    If Range("A" & i) = "" Then ' je test si la cellule A est vide
        Rows(i).Select  'Selectionne la ligne
        Selection.EntireRow.Hidden = True   'masque la ligne
    End If
        Next i
End Sub

Sub demasque()
   Cells.EntireRow.Hidden = False
End Sub
Salut, oui je l'avais déjà testé, mais ce que je veux faire c'est afficher ou masquer entre 2 entrées, pas l'ensemble
 

piga25

XLDnaute Barbatruc
Bonjour,
Alors comme ceci :
VB:
Sub Grouper()
For Each Cel In Range("A6:A" & Range("A" & Rows.Count).End(xlUp).Row)
    r = Cel.Row
        If Cel.Value = "" Then
            derlig = Columns(1).Find("*", Cel, , xlByRows, xlNext).Row - 1
            Range("A" & r & ":A" & derlig).Rows.Group
        End If
Next Cel
ActiveSheet.Outline.ShowLevels RowLevels:=1 ' Groupe les lignes en les masquant
End Sub

Sub Degrouper()
    Selection.ClearOutline
End Sub
 

Pièces jointes

  • Liste de tâches exemple.xlsm
    34 KB · Affichages: 2

shf

XLDnaute Nouveau
Bonjour,
Alors comme ceci :
VB:
Sub Grouper()
For Each Cel In Range("A6:A" & Range("A" & Rows.Count).End(xlUp).Row)
    r = Cel.Row
        If Cel.Value = "" Then
            derlig = Columns(1).Find("*", Cel, , xlByRows, xlNext).Row - 1
            Range("A" & r & ":A" & derlig).Rows.Group
        End If
Next Cel
ActiveSheet.Outline.ShowLevels RowLevels:=1 ' Groupe les lignes en les masquant
End Sub

Sub Degrouper()
    Selection.ClearOutline
End Sub
Arff, la ça me fait la même chose que grouper mais en automatique, mais je ne veux pas que cela vienne sur le côté.
 

piga25

XLDnaute Barbatruc
Bonjour,
Dernière solution trouvée :
code dans la feuille:
VB:
Option Explicit
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
'Definition des variables
    Dim nom As Name
    Dim position_underscore As Variant
    'Désactive l'affichage des modifications à l'écran
    Application.ScreenUpdating = False
    'scanne l'ensemble des noms pour vérifier si la cellule du double-clic (target)
    'fait partie d'un nom grp_xx
    For Each nom In ActiveWorkbook.Names
        If nom.RefersToRange.Worksheet.Name = Me.Name Then

            'Si le nom commence par grp et que la cellule double-cliqué correspond au nom alors
            If Not (Intersect(Target, Range(nom.Name)) Is Nothing) And Left(nom.Name, 3) = "grp" Then
                'cherche la position du caractère de soulignement
                position_underscore = WorksheetFunction.Search("_", nom.Name)
                'Masque les lignes concernées (appelle la procédure ci-dessous)
                'Le nombre de ligne est défini comme étant la portion de texte après le caractère de soulignement
                Call masqueligne(Mid(nom.Name, position_underscore + 1, Len(nom.Name) - position_underscore), True)
                'désactive l'action du double clic sur la cellule (en général, édition du contenu de la cellule)
                Cancel = True
            End If
        End If
    Next
    'réactive l'affichage des modifications à l'écran
    Application.ScreenUpdating = True
End Sub

code dans un module
Code:
Option Explicit
Sub masqueligne(nb_ligne As Double, remplace_contenu As Boolean)
'teste si la ligne en dessous de la cellule double-cliquée est masquée
    If Rows(ActiveCell.Row + 1).Hidden = False Then
        'si elle n'est pas masquée alors on masque
        Rows(ActiveCell.Row + 1 & ":" & ActiveCell.Row + nb_ligne).EntireRow.Hidden = True
        'on change le contenu de la cellule pour +
        If remplace_contenu Then ActiveCell.Value = "+"
    'sinon
    Else
        'on démasque les lignes
        Rows(ActiveCell.Row + 1 & ":" & ActiveCell.Row + nb_ligne).EntireRow.Hidden = False
        If remplace_contenu Then ActiveCell.Value = "-"
    End If
End Sub

Le fichier (voir feuille 1)
 

Pièces jointes

  • Liste de tâches exemple.xlsm
    40.3 KB · Affichages: 2

piga25

XLDnaute Barbatruc
Bonjour,
pour grp: il s'agit juste de l'abréviation de groupe. Cela sert pour reconnaitre le nom des cellules nommées. Ces dernières devant toutes commencer leur nom par ces trois lettres.
Dans le code cela se trouve là :
VB:
...
'Si le nom commence par grp et que la cellule double-cliqué correspond au nom alors
            If Not (Intersect(Target, Range(nom.Name)) Is Nothing) And Left(nom.Name, 3) = "grp" Then
            ...
Après pour différencié ces cellules, on peut mettre ce que l'on veut, le plus simple ces de mettre le numéro de ligne.
Ensuite il faut connaitre le nombre de lignes à masquer. C'est pourquoi il y à ce caractère " _ " suivi du nombre de lignes à masquer.
En faisant ainsi tous est dans le nom de la cellule.
 

shf

XLDnaute Nouveau
Oui merci, entre temps j'ai compris, des fois j'ai le "cerveau-lent" 🤣
j'ai fait des testes en ajoutant des lignes et la case +&- et il faut juste bien faire attention de changer le numéro de ligne ainsi que le nombre de lignes 👍
 

Statistiques des forums

Discussions
312 803
Messages
2 092 257
Membres
105 318
dernier inscrit
alberic63