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 :

Activer/désactiver des groupes [XL-2007]


Sujet :

Macros et VBA Excel

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    480
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 480
    Points : 164
    Points
    164
    Par défaut Activer/désactiver des groupes
    Bonjour,

    J'ai deux feuilles, la premières contient des champs avec plusieurs groupes,

    Exemple :
    J'ai sur la Feuil1 plusieurs groupes:
    • 1er groupe de la ligne A5 à A18
    • 2ème groupe de la ligne A20 à A35
    • 3ème groupe de la ligne A 50 à A 80...


    La Feuil2 contient deux boutons, j'aimerais que lorsque j'appuie sur :
    • le bouton 1 : le 1er groupe de la Feuil1 soit non visible (équivaut à appuyer sur le bouton (-) du groupe)
    • le bouton 2 : le 2èmer groupe de la Feuil1 soit non visible (équivaut à appuyer sur le bouton (-) du groupe)
    • le bouton 3 : le 1er groupe de la Feuil1 soit visible (équivaut à appuyer sur le bouton (+) du groupe)
    • le bouton 4 : le 2èmer groupe de la Feuil1 soit visible (équivaut à appuyer sur le bouton (+) du groupe)
    • ...

    Tout ça en restant évidemment sur la feuil2 !

    Merci pour votre aide et un très bon week-end à vous :-)

  2. #2
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 898
    Points : 8 529
    Points
    8 529
    Par défaut
    Salut

    Essai comme ça
    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
    Option Explicit
     
    Sub test()
        'On demande à collapser le groupe1
        EtatGroupe 2, True
    End Sub
     
    Sub EtatGroupe(GroupeIndex As Integer, Optional CloseGroupe As Boolean = True)
    Dim aCell As Range
    Dim GroupeCells As Range
    Dim iGroupe As Integer
     
     
        'On recherche la plage de cellules demandée
        'On boucle sur les cellules de la colonne A
        With Feuil1
            For Each aCell In .Range("A4", .Cells(.Rows.Count, "A"))
                'Si la propriété OutlineLevel est à 1, on a affaire avec une tête de groupe
                If aCell.EntireRow.OutlineLevel = 1 Then
                    'On regarde si la cellule est vide
                    If aCell.Value = "" Then
                        'On est à la fin du tableau
                        'On quitte la boucle
                        Exit For
                    Else
                        '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 GroupeCells.EntireRow.Hidden = CloseGroupe
        End With
     
    End Sub
    Dans le code de chacun de tes boutons, il te suffit d'indiquer l'index du groupe sur lequel tu veux agir et ce que tu veut faire (afficher ou masquer les ligne).
    La sub Test est un exemple du code à placer dans tes boutons.

    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  3. #3
    Membre habitué
    Homme Profil pro
    Inscrit en
    Octobre 2009
    Messages
    380
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Octobre 2009
    Messages : 380
    Points : 134
    Points
    134
    Par défaut
    Bonjour et merci pour la réponse cela m'intéresse aussi :-)

    Mais je n'y arrive pas... voici en pièce jointe un exemple avec ton code...

    Merci d'avance pour la suite
    Fichiers attachés Fichiers attachés

  4. #4
    Membre habitué
    Homme Profil pro
    Inscrit en
    Octobre 2009
    Messages
    380
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Octobre 2009
    Messages : 380
    Points : 134
    Points
    134
    Par défaut
    J'ai aussi trouvé cette commande, mais cela smeble affecter toutes les lignes et colonnes...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Worksheets("Feuil1").Outline.ShowLevels RowLevels:=8, ColumnLevels:=8

  5. #5
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 898
    Points : 8 529
    Points
    8 529
    Par défaut
    Salut

    J'ai modifier la macro pour prendre en compte des ligne qui se suivent sans avoir de groupe à leur suite

    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
    Sub EtatGroupe(GroupeIndex As Integer, Optional CloseGroupe As Boolean = True)
    Dim aCell As Range
    Dim GroupeCells As Range
    Dim iGroupe As Integer
     
     
        'On recherche la plage de cellules demandée
        'On boucle sur les cellules de la colonne A
        With Feuil1
            For Each aCell In .Range("A3", .Cells(.Rows.Count, "A"))
                'Si la propriété OutlineLevel est à 1, on a affaire avec une tête de groupe
                'Des lignes au Level1 peuvent se suivre sans avoir de groupe à leur suite
                If aCell.EntireRow.OutlineLevel = 1 Then
                    'On regarde si la cellule est vide
                    If aCell.Value = "" Then
                        'On est à la fin du tableau
                        'On quitte la boucle
                        Exit For
                    ElseIf aCell.Offset(1).EntireRow.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 GroupeCells.EntireRow.Hidden = CloseGroupe
        End With
     
    End Sub
    Pour les boutons, tu dois écrire à la main les procédures dans un module, comme ça
    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
    Option Explicit
     
    Sub test()
        'On demande à collapser le groupe1
        EtatGroupe 2, False
    End Sub
     
    Sub DimGrp1H()
        'On demande à masquer le groupe1H
        EtatGroupe 1
     
    End Sub
     
    Sub DimGrp2H()
        'On demande à masquer le groupe1H
        EtatGroupe 2
     
    End Sub
     
    Sub AugGrp1H()
        'On demande à affiche le groupe1H
        EtatGroupe 1, False
     
    End Sub
     
    Sub ShowAll()
        'On affiche tous les groupes
        Feuil1.Cells.EntireRow.Hidden = False
    End Sub
    Puis ensuite dans Excel tu fais un clique-droit sur ton bouton et tu va sur Affecter une macro, tu sélectionnés alors la macro qui correspond à ce que doit faire ton bouton.

    Si j'ai bien compris, il faut modifier la macro pour qu'elle prenne aussi en compte les colonnes. D'où l'intérêt d'exposer la totalité de son problème, ça évite d'y revenir

    Pour ShowLevel c'est l'équivalent des boutons situés au dessus des groupes et repérés 1,2,3,...
    Donc ici ça ne t'aidera pas, mis à part pour tout afficher en faisant un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ShowLevel 
    RowLevels:=1, ColumnLevels:=1
    Ce qui devrait avoir le même effet que le code que j'ai placé dans ShowAll()

    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    480
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 480
    Points : 164
    Points
    164
    Par défaut
    Je vais tester après le souper...

    EDIT
    Cela fonctionne Nickel !!! Mais maintenant comment aussi agir sur les colonnes ?

    J'ai aussi essayé l'option juste après ce poste, mais cela ne fonctionne pas... soit c'est un problème pour nommer les plages, soit c'est la ligne de commande...

  7. #7
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 898
    Points : 8 529
    Points
    8 529
    Par défaut
    Citation Envoyé par Crachover Voir le message
    Je vais tester après le souper...

    Mais première question, comment nommer un groupe ?
    Bon app'

    A ma connaissance tu ne peux pas à moi que celui-ci soit une plage de cellule fixe. Si c'est le cas ça simplifie grandement puisqu'il s'agit uniquement de nommer des plages.
    Par exemple pour le fichier que tu as poster, il y aurait 4 plages à nommer dans Excel (Menu "Formules", "Gestionnaire de noms")
    Groupe1H =>4:9
    Groupe2H =>13:20
    Groupe1V => C
    GRoupe2V => G:H

    Il suffit ensuite de dire en VBA, en gros
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Feuil1.range("GRoupe1H").Hidden = true / False
    Feuil1.range("Groupe2H").Hidden = True / False
    '...
    Mais ceci n'est possible que si tes plages sont fixes.

    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  8. #8
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 898
    Points : 8 529
    Points
    8 529
    Par défaut
    Salut

    Un proposition dans ce fichier. Par contre il faut des entêtes à ton tableau car les cellules vides posent problèmes.
    Idem la colonne a ne doit pas avoir de cellule vide en cours de route...
    On aurait pu chercher le dernière ligne non vide mais ça n'est pas possible de le faire avec Range.End car End ne tient pas compte des lignes et colonnes masquées. Du coup lorsque les derniers groupes sont masqués les lignes qu'ils contiennent ne sont pas prise en compte...

    ++
    Qwaz
    Fichiers attachés Fichiers attachés

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    480
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 480
    Points : 164
    Points
    164
    Par défaut
    Merci pour la solution et le fichier modifié :-)

    Mais j'ai un problème avec le fait de devoir mettre des entêtes et qu'il ne peut y avoir de cellules vident dans la colonne A...

    Mon fichier devrait rester fixe, donc la solution de renommer les plages me semble super intéressante, mais je n'y arrive pas... serait-il possible d'avoir un exemple ?

    Bonne journée à vous

  10. #10
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 898
    Points : 8 529
    Points
    8 529
    Par défaut
    Salut

    Essai en remplaçant cette procédure

    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
    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
    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  11. #11
    Membre habitué
    Homme Profil pro
    Inscrit en
    Octobre 2009
    Messages
    380
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Octobre 2009
    Messages : 380
    Points : 134
    Points
    134
    Par défaut
    Je viens de tester et chez moi TOUT fonctionne très bien sans entêtes et même si il manque des valeurs dans la colonne A, donc c'est super cool

    J'ai cependant trouvé un bug... le code pour afficher un groupe de colonnes ne fonctionne pas si il manque une valeur à un champ de la première ligne utilisées

  12. #12
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 898
    Points : 8 529
    Points
    8 529
    Par défaut
    Salut

    Peux-tu me montrer un exemple de structure qui plante stp, je n'arrive pas à reproduire ce que tu expliques.

    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  13. #13
    Membre habitué
    Homme Profil pro
    Inscrit en
    Octobre 2009
    Messages
    380
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Octobre 2009
    Messages : 380
    Points : 134
    Points
    134
    Par défaut
    Bonjour,

    Pas de problème voici le fichier.

    Les commandes sont sur l'onglet (Feuil2).

    Exemple:
    Si la cellule (ROUGE) est vide, la commande (Augmenter le groupe 2V.) ne fonctionne plus ? Et c'est le seul ? Je peux effacer le contenu de la cellule (BLEU) et cela fonctionne très bien ?

    Bonne journée.
    Fichiers attachés Fichiers attachés

  14. #14
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 898
    Points : 8 529
    Points
    8 529
    Par défaut
    Salut

    Alors on va changer notre carotte d'épaule.

    Essai avec ce code
    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
    Sub EtatGroupe(GroupeIndex As Integer, Optional RowGroupe As Boolean = True, Optional CloseGroupe As Boolean = True)
    Dim aRow As Range, aCol As Range
    Dim rgPlage 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 boucle sur les lignes de la zone UsedRange
                For Each aRow In .UsedRange.EntireRow
                    If aRow.OutlineLevel > 1 Then
                        'On ajoute cette celllule
                        If rgPlage Is Nothing Then
                            Set rgPlage = aRow
                        Else
                            Set rgPlage = Union(rgPlage, aRow)
                        End If
                    End If
                Next
            Else
                'On boucle sur l'intégralité des colonnes de la zone UsedRange
                For Each aCol In .UsedRange.EntireColumn
                    If aCol.OutlineLevel > 1 Then
                        'On ajoute cette celllule
                        If rgPlage Is Nothing Then
                            Set rgPlage = aCol
                        Else
                            Set rgPlage = Union(rgPlage, aCol)
                        End If
                    End If
                Next
     
            End If
     
            If Not rgPlage Is Nothing Then
                'Les areas disponibles dans rgPlage représentent chaqu'un des groupes, il suffit alors de masquer/afficher le groupe en questio,n
                'On vérifie que l'index existe dans les aeras e la plage
                If GroupeIndex <= rgPlage.Areas.Count Then
                    If RowGroupe Then
                        rgPlage.Areas(GroupeIndex).EntireRow.Hidden = CloseGroupe
                    Else
                        rgPlage.Areas(GroupeIndex).EntireColumn.Hidden = CloseGroupe
                    End If
                End If
            End If
     
        End With
     
    End Sub
    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  15. #15
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    480
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 480
    Points : 164
    Points
    164
    Par défaut
    Cela fonctionne très bien chez moi
    Merci

  16. #16
    Membre habitué
    Homme Profil pro
    Inscrit en
    Octobre 2009
    Messages
    380
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Octobre 2009
    Messages : 380
    Points : 134
    Points
    134
    Par défaut
    Bonjour,

    Mon fichier test fonctionne aussi très bien chez moi, mais maintenant que je veux l'utiliser sur mon bon fichier cela ne fonctionne plus ???

    L'idée c'est que si la cellule contient le mot "Fermée", cela diminue le groupe...

    NB : Je n'arrive pas non plus à gérer plusieurs feuilles avec des groupes..

    Exemple
    • L'onglet [Ecran Smartphone] est contrôlé via les boutons se trouvant sur l'onglet [Boutons Ecran SmartPhone]
    • L'onglet [Ecran TV] est contrôlé via les boutons se trouvant sur l'onglet [Boutons Ecran TV]
    Fichiers attachés Fichiers attachés

  17. #17
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    480
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 480
    Points : 164
    Points
    164
    Par défaut
    Chez moi, cela fonctionne ?...

    CrasherSEP : Tu ne dois pas oublier de changer dans le code de Qwazerty le nom de le feuille à utiliser ! exemple Feuil1 -> Feuil 3... et aussi changer le nom de la commande 'EtatGroupe' en 'EtatGroupe2' par exemple pour l'autre feuille.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub EtatGroupe(GroupeIndex As Integer, Optional RowGroupe As Boolean = True, Optional CloseGroupe As Boolean = True)
    Dim aRow As Range, aCol As Range
    Dim rgPlage As Range
     
        'On recherche la plage de cellules demandée
        'On boucle sur les cellules de la colonne A
        With Feuil1
    ...

  18. #18
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 898
    Points : 8 529
    Points
    8 529
    Par défaut
    Salut

    [Edit]
    Oula ça fait trop de Crach pour moi, pour ton fichier CracherSEP, la logique est complètement différente me semble-t-il, il faut tenir compte du contenu d'un cellule mais comment tu l'identifies?

    Peut-on partir du principe que chaque groupe contient toujours 5 lignes (4 grises et une blanche) et que la deuxième ligne (colonne B) contient OK ou fermée ?

    Si oui voila deux propositions (la 1ère est à mon sens la meilleur car elle est beaucoup moins sensible à des modification de nom de feuille par l'utilisateur.
    Dans les deux cas, si tu n'utilises pas les groupe sur la feuille, tu peux les supprimer.

    Solution 1
    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
    Option Explicit
    Sub CODES_GROUPE(FeuilAction As Worksheet)
    Dim lgRow As Long
     
    'On pointe la feuille Smartphone
    With FeuilAction
        'On boucle sur les cellules de la colonne A, 5 cellules par 5 cellules
        For lgRow = 4 To .Cells(.Rows.Count, "A").End(xlUp).Row Step 5
            'On controle la cellule de la ligne suivante en colonne B
            If .Cells(lgrow + 1, "B").Value = "Fermée" Then
                'On masque les feuilles de cette section
                .Range(.Rows(lgRow), .Rows(lgRow + 4)).EntireRow.Hidden = True
            Else
                'On affiche cette section (mais visiblement tu n'en as pas besoin)
                .Range(.Rows(lgRow), .Rows(lgRow + 4)).EntireRow.Hidden = False
            End If
        Next
    End With
     
    End Sub
     
    Sub CodeBoutonSmartphone()
        CODES_GROUPE Feuil45
    End Sub

    Solution 2
    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
    'Il faut renommer tes boutons en leur donnant le nom de la feuille sur laquelle tu veux agir/
    'Par exemple la bouton sur la feuille Boutons Ecran SmartPhone tu le nommes "Ecran Smartphone" (au lieu de "Rectangle1"
    'Par contre attention si quelqu'un change le nom des feuilles, ça ne fonctionne plus
    Sub CODES_GROUPE2()
    Dim lgRow As Long, FeuilAction As Worksheet
     
        On Error Resume Next
        Set FeuilAction = ThisWorkbook.Sheets(Application.Caller)
        On Error GoTo 0
     
        If Not FeuilAction Is Nothing Then
     
            'On pointe la feuille Smartphone
            With FeuilAction
                'On boucle sur les cellules de la colonne A, 5 cellules par 5 cellules
                For lgRow = 4 To .Cells(.Rows.Count, "A").End(xlUp).Row Step 5
                    'On controle la cellule de la ligne suivante en colonne B
                    If .Cells(lgRow + 1, "B").Value = "Fermée" Then
                        'On masque les feuilles de cette section
                        .Range(.Rows(lgRow), .Rows(lgRow + 4)).EntireRow.Hidden = True
                    Else
                        'On affiche cette section (mais visiblement tu n'en as pas besoin)
                        .Range(.Rows(lgRow), .Rows(lgRow + 4)).EntireRow.Hidden = False
                    End If
                Next
            End With
        End If
     
    End Sub


    [/Edit]

    Pour rendre la feuille variable, il suffit de rajouter un paramètre

    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
    Sub EtatGroupe(FeuilGroupe As Worksheet, GroupeIndex As Integer, Optional RowGroupe As Boolean = True, Optional CloseGroupe As Boolean = True)
    Dim aRow As range, aCol As range
    Dim rgPlage As range
     
        'On recherche la plage de cellules demandée
        'On boucle sur les cellules de la colonne A
        With FeuilGroupe
            'Si on travaille sur les groupes de ligne
            If RowGroupe Then
                'On boucle sur les lignes de la zone UsedRange
                For Each aRow In .UsedRange.EntireRow
                    If aRow.OutlineLevel > 1 Then
                        'On ajoute cette celllule
                        If rgPlage Is Nothing Then
                            Set rgPlage = aRow
                        Else
                            Set rgPlage = Union(rgPlage, aRow)
                        End If
                    End If
                Next
            Else
                'On boucle sur l'intégralité des colonnes de la zone UsedRange
                For Each aCol In .UsedRange.EntireColumn
                    If aCol.OutlineLevel > 1 Then
                        'On ajoute cette celllule
                        If rgPlage Is Nothing Then
                            Set rgPlage = aCol
                        Else
                            Set rgPlage = Union(rgPlage, aCol)
                        End If
                    End If
                Next
     
            End If
     
            If Not rgPlage Is Nothing Then
                'Les areas disponibles dans rgPlage représentent chaqu'un des groupes, il suffit alors de masquer/afficher le groupe en questio,n
                'On vérifie que l'index existe dans les aeras e la plage
                If GroupeIndex <= rgPlage.Areas.Count Then
                    If RowGroupe Then
                        rgPlage.Areas(GroupeIndex).EntireRow.Hidden = CloseGroupe
                    Else
                        rgPlage.Areas(GroupeIndex).EntireColumn.Hidden = CloseGroupe
                    End If
                End If
            End If
     
        End With
     
    End Sub
    Il faut dans le code du bouton préciser la feuille sur laquelle tu veux effectuer l'action.

    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  19. #19
    Candidat au Club
    Homme Profil pro
    Naturopathe
    Inscrit en
    Juillet 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Naturopathe
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2018
    Messages : 4
    Points : 4
    Points
    4
    Par défaut
    La version excel utilisée joue-t-elle sur le code ci dessus ?

    Fabio,

  20. #20
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    480
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 480
    Points : 164
    Points
    164
    Par défaut
    Bonjour,

    Le code fonctionne chez sur Office97, Office2013 et 2016.

    Bonne soirée

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Activer/désactiver des fonctionnalités
    Par pdfmaker dans le forum Général Java
    Réponses: 3
    Dernier message: 10/06/2009, 11h33
  2. Activer/désactiver des fonctionnalités
    Par pdfmaker dans le forum Architecture
    Réponses: 1
    Dernier message: 28/03/2009, 13h53
  3. Activation - désactivation des macros
    Par olivepao dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 10/07/2008, 12h55
  4. Activer / désactiver des périphériques
    Par adage2000 dans le forum MFC
    Réponses: 3
    Dernier message: 28/04/2005, 16h51

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