1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
| Sub EtatGroupe(GroupeIndex As Integer, Optional RowGroupe As Boolean = True, Optional CloseGroupe As Boolean = True)
Dim aCell As Range
Dim GroupeCells As Range
Dim iGroupe As Integer
Dim rgPlage As Range, rgFull As Range
Dim rgNext As Range
'On recherche la plage de cellules demandée
'On boucle sur les cellules de la colonne A
With Feuil1
'Si on travaille sur les groupes de ligne
If RowGroupe Then
'On pointe les cellules de la colonne A à partir de A3
Set rgPlage = .Range("A3", .Cells(.Rows.Count, "A").End(xlUp))
'On corrige ensuite pour prendre les cellules suivantes qui seraient masquées
'On boucle de la cellule suivante de rgPlage à la dernière cellule de la colonne A
For Each aCell In .Range(.Cells(.Rows.Count, "A").End(xlUp).Offset(1), .Cells(.Rows.Count, "A"))
'Si la ligne est masquée
If aCell.EntireRow.Hidden Then
'C'est un groupe masqué, on l'inclu dans la plage
Set rgPlage = Union(rgPlage, aCell)
Else
'C'est la fin du tableau, on quitte la boucle
Exit For
End If
Next
Else
'On prend la 1ère ligne et on cherche la plage complète
Set rgPlage = .Range("A3", .Cells(3, .Columns.Count).End(xlToLeft))
'On corrige en prennant en compte les colonne masquées qui suivraient
For Each aCell In .Range(.Cells(3, .Columns.Count).End(xlToLeft).Offset(, 1), .Cells(3, .Columns.Count))
'On regarde si la colonne est masquée
If aCell.EntireColumn.Hidden Then
'Elle fait partie d'un groupe actuellement masqué
Set rgPlage = Union(rgPlage, aCell)
Else
'On est à la fin du tableau, on quitte la boucle
Exit For
End If
Next
End If
'On boucle sur les cellule contenu dans rgPlage
For Each aCell In rgPlage
'On défini si on doit travailler sur les lignes ou les colonnes complètes
If RowGroupe Then
Set rgFull = aCell.EntireRow
Set rgNext = aCell.Offset(1).EntireRow
Else
Set rgFull = aCell.EntireColumn
Set rgNext = aCell.Offset(, 1).EntireColumn
End If
'Si la propriété OutlineLevel est à 1, on a affaire avec une tête de groupe
'Des lignes/colonnes au Level1 peuvent se suivres sans avoir de groupe à leur suite
'On vérifie donc qu'une ligne/colonne ayant un OutlineLevel à 2 suis la ligne/colonne pointé par rgFull
If (rgFull.OutlineLevel = 1) Then
If (rgNext.OutlineLevel = 2) Then
'On incrémente le groupe actif
iGroupe = iGroupe + 1
End If
Else
'On est sur des cellule contenu dans un groupe
'Si le bon groupe est pointé par iGroupe et que GroupeCells n'est pas défini on pointe cette cellule comme étant la 1ère du groupe
If iGroupe = GroupeIndex Then
If GroupeCells Is Nothing Then
Set GroupeCells = aCell
Else
'c'est une autre cellule qui fait partie du groupe
'On l'ajoute à la plage
Set GroupeCells = Union(GroupeCells, aCell)
End If
ElseIf iGroupe > GroupeIndex Then
'On est arrivé au bout de la plage pointé par ce groupe
'On sort de la boucle
Exit For
End If
End If
Next
'On effectue l'action demandée
If Not GroupeCells Is Nothing Then
If RowGroupe Then
GroupeCells.EntireRow.Hidden = CloseGroupe
Else
GroupeCells.EntireColumn.Hidden = CloseGroupe
End If
End If
End With
End Sub |
Partager