Microsoft 365 Garder les cases checkbox cocher lors de la fermeture d'un userform

Marthe

XLDnaute Nouveau
Bonjour,
J'ai crée un userform avec une checkbox qui lorsqu'elle est cochée colorie des casses dans les différentes classeurs.
mais lorsque je quitte le userform ou je ferme le fichier, je perd le cochage si présent.

Comment conserver mes crochet actif ?

En regardant les précédents forum, j'ai appliqué les lignes ci-dessous mais cela ne fonctionne pas :

1703844095283.png
 

Pièces jointes

  • LDP essais.xlsm
    33.6 KB · Affichages: 10

patricktoulon

XLDnaute Barbatruc
Bonjour @Dranreb
pas d'erreur déclenché chez moi avec le refersto mais ca marche pas
et pour info
t=n.refersto
msgbox typename(t) donne un string
en fait il faut evaluer le refersTo et ça marche puisque en lecture le refesTo renvoie un string
VB:
Private Sub UserForm_Initialize()
    Dim nam As Name, t
    For Each n In ThisWorkbook.Names
        If n.Name = "Check" Then t = Evaluate(n.RefersTo): Exit For
    Next
    'MsgBox TypeName(t)
    If IsArray(t) Then
        For Each Ctrl In Me.Controls
            If TypeName(Ctrl) = "CheckBox" Then
                A = A + 1: Ctrl.Value = t(A)
            End If
        Next
    End If
End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    Dim Ctrl, A&, t(), nam As Name
    On Error Resume Next
    Set nam = ThisWorkbook.Names.Add("Check", "0)")
    On Error GoTo 0
    For Each Ctrl In Me.Controls
        If TypeName(Ctrl) = "CheckBox" Then
            A = A + 1: ReDim Preserve t(1 To A): t(A) = Abs(Ctrl.Value)
        End If
    Next
    Debug.Print Join(t, ";")
    ThisWorkbook.Names("Check").RefersTo = t
End Sub
1703919294497.png
 

Dranreb

XLDnaute Barbatruc
Oui en lecture ça restitue toujours la référence. C'est seulement en écriture que chez moi ça accepte aussi la valeur d'évaluation. Je ne vois pas l'intérêt de le faire en deux fois. Pourguoi pas juste à la fin Thisworkbook.Names Add "Check", T ? Ça ne provoque pas d'erreur si le nom existe déjà. Enfin du moins sur Excel 2016.
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
bon ben voila ca match
sinon il y a une autre manière de faire
mais ça implique d'activer une librairie
dans le userform
VB:
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    Dim Ctrl, A&
    ufname = Me.Name
    For Each Ctrl In Me.Controls
        If TypeName(Ctrl) = "CheckBox" Then
            If Ctrl.Value Then A = A + 1: ReDim Preserve T(0 To A - 1): T(A - 1) = Ctrl.Name
        End If
    Next
   memocheck
End Sub
dans un module standard
VB:
Dim fermé As Boolean
Public T()
Public ufname
'Activer la référence Microsoft Visual Basic for Application Extensibility.5.x
Sub memocheck()
    If fermé = False Then
        fermé = True: Application.OnTime Now + 0.000005, "memocheck"
    Else
        fermé = False
        Dim uf As VBComponent, i&
        Set uf = ThisWorkbook.VBProject.VBComponents(ufname)
        For i = LBound(T) To UBound(T)
            uf.designer.Controls(T(i)).Value = True
        Next
    End If
End Sub
ici seul l'event query_close est utilisé
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour à tous :),

J'utilise aussi parfois une feuille masquée pour stocker ce que je désire. C'est relativement simple.
Je me suis limité à des contrôles possédant une propriété "Value". La feuille s'appelle "HiddenData".
  • cliquer sur le bouton Hop!
  • modifier le textbox, les boutons option et/ou checkbox, la barre de défilement
  • refermer le userform
  • ré-ouvrir le userform
nota : version v1a avec un code plus concis

