XL 2010 Cacher les checkbox puis les colonnes avec bouton

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

  • Exemple V1.xlsm
    38.7 KB · Affichages: 18
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...

sylvanu

XLDnaute Barbatruc
Supporter XLD
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

  • Exemple V1 (2).xlsm
    29.3 KB · Affichages: 6

Orson83

XLDnaute Impliqué
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.
 

fanch55

XLDnaute Barbatruc
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 ..
 

Staple1600

XLDnaute Barbatruc
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 ?)
 

Orson83

XLDnaute Impliqué
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
 

Staple1600

XLDnaute Barbatruc
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.
 

fanch55

XLDnaute Barbatruc
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 ...
 

Discussions similaires

Réponses
21
Affichages
899

Statistiques des forums

Discussions
312 380
Messages
2 087 820
Membres
103 665
dernier inscrit
gjoanou