Module de classe - Créer un évènement - ChekBox dans 1Frame

Re_Bonsoir,

Quelques heures à peine j'ai à nouveau un problème

Je souhaite quand je clique sur une Chekbox, qu'il se passe quelquechose

Plus précisemment....

J'ai un module de classe me permettant d'instancier une Frame intégrée à un OngletExcel.

Dim cframe As Classe1
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
Dim i As Byte
If ActiveSheet.Name = "Feuil1" Then
    Set cframe = New Classe1
    Set cframe.oframe = Sheets("Feuil1").Frame1
End If

End Sub

Dès que je clique sur cette Frame une procédure événementielle est lancée et me permet d'instancier les Frames, OptionButton et CheckBox dans un second module de classe afin eux aussi de les gérer ultérieurement avec des procédures événementielles.

Public WithEvents oframe As msforms.Frame
Public cctrl As Classe2
Private Sub oframe_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
Dim i As Byte

With oframe
    For i = 0 To oframe.Controls.Count - 1
        Debug.Print i & "-" & oframe.Controls(i).Name
        Set cctrl = New Classe2                     'initialisation de la classe
        Select Case True
        Case oframe.Controls(i).Name Like "CheckBox*"
            Set cctrl.les_checks = oframe.Controls(i)           'rattachement d'une instance à la classe
        Case oframe.Controls(i).Name Like "OptionB*"
             Set cctrl.les_options = oframe.Controls(i)
              oframe.Controls(i).Value = False
        Case Else
        End Select
    Next i
End With
End Sub

Ce la ne fonctionne pas comme il faut puisque lorsque je clic ensuite sur une CheckBox rien ne se passe.

Je ne dois pas être loin je pense car j'arrive bien à mettre chacun des contrôles en instance, puisqu'une fois instanciés, je change leurs valeurs (True or False) avec une ligne de VBA

Select Case oframe.Controls(i).Value
Case True: oframe.Controls(i).Value = False
Case False: oframe.Controls(i).Value = True
End Select

Et cela fonctionne en partie puisque, changement de valeur oblige, cela provoque derrière aussitôt la fameuse procédure événementielle tant recherchée rattachée à la ChekBox. Mais lorsque c'est moi qui clique sur la case à cocher rien ne se passe.

Public WithEvents les_frames As msforms.Frame
Public WithEvents les_options As msforms.OptionButton
Public WithEvents les_checks As msforms.CheckBox
Private Sub les_checks()
Stop
End Sub
Private Sub les_options_Click()
Stop
End Sub

Mes seuls clics reconnus sont ceux passé sur la Frame1 c'est à dire entre la zone bleue et les zones rouges des autres Frames.

1h21

J'espère que vous pourrez m'aider, je vais continuer de chercher ce soir en espérant trouver mais je compte pas mal sur votre aide encore une fois...

Je vous remercie par avance !!

47classeur2.xlsm (33.79 Ko)

bonsoir,

En attendant que les experts es classes interviennent... Je pense que tu te complique bien la vie pour rien avec toutes ces frames et toutes ces classes.

Je peux me tromper car c'est pas du tout mon aire de jeu, mais une seule classe pour tout le monde aurait bien suffit. Les frames en forme de poupée russes n'interviennent pas qu'elles soient dans une frames ou dans 2 emboitées... Tu peux très bien adresser les chexbox et des Options boutons avec :

Sheets("Feuil1").OptionButton1...

Par contre ton

oframe.Controls(i)

... je le sens pas.

Il me semble que dans ce cas il faut que tu remontes tous les parents jusqu'à Feuil1 et comme tu as des frames l'une dans l'autre bon amusement...

Bon je dis ça je dis rien... hein. C'est juste pour faire avancer le schmilblick ! Il y a toujours un trublion pour me mettre le nez dans mon caca. Alors je ne doute pas que quelqu'un va me prouver le contraire !

A+

Pas de candidats ? Moi je ne peux pas travailler sur ce classeur. Je peux l'ouvrir, mais je ne peux pas accéder à ses objets...

Pour la route je te joins une démo de Frames empilées avec des CheckBox mais j'ai fait ça sur USF parce que ton bidouillage... Je suis pas convaincu.

39checkbox.xlsm (27.89 Ko)

Bonjour Monsieur Galopin,

Merci déjà de te pencher sur mon sujet car je me doute bien qu'il en rebute plus d'un vue l'usine à gaz