VB:
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
Const mesControles = "TextBox1;OptionButton1;OptionButton2;OptionButton3;ScrollBar1;CheckBox1;CheckBox2"
Dim n&, x
   n = 1
   With Sheets("HiddenData")
      .Range("a2:b9999").Clear
      For Each x In Split(mesControles, ";"): n = n + 1: .Cells(n, 1) = x: .Cells(n, 2) = Controls(x): Next
   End With
End Sub

Private Sub UserForm_Initialize()
Dim n&, i&
   ScrollBar1_Change
   With Sheets("HiddenData")
      n = .Cells(Rows.Count, "a").End(xlUp).Row
      If n > 1 Then For i = 2 To n: Me.Controls(.Cells(i, 1).Value) = .Cells(i, 2).Value: Next i
   End With
End Sub
 

Pièces jointes

  • Marthe- sauver valeurs USF- v1a.xlsm
    31.4 KB · Affichages: 3
Dernière édition:

job75

XLDnaute Barbatruc
Bonjour Marthe, le forum,

C'est très simple : pour mémoriser la valeur de la CheckBox il suffit de modifier le VBProject.

Dans UserForm2 :
VB:
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
CB = CheckBox1
Application.OnTime 1, "Memorise" 'lancement différé
End Sub
Dans Module1 :
VB:
Public CB As Boolean 'mémorise la variable

Sub Memorise()
ThisWorkbook.VBProject.VBComponents("UserForm2").Designer.Controls("CheckBox1").Value = CB
ThisWorkbook.Save 'enregistre le fichier
End Sub
Il faut avoir coché l'option Accès approuvé au modèle d'objet du projet VBA (onglet Fichier-Options-Centre de gestion de la confidentialité-Paramètres...-Paramètres des macros).

A+
 

Pièces jointes

  • LDP essais.xlsm
    38.3 KB · Affichages: 5

patricktoulon

XLDnaute Barbatruc
re
bonjour @job75
ca implique qu'il sauve toutes les eventuelles modifs qu'il a pu faire sur le classeur depuis son ouverture
c'est peut être pas une bonne idée
dans ma version je met les checkbox a leur valeur en dur dans vbe mais je ne sauve pas
et non seulement il faut cocher l'accès mais aussi activer la ref citée dans mon post #18
 

Dranreb

XLDnaute Barbatruc
Bonjour et bonne année.
Avez vous bien mis le code adapté à plusieurs checkbox ?
Joignez le classeur que je voie ce que vous avez fait, et ce qui ne va pas.
Remarquez c'est normale que ça plante la 1ère fois, si le nom n'existe pas encore.
Pour l'éviter mettez On Error Resume Next au début de la Sub UserForm_Initialize
Sinon ça ne devrait plus se reproduire par la suite si vous demandez simplement à poursuivre l'exécution par la End Sub.
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
bonjour
meilleurs veux
on t'a donné plusieurs méthode et tout fonctionnelles
hors je n'en vois aucunes dans ton fichier

d'autre part au regard de ton fichier dont il manque la feuille qui est modifiée par les valeurs des checkboxs

de plus si les checkboxs modifie cette feuille il est evident qu'il va y avoir conflit avec l'intention
si tu memorise le satut des checkbox et que tu les upload à l'ouverture de l'userform
sinon à l'ouverture de l'userform par phénomène d'event propagation tes checkbox vont agir sur cette dites feuille et ce n'est peut être pas ton intention

non pour moi si les checkboxs change des valeur dans cette feuille alors a l'ouverture c'est les mêmes valeur des ces dites cellules qui doivent commander le statut des checkbox

j'entrevois un problème conceptionel
 

Marthe

XLDnaute Nouveau
ok
patricktoulon, j'ai repris ton code cela fonctionne tant que je ne ferme pas le fichier.
Lorsque, j'enregistre et ferme le fichier, après l'ouverture je perds les coches.
Ce que je souhaite c'est de les revoir.
 

Pièces jointes

  • LDP2 essais.xlsm
    40.9 KB · Affichages: 3

Statistiques des forums

Discussions
312 209
Messages
2 086 266
Membres
103 168
dernier inscrit
isidore33