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 !
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
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
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
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
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
Oui, c'est plutôt ce que je fais pour mes fichiers !
De toutes façons, même sans module de classe mes users ne sauraient pas gérer la maintenance !!
Merci pour ton retour.
re
bonjour @Phil69970
ce n'est pas le nombre de lignes qui fait la complexité d'un code
c'est les méthodes qu'il utilise
la méthode utilisée dans son ecriture
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
D'accord avec vous deux ! D'un autre côté, c'était l'occasion pour moi de mettre en oeuvre un module de classe dans la "vraie vie", histoire de progresser un peu !
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
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
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...