XL 2019 Module de classe et checkbox

ThierryP

XLDnaute Occasionnel
Bonjour le forum,

Après quelques recherches sur le Net à ce sujet, je me rends compte que mes modestes connaissances et le peu de neurones qui me restent ne me permettent pas d'appliquer les solutions ou pistes que j'ai pu trouver..... La plupart s'adressant à un USF !
J'ai donc sur ma feuille un certain nombre de checkbox (dans le fichier complet il y a plusieurs onglets), et je voudrais déclencher une macro quand on coche un checkbox, basiquement écrire la date dans la cellule correspondante et pour certaines effectuer des trucs un peu plus complexes.

Donc j'ai bien vu qu'il me fallait utiliser un module de classe pour ne pas avoir à écrire des dizaines de fois Checkbox99_Click mais je n'arrive pas à vraiment comprendre la mise en oeuvre ou à transposer ce que j'ai trouvé pour les USF.

Si une bonne âme veut bien me donner quelques informations, je suis preneur !

Merci d'avance,
 

Pièces jointes

  • Test.xlsm
    53.5 KB · Affichages: 9
Solution
Bonjour
c'est assez simple en fait selon la methode patricktoulon qui consite a tout faire dans le module classe

dans le module thisworkbook et plus précisément dans l'event open
VB:
Dim cl As New classCheck
Private Sub Workbook_Open()
    cl.classage
End Sub
et dans un module classe nommé "classCheck"
VB:
Public WithEvents check As msforms.CheckBox
Dim cls() As New classCheck
Public Function classage()
    Dim Ctl, A&
    For Each Ctl In Feuil1.OLEObjects
        If Ctl.TopLeftCell.Column = 3 Then
            A = A + 1: ReDim Preserve cls(1 To A): Set cls(A).check = Ctl.Object
        End If
    Next
End Function
Private Sub Check_Click()
    MsgBox "tu fait ce que tu veux avec le checkbox " & check.Name

End Sub

patricktoulon

XLDnaute Barbatruc
Bonjour
c'est assez simple en fait selon la methode patricktoulon qui consite a tout faire dans le module classe

dans le module thisworkbook et plus précisément dans l'event open
VB:
Dim cl As New classCheck
Private Sub Workbook_Open()
    cl.classage
End Sub
et dans un module classe nommé "classCheck"
VB:
Public WithEvents check As msforms.CheckBox
Dim cls() As New classCheck
Public Function classage()
    Dim Ctl, A&
    For Each Ctl In Feuil1.OLEObjects
        If Ctl.TopLeftCell.Column = 3 Then
            A = A + 1: ReDim Preserve cls(1 To A): Set cls(A).check = Ctl.Object
        End If
    Next
End Function
Private Sub Check_Click()
    MsgBox "tu fait ce que tu veux avec le checkbox " & check.Name

End Sub
 

Pièces jointes

  • Test(2).xlsm
    65.8 KB · Affichages: 15

ThierryP

XLDnaute Occasionnel
Bonjour
c'est assez simple en fait selon la methode patricktoulon qui consite a tout faire dans le module classe

dans le module thisworkbook et plus précisément dans l'event open
VB:
Dim cl As New classCheck
Private Sub Workbook_Open()
    cl.classage
End Sub
et dans un module classe nommé "classCheck"
VB:
Public WithEvents check As msforms.CheckBox
Dim cls() As New classCheck
Public Function classage()
    Dim Ctl, A&
    For Each Ctl In Feuil1.OLEObjects
        If Ctl.TopLeftCell.Column = 3 Then
            A = A + 1: ReDim Preserve cls(1 To A): Set cls(A).check = Ctl.Object
        End If
    Next
End Function
Private Sub Check_Click()
    MsgBox "tu fait ce que tu veux avec le checkbox " & check.Name

End Sub
Bonsoir Patrick,
Merci pour le retour ! J'ai réussi à transposer ton exemple à mon fichier.... même si je ne suis pas sûr d'avoir tout compris ! Je crois qu'il va falloir que je bosse un peu pour digérer tout ça ;);)
 

ThierryP

XLDnaute Occasionnel
Bonjour à tous

Je te propose d'oublier tes cases à cocher et les remplacer par des X et plus de module de classe ....

