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.
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
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 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.
Le même sans CheckBox mais avec des cases à cocher.
Les "vraies" Checkbox quand elles sont nombreuses ont beaucoup d'inconvénients à mes yeux ( longueur du code, maintenance ...)
Le même sans CheckBox mais avec des cases à cocher.
Les "vraies" Checkbox quand elles sont nombreuses ont beaucoup d'inconvénients à mes yeux ( longueur du code, maintenance ...)
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 ..
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
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