XL 2010 Cacher les checkbox puis les colonnes avec bouton

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Orson83

XLDnaute Impliqué
Bonjour à tous,
Quelquefois une série de CheckBox ne se masque pas avec le masquage de colonnes. Pour éviter cela, je souhaiterai (peut-être à tort ?) associer le masquage des CheckBox avec le masquage des colonnes -> pour que le masquage des CheckBox intervienne avant le masquage des colonnes (pour éviter l'erreur d'affichage).
J'ai fait une macro qui fonctionne mais je ne parviens pas à grouper les CheckBox car j'en ai 24. Avez-vous une solution à me proposer ?
Je joins un fichier exemple dans ce post.
Merci pour votre aide.
 

Pièces jointes

Solution
Bonsoir à tous,
Pour garder la philosophie du code et de la conception :

VB:
'AFFICHER LE MENU
Sub AfficheMenu()
    Dim Elem As OLEObject
    With ActiveSheet
        For Each Elem In .OLEObjects
            Elem.Visible = TypeName(Elem.Object) = "CheckBox"
        Next
        .Range("J:M").EntireColumn.Hidden = False
        Application.Goto .Range("A1"), Scroll:=True
    End With
End Sub
'MASQUER LE MENU
Sub MasqueMenu()
    Dim Elem As OLEObject
    With ActiveSheet
        For Each Elem In .OLEObjects
            Elem.Visible = TypeName(Elem.Object) <> "CheckBox"
        Next
        .Range("J:M").EntireColumn.Hidden = True
        Application.Goto .Range("A1"), Scroll:=True
    End With
End Sub

J'aurai plutôt opté pour une...
Bonjour Tchotchodu,
Plutôt que d'utiliser de multiples CheckBox je vous propose d'utiliser la macro Worksheet_SelectionChange, ce qui réduit sensiblement le code car toutes les feuilles sont traitées au même endroit :
VB:
' AFFICHER / MASQUER FEUILLE
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
On Error GoTo Fin
    If Target.Count > 1 Then Exit Sub
    If Not Intersect(Target, Range("K4:K14")) Is Nothing Then
    Dim NomFeuille$
        Application.ScreenUpdating = False
        NomFeuille = Split(Target, " ")(0)
        If Split(Target, " ")(1) = "démasquée" Then
            Sheets(NomFeuille).Visible = False
            Target = NomFeuille & " masquée ( cliquer pour inverser )"
        Else
            Sheets(NomFeuille).Visible = True
            Target = NomFeuille & " démasquée ( cliquer pour inverser )"
        End If
        Cells(Target.Row, Target.Column - 1).Select
    End If
Fin:
End Sub
'AFFICHER LE MENU
Sub AfficheMenu()
    Sheets("Accueil ").Range("J:M").EntireColumn.Hidden = False
End Sub
'MASQUER LE MENU
Sub MasqueMenu()
    Sheets("Accueil ").Range("J:M").EntireColumn.Hidden = True
End Sub
Un clic sur une cellule K4:K14 masque ou démasque la feuille considérée.
 

Pièces jointes

Bonjour Tchotchodu,
Plutôt que d'utiliser de multiples CheckBox je vous propose d'utiliser la macro Worksheet_SelectionChange, ce qui réduit sensiblement le code car toutes les feuilles sont traitées au même endroit :
VB:
' AFFICHER / MASQUER FEUILLE
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
On Error GoTo Fin
    If Target.Count > 1 Then Exit Sub
    If Not Intersect(Target, Range("K4:K14")) Is Nothing Then
    Dim NomFeuille$
        Application.ScreenUpdating = False
        NomFeuille = Split(Target, " ")(0)
        If Split(Target, " ")(1) = "démasquée" Then
            Sheets(NomFeuille).Visible = False
            Target = NomFeuille & " masquée ( cliquer pour inverser )"
        Else
            Sheets(NomFeuille).Visible = True
            Target = NomFeuille & " démasquée ( cliquer pour inverser )"
        End If
        Cells(Target.Row, Target.Column - 1).Select
    End If
Fin:
End Sub
'AFFICHER LE MENU
Sub AfficheMenu()
    Sheets("Accueil ").Range("J:M").EntireColumn.Hidden = False
End Sub
'MASQUER LE MENU
Sub MasqueMenu()
    Sheets("Accueil ").Range("J:M").EntireColumn.Hidden = True
End Sub
Un clic sur une cellule K4:K14 masque ou démasque la feuille considérée.
Bonjour sylvanu, le forum,
C'est une proposition très sympa qui n'utilise pas les cases à cocher. Bravo !
Mais moi j'aime bien mes cases à cocher 🙂 car je trouve que la coche est plus intuitive pour voir l'état, du style "Voir" ou "Cacher". Je sais qu'Excel n'aime pas trop les objets surtout quand ils sont cachés avec des lignes ou des colonnes. C'est pourquoi je pesais laisser les cases en mode "Ne pas déplacer ou dimensionner avec les cellules" et agir sur l'objet Visible/Invisible pour régler ce problème.
 
Bonsoir à tous,
Pour garder la philosophie du code et de la conception :

VB:
'AFFICHER LE MENU
Sub AfficheMenu()
    Dim Elem As OLEObject
    With ActiveSheet
        For Each Elem In .OLEObjects
            Elem.Visible = TypeName(Elem.Object) = "CheckBox"
        Next
        .Range("J:M").EntireColumn.Hidden = False
        Application.Goto .Range("A1"), Scroll:=True
    End With
End Sub
'MASQUER LE MENU
Sub MasqueMenu()
    Dim Elem As OLEObject
    With ActiveSheet
        For Each Elem In .OLEObjects
            Elem.Visible = TypeName(Elem.Object) <> "CheckBox"
        Next
        .Range("J:M").EntireColumn.Hidden = True
        Application.Goto .Range("A1"), Scroll:=True
    End With