Merci de ton retour
Bonsoir Phil69970,
Tu as raison, et si j'étais l'utilisateur du fichier c'est ce que j'aurais fait.... mais l'utilisateur du fichier m'a dit : "Bof.. ça fait plus moderne avec les cases à cocher" donc voilà voilà... Je me plie au donneur d'ordre ;)
 

Phil69970

XLDnaute Barbatruc
@ThierryP

Certes mais moins facile à gérer la maintenance en cas de problème si demain tu déménages il sera faire la maintenance l'utilisateur !!!
Alors pour moi plus c'est facile .... plus c'est facile à maintenir .... ;)
On peut même mettre le X sur clic comme une case à cocher
Dans cette version ça le gout d'une case à cocher sans ..... case à cocher 🤔

Merci de ton retour
 

Pièces jointes

  • Case à cocher et date V2.xlsm
    20.8 KB · Affichages: 13

patricktoulon

XLDnaute Barbatruc
re
bonjour @Phil69970
ce n'est pas le nombre de lignes qui fait la complexité d'un code
  1. c'est les méthodes qu'il utilise
  2. la méthode utilisée dans son ecriture
  3. les connaissances minimum vba requise sur les eventuels objects utilisés
cela dit je te rejoins quand au fait qu'utiliser la cellule elle même avec(pourquoi pas allons jusqu'au bout) avec le caractère de validation au double click+cancel
mais là c'est qu'elqu'un avec plus d'expérience qui te le dis
un novice aura autant de mal à comprendre cette logique que le principe d'un module classe
par contre inversement il aura autant de facilité à apprendre un principe ou l'autre tout du moins pour les bases
c'est l'avantage avec les apprentis vierges de toute méthodes
 

ThierryP

XLDnaute Occasionnel
Bonjour
c'est assez simple en fait selon la methode patricktoulon qui consite a tout faire dans le module classe

dans le module thisworkbook et plus précisément dans l'event open
VB:
Dim cl As New classCheck
Private Sub Workbook_Open()
    cl.classage
End Sub
et dans un module classe nommé "classCheck"
VB:
Public WithEvents check As msforms.CheckBox
Dim cls() As New classCheck
Public Function classage()
    Dim Ctl, A&
    For Each Ctl In Feuil1.OLEObjects
        If Ctl.TopLeftCell.Column = 3 Then
            A = A + 1: ReDim Preserve cls(1 To A): Set cls(A).check = Ctl.Object
        End If
    Next
End Function
Private Sub Check_Click()
    MsgBox "tu fait ce que tu veux avec le checkbox " & check.Name

End Sub
Bonjour Patrick,

Je déterre le sujet parce que j'ai un petit (enfin, gros pour moi....) souci :
J'ai réussi à adapter ton code en grillant quelques neurones mais dans mon vrai fichier j'ai plusieurs onglets, donc j'ai fait ceci dans le WorkBook_Open :
VB:
For Each Feuille In Worksheets
    Feuille.Activate
    Call ChBox.Classement
Next
Derrière certains des CheckBox, il y a des actions (ouvrir un fichier, une page internet etc...) et certaines fois, le programme ne repasse plus par le module de classe quand je clique sur un CheckBox.
Un peu comme si la macro Classement était "volatile". Du coup j'ai ajouté dans le thisworkbook :
VB:
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
Call ChBox.Classement
End Sub
Si je change d'onglet et que je reviens sur l'onglet à problème, cela refonctionne.... forcément ! Mais comment se passer de cette manip ?
tu auras sûrement une idée du pourquoi... et du comment le résoudre :);)
 

ThierryP

XLDnaute Occasionnel
Finalement de mon côté, j'étais arrivé aux mêmes modifs que toi... Qu'est-ce que je suis fier !!!;););)
Du coup, je me suis rendu compte que le dysfonctionnement était toujours là, mais seulement dans le cas où j'ouvre un fichier Excel via un hyperlien. Je pense que le souci vient du fait que le fichier ouvert prend le focus.
J'ai testé ceci :
VB:
Private Sub Workbook_Deactivate()
Me.Activate
End Sub
qui semble fonctionner.... sauf que je ne peux plus afficher l'autre classeur, ce qui est logique !
Mais je ne sais pas comment dire à Excel de garde le focus sur le fichier appelant...

Merci d'avance de ton retour !
 

Discussions similaires

Réponses
29
Affichages
2 K

Statistiques des forums

Discussions
315 088
Messages
2 116 089
Membres
112 658
dernier inscrit
doro 76