Tester si une ligne appartient à un groupe
Salut :)
Ce sujet est résolu mais ça m'intéresserait beaucoup de savoir si c'est possible de récupérer le booléen comme mentionné dans le post initial.
Car en fonction du retour le traitement à faire serait différent pour moi.
Mais il y a peut-être un autre contournement :)
Cordialement,
Nico
Excel VBA : une cellule est-elle groupée ?
Hello iluron,
Voici une courte fonction pour savoir si une cellule est actuellement groupée, autrement dit cachée et appartenant à un groupe.
VBE menu "Insérer" > "Module"
Copier-coller le code suivant :
Code:
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
| Option Explicit
Function IsGrouped(ByVal rngQuery As Range) As Boolean
IsGrouped = (rngQuery.EntireRow.Hidden And IsInGroupByRow(rngQuery)) Or _
(rngQuery.EntireColumn.Hidden And IsInGroupByCol(rngQuery))
End Function
Function IsInGroupByRow(ByVal rngQuery As Range) As Boolean
IsInGroupByRow = rngQuery.EntireRow.outlineLevel > 1
End Function
Function IsInGroupByCol(ByVal rngQuery As Range) As Boolean
IsInGroupByCol = rngQuery.EntireColumn.outlineLevel > 1
End Function
' Excel menu "Data" > "Group and Outline" > "Hide Detail"
Sub OutlineCollapse(ByVal rngQuery As Range, ByVal isByRow As Boolean)
Outliner rngQuery, isByRow, False
End Sub
' Excel menu "Data" > "Group and Outline" > "Show Detail"
Sub OutlineExpand(ByVal rngQuery As Range, ByVal isByRow As Boolean)
Outliner rngQuery, isByRow, True
End Sub
Sub Outliner(ByVal rngQuery As Range, ByVal isByRow As Boolean, ByVal isCollapse As Boolean)
Const typeByRow = 1, typeByCol = 2, sep = ","
Dim indType As Byte, indStart As String, indEnd As String
If isByRow Then
indType = typeByRow
indStart = rngQuery.Row - 1
indEnd = rngQuery.Row + rngQuery.Rows.Count - 1
Else
indType = typeByCol
indStart = rngQuery.Column - 1
indEnd = rngQuery.Column + rngQuery.Columns.Count - 1
End If
ExecuteExcel4Macro "SHOW.DETAIL(" & indType & sep & indEnd & sep & _
isCollapse & sep & indStart & ")"
End Sub
' Get the maximum of outline level between 1 and 255 by row even if groups are collapsed
Function OutlineLevelByRow(ByVal wsh As Worksheet) As Byte
Const nbrLevelMax = 255
Dim strAddress As String, indLevel As Byte, outlineLevel As Byte
Application.ScreenUpdating = False
outlineLevel = 0 ' Beyond nbrLevelMax nested outline levels
With wsh
strAddress = .Rows.SpecialCells(xlCellTypeVisible).Address
For indLevel = 1 To nbrLevelMax
.Outline.ShowLevels RowLevels:=indLevel
If .Rows.SpecialCells(xlCellTypeVisible).Address = strAddress Then
outlineLevel = indLevel
Exit For
End If
Next
End With
Application.ScreenUpdating = True
OutlineLevelByRow = outlineLevel
End Function
' Get the maximum of outline level between 1 and 255 by column even if groups are collapsed
Function OutlineLevelByCol(ByVal wsh As Worksheet) As Byte
Const nbrLevelMax = 255
Dim strAddress As String, indLevel As Byte, outlineLevel As Byte
Application.ScreenUpdating = False
outlineLevel = 0 ' Beyond nbrLevelMax nested outline levels
With wsh
strAddress = .Columns.SpecialCells(xlCellTypeVisible).Address
For indLevel = 1 To nbrLevelMax
.Outline.ShowLevels ColumnLevels:=indLevel
If .Columns.SpecialCells(xlCellTypeVisible).Address = strAddress Then
outlineLevel = indLevel
Exit For
End If
Next
End With
Application.ScreenUpdating = True
OutlineLevelByCol = outlineLevel
End Function |
On a également donné les procédures pour condenser / étendre un groupe autrement dit réduire / développer un plan.
Optimisable est la recherche itérative du niveau maximum d'outline level que l'on peut sélectionner en cliquant sur les symboles de plan en zone 1 : c-a-d des chiffres dans des petits carrés en marge de la feuille de calcul présentant des groupes imbriqués. On a considéré qu'il ne serait guère raisonnable d'avoir un plan à plus de 255 niveaux imbriqués de détail...
Usage et test
Arranger la fenêtre du VBE pour qu'elle ne se superpose pas sur les premières rangées et colonnes de la feuille de calcul vide en arrière plan.
Sur un écran large, juxtaposer les fenêtres d'Excel et du VBE.
Dans la fenêtre d'Exécution immédiate (Ctlr+G) du VBE, copier-coller et valider par ENTER chaque appel de procédure ou méthode.
Se faire un plan à deux :oops:
Groupons [Group] les deux premières rangées, c-a-d créons un plan en rangée.
C'est l'équivalent à sélectionner les deux premières rangées.
Excel menu "Données" > "Grouper et créer un plan" > "Grouper"
La première cellule est-elle dans un groupe de rangée ?
Code:
? IsInGroupByRow(Range("A1"))
True
Condensons [Collapse] le groupe, c-a-d réduisons le plan.
Code:
OutlineCollapse Rows("1:2"), True
C'est équivalent de sélectionner les deux premières rangées.
Excel menu "Données" > "Grouper et créer un plan" > "Masquer"
On aurait pu également cliquer sur le symbole de plan "-" dans la marge en zone 5.
La première cellule est-elle groupée ?
Code:
? IsGrouped(Range("A1"))
True :ccool:
Etendons [Expand] le groupe, c-a-d développons le plan.
Code:
OutlineExpand Rows("1:2"), True
C'est l'équivalent à sélectionner les deux premières rangées.
Excel menu "Données" > "Grouper et créer un plan" > "Afficher"
On aurait pu également cliquer sur le symbole de plan "+" dans la marge.
La première cellule n'est plus groupée.
Code:
? IsGrouped(Cells(1,1))
False :calim2:
Remettons la feuille de calcul dans son état initial sans groupe.
Code:
Rows("1:2").UnGroup
Groupons-nous, camarades
Dans cette session dans la fenêtre d'Exécution immédiate du VBE, on teste les fonctions par colonne.
Code:
Columns("A:F").Group
La première cellule est-elle dans un groupe de colonne ?
Code:
? IsInGroupByCol(cells(1,1))
True
Quel est le niveau maximum de détail des plans [outline level] par colonne de la feuille ? :koi:
Code:
? OutlineLevelByCol(ActiveSheet)
2
Soit un niveau de détail de plus que le niveau par défaut 1. 8-)
Créons un sous-niveau imbriqué 8O dans le groupe précédent.
Code:
Columns("A:C").Group
Le niveau maximum de détail des plans [outline level] par colonne est incrémenté. :P
Code:
? OutlineLevelByCol(ActiveSheet)
3
Condensons [Collapse] le groupe. Réduire ce plan, c'est cacher ses colonnes.
Code:
OutlineCollapse Columns("A:C"), False
La première cellule est-elle groupée ?
Code:
? IsGrouped(Cells(1,1))
True :ccool:
Etendons [Expand] le groupe, autrement dit développons le plan. Réaffichons ses colonnes.
Code:
OutlineExpand Columns("A:C"), False
La première cellule n'est plus groupée.
Code:
? IsGrouped(Range("A1"))
False :calim2:
Dégroupage massif :cry:
Remettons la feuille de calcul dans son état initial sans groupe.
Code:
Columns("A:C").UnGroup
Il faut dégrouper chaque groupe imbriqué.
Code:
Columns("A:F").UnGroup
Quel est le niveau maximum de détail des plans [outline level] par colonne de la feuille ?
Code:
? OutlineLevelByCol(ActiveSheet)
1
C'est le niveau par défaut quand il n'y a pas de groupes. :zen:
___________
Si la discussion est résolue, vous pouvez cliquer sur le bouton :resolu:
En bas de ce message s'il vous a apporté des éléments de réponse pertinents, pensez également à voter en cliquant sur le bouton vert http://www.developpez.net/forums/ima.../vote1left.gif ci-dessous.