IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Tester si une ligne appartient à un groupe


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 1
    Par défaut 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

  2. #2
    Membre éprouvé Avatar de LouiMz
    Homme Profil pro
    Inscrit en
    Février 2010
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 104
    Par défaut
    Bonjour Nico,

    As-tu essayé avec la propriété hidden?

    Alors certes cela ne résout pas le test sur les groupes, mais te permet de le contourner en masquant les cellules.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    If Rows("1").Hidden = True Then
     
    MsgBox "lol"
     
    Else
     
    Msgbox "pas lol"
     
    End if
    Ludo

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 141
    Par défaut 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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

    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 : Sélectionner tout - Visualiser dans une fenêtre à part
     ? IsInGroupByRow(Range("A1"))
    True

    Condensons [Collapse] le groupe, c-a-d réduisons le plan.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     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 : Sélectionner tout - Visualiser dans une fenêtre à part
     ? IsGrouped(Range("A1"))
    True

    Etendons [Expand] le groupe, c-a-d développons le plan.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     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 : Sélectionner tout - Visualiser dans une fenêtre à part
     ? IsGrouped(Cells(1,1))
    False

    Remettons la feuille de calcul dans son état initial sans groupe.
    Groupons-nous, camarades

    Dans cette session dans la fenêtre d'Exécution immédiate du VBE, on teste les fonctions par colonne.

    La première cellule est-elle dans un groupe de colonne ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     ? IsInGroupByCol(cells(1,1))
    True

    Quel est le niveau maximum de détail des plans [outline level] par colonne de la feuille ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     ? OutlineLevelByCol(ActiveSheet)
    2
    Soit un niveau de détail de plus que le niveau par défaut 1.

    Créons un sous-niveau imbriqué dans le groupe précédent.
    Le niveau maximum de détail des plans [outline level] par colonne est incrémenté.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     ? OutlineLevelByCol(ActiveSheet)
    3

    Condensons [Collapse] le groupe. Réduire ce plan, c'est cacher ses colonnes.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     OutlineCollapse Columns("A:C"), False
    La première cellule est-elle groupée ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     ? IsGrouped(Cells(1,1))
    True

    Etendons [Expand] le groupe, autrement dit développons le plan. Réaffichons ses colonnes.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     OutlineExpand Columns("A:C"), False
    La première cellule n'est plus groupée.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     ? IsGrouped(Range("A1"))
    False

    Dégroupage massif

    Remettons la feuille de calcul dans son état initial sans groupe.
    Il faut dégrouper chaque groupe imbriqué.

    Quel est le niveau maximum de détail des plans [outline level] par colonne de la feuille ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     ? OutlineLevelByCol(ActiveSheet)
    1
    C'est le niveau par défaut quand il n'y a pas de groupes.
    ___________

    Si la discussion est résolue, vous pouvez cliquer sur le bouton

    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 ci-dessous.

Discussions similaires

  1. Tester si une ligne appartiens à un groupe
    Par mazuno dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 29/07/2011, 17h20
  2. Réponses: 3
    Dernier message: 22/06/2010, 18h46
  3. Comment tester qu'une ligne d'un Msflexgrid est vide
    Par bahboubacar2 dans le forum VB 6 et antérieur
    Réponses: 0
    Dernier message: 27/03/2010, 12h36
  4. Identifier une ligne Excel en groupe ou sous-groupe
    Par gilles06 dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 09/01/2008, 17h57
  5. Réponses: 27
    Dernier message: 30/03/2005, 23h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo