XL 2016 Conserver la valeur d'une Chekbox

Eric4709

XLDnaute Nouveau
Bonjour à tous,

Je me tourne de nouveau vers la communauté pour m'aider sur un problème de chekbox.

J'ai un Userform qui contient plusieurs Chekbox permettant à l'utilisateur d'afficher ou de masquer des colonnes en fonction de son besoin.

Une fois que l'utilisateur à fait son choix (coché = affiché; décoché = masqué) je souhaite pouvoir enregistrer ses choix et lors de l'ouverture suivante du Userform les chekbox qui étaient cochées apparaissent toujours cochées et inversement pour les non cochées.

Voici un bout de mon code actuel

VB:
'==================================== Module Commande =========================================

Private Sub CheckBox1_Click()
Dim NoCol As Integer
NoCol = Application.Match("Commande client", Range("5:5"), 0)    ' recherche de la bonne colonne
If CheckBox1 = True Then
    Sheets("Suivi des Livraisons").Columns(NoCol).EntireColumn.Hidden = False
Else
If CheckBox1 = False Then
Sheets("Suivi des Livraisons").Columns(NoCol).EntireColumn.Hidden = True
End If
End If
End Sub

Private Sub CheckBox2_Click()
Dim NoCol As Integer
NoCol = Application.Match("Engagement Juridique", Range("5:5"), 0)    ' recherche de la bonne colonne
If CheckBox2 = True Then
    Sheets("Suivi des Livraisons").Columns(NoCol).EntireColumn.Hidden = False
Else
If CheckBox2 = False Then
Sheets("Suivi des Livraisons").Columns(NoCol).EntireColumn.Hidden = True
End If
End If
End Sub

'===================================== Module Livraison =========================================

Private Sub CheckBox3_Click()
Dim NoCol As Integer
NoCol = Application.Match("Quantité livrée", Range("5:5"), 0)    ' recherche de la bonne colonne
If CheckBox3 = True Then
    Sheets("Suivi des Livraisons").Columns(NoCol).EntireColumn.Hidden = False
Else
If CheckBox3 = False Then
Sheets("Suivi des Livraisons").Columns(NoCol).EntireColumn.Hidden = True
End If
End If
End Sub


'===================================== Boutons=========================================

Private Sub CommandButton1_Click()
 End
End Sub

Private Sub CommandButton2_Click()
    Dim TS As control
        For Each TS In Personnalisation_Colonnes.Controls
        If Left$(TS.name, 8) = "CheckBox" Then TS.Value = True
    Next
End Sub

Private Sub CommandButton3_Click()
    Dim TDS As control
        For Each TDS In Personnalisation_Colonnes.Controls
        If Left$(TDS.name, 8) = "CheckBox" Then TDS.Value = False
    Next
End Sub


Merci pour votre aide :)
 