End Sub

J'aurai plutôt opté pour une listbox avec cases à cocher pour manipuler les feuilles ..
 
Bonsoir le fil

Une piste possible avec un module de classe
qui permet d'avoir que ce seul code pour tous les CheckBox de la feuille.
VB:
Option Explicit
Public WithEvents CheckBoxGroup As MSForms.CheckBox
Private Sub CheckBoxGroup_Click()
Sheets(CheckBoxGroup.TopLeftCell.Offset(, 1).Value2).Visible = CheckBoxGroup.Value
End Sub
NB: A condition, que dans la colonne K, les noms des feuilles sont rigoureusement identiques aux noms des onglets.
PS: Test OK avec le fichier exemple sur mon PC.

Intéressé ou pas ? (je développe la chose ou pas ?)
 
Bonsoir à tous,
Pour garder la philosophie du code et de la conception :

VB:
'AFFICHER LE MENU
Sub AfficheMenu()
    Dim Elem As OLEObject
    With ActiveSheet
        For Each Elem In .OLEObjects
            Elem.Visible = TypeName(Elem.Object) = "CheckBox"
        Next
        .Range("J:M").EntireColumn.Hidden = False
        Application.Goto .Range("A1"), Scroll:=True
    End With
End Sub
'MASQUER LE MENU
Sub MasqueMenu()
    Dim Elem As OLEObject
    With ActiveSheet
        For Each Elem In .OLEObjects
            Elem.Visible = TypeName(Elem.Object) <> "CheckBox"
        Next
        .Range("J:M").EntireColumn.Hidden = True
        Application.Goto .Range("A1"), Scroll:=True
    End With
End Sub

J'aurai plutôt opté pour une listbox avec cases à cocher pour manipuler les feuilles ..
Bonsoir fanch55, le forum,
Super, c'est exactement ce que je souhaitais.
Entre temps j'ai trouvé un code qui ressemble beaucoup à votre proposition.
Quel est votre avis ? Bien entendu, je garderai le code qui est le plus adapté.
VB:
'AFFICHER LE MENU
Sub AfficheMenu()
Dim Obj As OLEObject
    With ActiveSheet
        .Range("J:M").EntireColumn.Hidden = False
        Application.Goto .Range("A1"), Scroll:=True 'boucle sur les objets de la Feuil1           
    For Each Obj In Feuil1.OLEObjects 'verifie s'il s'agit d'un Checkbox
    If TypeOf Obj.Object Is MSForms.CheckBox Then
    .OLEObjects.Visible = True
    End If
    Next Obj
    End With
End Sub

'MASQUE LE MENU
Sub MasqueMenu()
Dim Obj As OLEObject
    With ActiveSheet           
    For Each Obj In Feuil1.OLEObjects 'boucle sur les objets de la Feuil1   
    If TypeOf Obj.Object Is MSForms.CheckBox Then 'verifie s'il s'agit d'un Checkbox
    .OLEObjects.Visible = False
    End If
    Next Obj
        .Range("J:M").EntireColumn.Hidden = True
        Application.Goto .Range("A1")
    End With
End Sub
 
Re

=>Tchotchodu31
le demandeur à dit:
Quel est votre avis ?
Je te retourne la question.
Je détaille plus avant mon exemple avec module de classe ou pas?
Comme je le disais avec celui-ci, tout le code présent dans la feuille 1 peut être remplacé par cette simple procédure
Option Explicit
Public WithEvents CheckBoxGroup As MSForms.CheckBox
Private Sub CheckBoxGroup_Click()
Sheets(CheckBoxGroup.TopLeftCell.Offset(, 1).Value2).Visible = CheckBoxGroup.Value
End Sub
qui gère tous les clicks de tous les Checkbox de la feuille où sont les CheckBox.
J'aimerais donc avoir ton avis pour savoir quoi faire avec ce que j'ai testé dans ton fichier exemple.
 
Bonsoir fanch55, le forum,
Super, c'est exactement ce que je souhaitais.
Entre temps j'ai trouvé un code qui ressemble beaucoup à votre proposition.
Quel est votre avis ? Bien entendu, je garderai le code qui est le plus adapté.
VB:
'AFFICHER LE MENU
Sub AfficheMenu()
Dim Obj As OLEObject
    With ActiveSheet
        .Range("J:M").EntireColumn.Hidden = False
        Application.Goto .Range("A1"), Scroll:=True 'boucle sur les objets de la Feuil1          
    For Each Obj In Feuil1.OLEObjects 'verifie s'il s'agit d'un Checkbox
    If TypeOf Obj.Object Is MSForms.CheckBox Then
    .OLEObjects.Visible = True
    End If
    Next Obj
    End With
End Sub

'MASQUE LE MENU
Sub MasqueMenu()
Dim Obj As OLEObject
    With ActiveSheet          
    For Each Obj In Feuil1.OLEObjects 'boucle sur les objets de la Feuil1  
    If TypeOf Obj.Object Is MSForms.CheckBox Then 'verifie s'il s'agit d'un Checkbox
    .OLEObjects.Visible = False
    End If
    Next Obj
        .Range("J:M").EntireColumn.Hidden = True
        Application.Goto .Range("A1")
    End With
End Sub
typeof ou typename, même combat, les 2 sont valables, à votre discrétion ...
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
5
Affichages
200
Réponses
16
Affichages
673
Réponses
90
Affichages
6 K
Réponses
0
Affichages
131
Réponses
3
Affichages
405
Réponses
12
Affichages
682
Retour