Utilisation de "MSForms.Control" dans un module de classe en VBA

cs_rlapt Messages postés 63 Date d'inscription lundi 6 octobre 2003 Statut Membre Dernière intervention 25 juin 2013 - 9 avril 2012 à 09:24
cs_rlapt Messages postés 63 Date d'inscription lundi 6 octobre 2003 Statut Membre Dernière intervention 25 juin 2013 - 18 avril 2012 à 20:01
Bonjour,

Je rencontre le problème suivant :

Je souhaite créer une collection de contrôles (Textbox, Combobox, Listbox) qui réagissent aux événements Enter et BeforeUpdate.

Si je crée des collections basées sur les déclarations suivantes dans un module de classe :
Public WithEvents LI_SO As MSForms.ListBox
Public WithEvents LD_SO As MSForms.ComboBox
Public WithEvents ZT_SO As MSForms.TextBox
je n'ai accès à cas événements.

Par contre avec cette déclaration :
Public WithEvents ColCtrl As MSForms.Control
les événements Enter et BeforeUpdate, sont bien gérés

Question :
Comment créer une collection de MSForms.Control ?
Car l'exécution du code suivant :
Set ColCtrls = New Collection
Set MdC = New Classe_Ctrl
Set Ctrl = Forme.Controls.Add("Forms.textbox.1",[Nom du contrôle], True)
Set MdC = Ctrl 'me retourne une erreur 13 "incompatibilité de type"
ColCtrl.Add MdC

Merci de votre réponse.
RLAPT

7 réponses

Utilisateur anonyme
9 avril 2012 à 23:06
Bonjour,

Comment créer une collection de MSForms.Control ?

Pourquoi vouloir créer une collection qui existe déjà ?

Cherche "Controls" dans l'aide de VBA
0
cs_rlapt Messages postés 63 Date d'inscription lundi 6 octobre 2003 Statut Membre Dernière intervention 25 juin 2013
10 avril 2012 à 07:43
Bonjour,

Je souhaite les créer pour effectuer des traitements communs à ces contrôles. Ce qui n'est possible en VBA qu'en créant une collection.

RLAPT
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
10 avril 2012 à 08:09
Bonjour, rlapt,
mon analyse, en couleurs, de ce que tu as écrit
Set MdC = New Classe_Ctrl
Set Ctrl = Forme.Controls.Add("Forms.textbox.1",[Nom du contrôle], True)
Set MdC = Ctrl
Rouge = un type
vert = un autre type

Normal, donc, que tu aies un message d'erreur !

____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
cs_rlapt Messages postés 63 Date d'inscription lundi 6 octobre 2003 Statut Membre Dernière intervention 25 juin 2013
17 avril 2012 à 00:01
Bonsoir,

Merci ucfoutu de votre réponse. Je réponds assez en retard, car je n'ai pas eu de mail d'avertissement concernant votre réponse.

En fait ma vraie question aurait du être :
quel est le type d'objet de la collection MSForms.Control ?
ou
comment peut-on créer un collection réagissant aux événements Enter et BeforeUpdate ?

Je pensais que la collection contenait un objet Control ce qui apparemment n'est pas le cas.

Je ne trouve pas vraiment d'explication sur ce sujet, ou je cherche mal.

Merci d'avance.

RLAPT
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
bigfish_le vrai Messages postés 1835 Date d'inscription vendredi 13 mai 2005 Statut Membre Dernière intervention 20 novembre 2013 15
17 avril 2012 à 10:46
Salut,

il faut charger dans ta classe les contrôles qui doivent être soumis aux 2 événements qui t’intéresse.

un exemple:

Note que la form se nome ici "MaForm"
Dans un 1er module de classe que tu nomes EventsOnMyCtrl

' Created by 3ddI7IHd
' Creation date: 27-05-2009
' Code Reason: création de la classe d’événement pour les contrôles textbox, combobox et autre listbox
Option Explicit

Dim AllTextbox() As CtrlEvents, NbCtrl As Integer
Public mesFeuilles As New Collection


Sub Class_Initialize()
    'initialisation de la classe
        Dim MyCtrl As Control, i As Integer
        'on determine le nombre de controle a affecter a la classe
        For Each MyCtrl In MaForm.Controls
            If TypeOf MyCtrl Is MSForms.TextBox Or TypeOf MyCtrl Is MSForms.ComboBox Or TypeOf MyCtrl Is MSForms.ListBox Then
                i = i + 1
            End If
        Next
        ReDim AllTextbox(i)
        i = 0
        'affectation des controles
        For Each MyCtrl In MaForm.Controls
            If TypeOf MyCtrl Is MSForms.TextBox Then
                Set AllTextbox(i) = New CtrlEvents
                Set AllTextbox(i).Mestextbox = MyCtrl
                i = i + 1
            ElseIf TypeOf MyCtrl Is MSForms.ComboBox Then
                Set AllTextbox(i) = New CtrlEvents
                Set AllTextbox(i).MesCombobox = MyCtrl
                i = i + 1
            ElseIf TypeOf MyCtrl Is MSForms.ListBox Then
                Set AllTextbox(i) = New CtrlEvents
                Set AllTextbox(i).Meslistbox = MyCtrl
                i = i + 1
            End If
        Next
        'on met de coter le nombre de controle attacher a la classe pour l'etape de vidage
        NbCtrl = i
End Sub

Sub Class_Terminate()
    'ici on vide la classe
    Dim i As Integer
    For i = 1 To NbCtrl
        On Error Resume Next
        Set AllTextbox(i) = Nothing
    Next
End Sub


Dans un 2ieme module de Classe que tu nomes CtrlEvents

' Created by 3ddI7IHd
' Creation date: 28-05-2009
' Code Reason: Classe d'evenement pour les controles textbox, combobox et autre listbox
' de la form MaForm. Cette methode permet de ne pas avoir a gerer chaque controle
' independament mais par famille de controle. Autrement dit cela permet d'eviter la
' repetition de code.

Option Explicit

Public WithEvents Mestextbox As MSForms.TextBox
Public WithEvents MesCombobox As MSForms.ComboBox
Public WithEvents Meslistbox As MSForms.ListBox


Private Sub MesCombobox_Change()
    'action pour combo
End Sub

Private Sub Meslistbox_Change()
    'action pour liste
End Sub

Private Sub Mestextbox_Change()
    'action pour textbox
End Sub

End Sub


la classe ce charge comme ceci :

En haut d'un module :

Public AllCtrl As New EventsOnMyCtrl


dans le même module:

Sub CestPartie ()
   Call AllCtrl.Class_Initialize
End Sub



A+
0
cs_rlapt Messages postés 63 Date d'inscription lundi 6 octobre 2003 Statut Membre Dernière intervention 25 juin 2013
18 avril 2012 à 18:54
Bonjour et encore merci de votre aide,

Je vais tester ce soir les lignes de code proposées.

A première vue, cela ne correspond pas aux événements que je souhaite récupérer pour les contrôles ListeBox, TexteBox et ComboBox (Enter et BeforeUpdate). Mais peut-être que dans l'exemple présenté du maodule de classe CtrlEvents, on peut atteindre ces événements ?

Merci encore

RLAPT
0
cs_rlapt Messages postés 63 Date d'inscription lundi 6 octobre 2003 Statut Membre Dernière intervention 25 juin 2013
18 avril 2012 à 20:01
Re bonjour,

Après essai, il me semble que les événements Enter et BeforeUpdate ne sont toujours pas accessibles. Mais peut être je fais une erreur ?


RLAPT
0
Rejoignez-nous