Solution
Bonjour.
Si ma formulation par LOt.ListColumns( etc. ne vous plait pas, vous pouvez aussi l'écrire comme ça :
VB:
'==================================== Module Commande =========================================

Private Sub CheckBox1_Click()
   [Tableau1[Commande client]].EntireColumn.Hidden = Not CheckBox1.Value
   End Sub

Private Sub CheckBox2_Click()
   [Tableau1[Engagement Juridique]].EntireColumn.Hidden = Not CheckBox2.Value
   End Sub

'===================================== Module Livraison =========================================

Private Sub CheckBox3_Click()
   [Tableau1[Quantité livrée]].EntireColumn.Hidden = Not CheckBox3.Value
   End Sub
Par ailleurs vous pouvez aussi ajouter cette procédure :
Code:
Private Sub...

patricktoulon

XLDnaute Barbatruc
re:
un exemple avec des names
dans le userform 3 checkboxs
VB:
Private Sub UserForm_Activate()
    checkingName' appel de la sub pour checker les names
'remise en etat des checkboxs selon les names    
    CheckBox1.Value = Val(Replace(Names("memo1").Value, "=", ""))
    CheckBox2.Value = Val(Replace(Names("memo2").Value, "=", ""))
    CheckBox3.Value = Val(Replace(Names("memo3").Value, "=", ""))
End Sub


Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    'ecrase les anciennes versions des names à la fermeture du userform
    ThisWorkbook.Names.Add "memo1", CLng(CheckBox1.Value)
    ThisWorkbook.Names.Add "memo2", CLng(CheckBox2.Value)
    ThisWorkbook.Names.Add "memo3", CLng(CheckBox3.Value)
End Sub

Sub checkingName()'check les names et les créer si ils n'existent pas
    Dim chk1 As Object, chk2 As Object, chk3 As Object
    For Each nam In ThisWorkbook.Names
        If nam.Name = "memo1" Then Set chk1 = nam
        If nam.Name = "memo2" Then Set chk2 = nam
        If nam.Name = "memo3" Then Set chk3 = nam
    Next
    If chk1 Is Nothing Then ThisWorkbook.Names.Add "memo1", 0
    If chk2 Is Nothing Then ThisWorkbook.Names.Add "memo2", 0
    If chk3 Is Nothing Then ThisWorkbook.Names.Add "memo3", 0
End Sub
 

Dranreb

XLDnaute Barbatruc
Bonjour.
Mettez la plage sous forme de tableau si ce n'est déjà fait, et écrivez le simplement comme ça :
VB:
Option Explicit
Private LOt As ListObject
Private Sub UserForm_Initialize()
   Set LOt = Sheets("Suivi des Livraisons").ListObjects(1)
   CheckBox1.Value = Not LOt.ListColumns("Commande client").Range.EntireColumn.Hidden
   CheckBox2.Value = Not LOt.ListColumns("Engagement Juridique").Range.EntireColumn.Hidden
   CheckBox3.Value = Not LOt.ListColumns("Quantité livrée").Range.EntireColumn.Hidden
   End Sub
Private Sub CheckBox1_Click()
   LOt.ListColumns("Commande client").Range.EntireColumn.Hidden = Not CheckBox1.Value
   End Sub
Private Sub CheckBox2_Click()
   LOt.ListColumns("Engagement Juridique").Range.EntireColumn.Hidden = Not CheckBox2.Value
   End Sub
Private Sub CheckBox3_Click()
   LOt.ListColumns("Quantité livrée").Range.EntireColumn.Hidden = Not CheckBox3.Value
   End Sub
À tester. Forcément puisque pas de classeur joint.
 

eriiic

XLDnaute Barbatruc
perso la feuille serait mon dernier choix
Patrick, perso ta solution sans boucle serait loin d'obtenir mes faveurs.
J'espère qu'il n'en n'a pas 50 ... :rolleyes:
Tu peux proposer mieux ou moins bien, mais ça serait bien d'arrêter de dénigrer trop systématiquement.
C'est pénible, on sait que tu as le plus beau tracteur du village...
Réserve ça pour les grossières erreurs stp. Merci.
eric

Edit : surtout si c'est pour approuver dans la foulée une solution qui utilises une feuille également. Même si c'est d'une autre façon, il y a un manque de cohérence là
 
Dernière édition:

Modeste geedee

XLDnaute Barbatruc
Une fois que l'utilisateur à fait son choix (coché = affiché; décoché = masqué) je souhaite pouvoir enregistrer ses choix et lors de l'ouverture suivante du Userform les chekbox qui étaient cochées apparaissent toujours cochées et inversement pour les non cochées.
Utilisez la propriété :
- ControlSource des objets
- Feuille Parametres et Plages nommées
1612173942589.png
 

patricktoulon

XLDnaute Barbatruc
bonjour eriiiic
non!! Eric , la solution de @Staple1600 n'utilise pas une feuille pour mémoriser
elle utilise l’état visible lui même des colonnes
ça n'a rien a voir avec ce que tu propose ni avec la mienne d'ailleurs
mais ça serait bien d'arrêter de dénigrer trop systématiquement.
C'est pénible, on sait que tu as le plus beau tracteur du village...
Réserve ça pour les grossières erreurs stp. Merci.
et bien quoi !!? on a pas le droit de faire d'autre propositions ??? sans être targué
eriiic parle alors quoi? tout le monde la ferme c'est ça?
dans ce cas là tu es tombé sur un os

Edit : surtout si c'est pour approuver dans la foulée une solution qui utilises une feuille également. Même si c'est d'une autre façon, il y a un manque de cohérence là

absolument pas!!! je le redis, il n'y a pas d'incohérence @Staple1600 utilise pas une feuille, il utilise l’état visible (de la/des) colonne(s)
il n'y a aucune modifs dans cellules pour mémoriser !!!

ce comportement ou genre de réaction ,réserve le pour celui qui t’habille le matin ,STP ;)
je vais mettre ça sur le compte d'un pied mal posé à la sortie du lit ;) ça arrive à tout le monde
 