Ce que tu dis n'est pas bête du tout. En fait j'ai déjà dans mon projet utilisé des CheckBox et autres controls directement intégrés à ma page, ce n'étaient pas au départ des ControleActiveX et j'ai tout de suite accès à leurs procédures événementielles dans le module du sheet en question.

Ce qu'il y c'est que je ne trouve pas çà très propre, je suis peut-être trop habitué aux Userforms un peu préfabriqués et les jolies frames grises (oui oui je trouve çà beau ce gris windows fenêtré) qui s'empilent avec pleins de belles cases à cocher toutes bien alignées.

Le fait est que rien ne m'empêche en effet d'aligner mais contrôles intégrés à la feuil (pas les activeX) avec des .Top et des .Left.

Disons que tu m'as mis le doute (un peu comme dans Inception ) mais que par curiosité intellectuelle j'aimerais résoudre ce problème et voir si ce n'est pas bien compliqué, passer malgré tout en poupées russes car je trouve çà plus esthétique.

Mais ta remarque est judicieuse, on a parfois besoin qu'on nous sorte un peu la tête de l'eau pour revenir à des choses plus simples voire plus essentielles.

Je lis ton 2nd message et je reviens vers toi.


Ha mais Galopin tu t'es donné tant de mal pour m'aider.

Ton Userform est très bien mais je souhaitais justement l'intégrer en controlActivX dans la Page afin d'éviter d'avoir à cliquer sur un bouton pour l'afficher. C'est étonnant que tu n'arrives pas à ouvrir mon classeur, comment cela se fait-il ? Je l'ai écris sur Excel2007.

Est-ce un problème de library ?

Non... Je peux ouvrir le classeur, mais je n'arrive à sélectionner que la Frame1, pas les autres, ni les CheckBox !

Ha mais oui

Il faut faire ClicDroit sur la Frame puis dans le menu déroulant : Objet Cadre / Edition

Rien que pour en arriver là j'ai dû me ballader sur internet donc je comprends.

Oui, je n'ai pas pensé à ça. J'ai regardé juste si c'était groupé, j'ai vu que non et j'ai pas insisté.

Bon de toute façon, ça ne me branchait pas vraiment : Les feuilles qui contiennent des objets multiples c'est pas mon trip !

Ya quand même pas le même confort qu'avec les USF...

A+

A mais on est d'accord c'est une horreur et je ne vois pas qui voudrais se pencher sur un truc pareil, perso moi je fuis ce genre de sujet

Merci quand même Galopin !

Bonjour,

Tu n'as pas effectivement choisi la solution la plus simple en utilisant un formulaire de type feuille plutôt qu'un formulaire de type classeur (=userform). Par rapport à un UserForm, ce type de formulaire présente surtout l'avantage de se positionner précisément sur la feuille mais conserve toutes les saisies à la fermeture de classeur.

Es-tu certain que c'est nécessaire ??

Sinon, par rapport à ton problème, il faut donc :

1- créer 3 modules de classe pour les 3 types de contrôle et y définir les événements à tester (Class_Frames, Class_Options, CLass_Checks)

2- créer 3 collections pour stocker les instances de chacune de ces 3 classes (C_Frames, C_Options, C_Checks)

3_ instancier chaque classe avec les contrôles du formulaire nommé "Frame1" (il serait d'ailleurs judicieux de le renommer "Formulaire" pour éviter la confusion avec les Frames qui y sont intégrés : Frame1, Frame2, Frame3, Frame4, Frame5) . Par exemple, la collection "c_frames" contiendra donc 5 instances de classe.

exemple de stockage des instance des 5 frames avec association de l'objet frame à l'instance de la classe :

Public c_frames As New Collection
     For Each ctrl In Feuil1.Frame1.Controls
        If TypeOf ctrl Is MSForms.frame Then
            c_frames.Add Key:=ctrl.Name, Item:=New class_frames
            Set c_frames(ctrl.Name).Obj_frame = ctrl
        End If
    Next ctrl

c_frames(ctrl.Name) est l'instance de la classe et Obj_frame une propriété de la classe permetttant de stocker le contrôle correspondant, c'est à dire l'objet Frame.

edit : ci-joint exemple

mise à jour de ma précédente réponse

Rechercher des sujets similaires à "module classe creer evenement chekbox 1frame"