eriiic

XLDnaute Barbatruc
Ainsi .Range.EntireColumn n'est pas utiliser une feuille, ok.
Pas la peine de m'expliquer qu'il n'y a pas d'criture sur feuille et que c'est un gain, je l'ai vu.

et bien quoi !!? on a pas le droit de faire d'autre propositions ??? sans être targué
eriiic parle alors quoi? tout le monde la ferme c'est ça?
dans ce cas là tu es tombé sur un os
Ai-je dit ça ? Non, c''est l'inverse que je défend.
Soit tu as des problème de lecture (c'est Dranreb et non Staple), soit tu as des problèmes de compréhension.
Je ne te parle pas de tes propositions que je sache.
Je te demande de réserver tes critiques pour les cas importants et non de façon trop systématique, c'est français ça non ?
Tu l'as subit assez fortement sur un autre forum au point de choisir de le quitter (et pourtant les critiques de certaines de tes proposition étaient bien argumentées), tu sais combien c'est pénible à force...
eric
 
Dernière édition:

Modeste geedee

XLDnaute Barbatruc
Bonsour®, aux experts, moustachus, chibanis et autres vieux de la vieille
mes amis en quelque sorte ... ;)

Les querelles (entre-nous) ne font qu'effrayer les questionneurs nouveaux (novices ou pas).
L'habitude de proposer une solution optimisée satisfait d'abord le répondeur :
certains appelle ça "pour le fun":cool:

Quand un novice EXCEL reçoit une proposition VBA fonctionnelle, il n'est bien souvent pas en mesure d'en juger les tenants et aboutissants en dehors qu'elle réponde effectivement à sa demande,
je ne parlerai même pas de l'adaptation ou transposition pour une autre situation.

je le répète souvent la grande majorité des utilisateurs ne sont ni analyste, ni programmeur
seul l'apprentissage du B.A. BA des feuilles de calculs permet d'évaluer la richesse d'Excel
qui pourra être valorisé ensuite à l'aide de VBA.
 

ChTi160

XLDnaute Barbatruc
aaarffffffff
Moi , j'aime pas ca ! je suis comme cela .
et je suis pas un Nouveau !
Moi si j'aime pas la façon de dire de faire de certains et y'en a , je ne lis pas , je saute le Post Lol
je ne connais pas le passé (et encore moins l'avenir) des participants à ce Forum , je me moque donc de qui a fait quoi et où !
qui a t'il de dégradant de vexant à lire que PatrickToulon Lui !
perso la feuille serait mon dernier choix
moi j'avais même pas d'avis sur le Sujet Lol
ca n'a pas joué sur ma façon d'appréhender ce qu'Eriiiic à proposé !
Dommage d'en arriver là !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
jean marie
 

eriiic

XLDnaute Barbatruc
Disons qu'il annonce plutôt ses propositions en présentant leurs avantages, ça sera plus constructif et suffisant.
Pour moi, des critiques trop fréquentes poussent à l'auto-censure et freinent l'enrichissement d'un forum.
Ce n'est pas parce que je ne pense pas adopter la proposition de dranreb pour des raisons propres que je me permet de porter un jugement ici. Elle peut intéresser des lecteurs.
 

Discussions similaires

Statistiques des forums

Discussions
314 737
Messages
2 112 329
Membres
111 511
dernier inscrit
Bopegnan