IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Collection de MSForms.Control et événement BefreUpdate


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 73
    Par défaut Collection de MSForms.Control et événement BefreUpdate
    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 à l'aide d'un module de classe.

    Si je crée des collections basées sur les déclarations suivantes dans un module de classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    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 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public WithEvents ColCtrl As MSForms.Control
    il semble que les événements Enter et BeforeUpdate, sont bien gérés

    Question :
    Comment créer une collection de MSForms.Control et que peut-on mettre dedans ?
    Car l'exécution du code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    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

  2. #2
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut heu.....
    bonjour

    quand on créé une classe de control

    les evenement sont gérés dans la classe de la meme maniere que dans les userforms

    regarde dans ma signature l'effet mouse over des boutons dans un userfom

    a adapter a des textboxs

    au plaisir
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 73
    Par défaut
    Bonjour,

    Toutes mes excuses, je n"ai pas reçu de notification par mail de votre réponse. C'est pourquoi je réponds ssi tard.

    Le lien avec le formulaire CDO vba ne fonctionne pas.

    En fait, ce que je trouve pas c'est quel type d'objet est contenu dans MSForms.Control.

    Comme je l'indique dans ma question, lorsque je rajoute un objet de type Control dans la collection MSForms.Control une erreur 13 apparait.

    Merci de votre réponse.

  4. #4
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    bonjour
    ca n'est pas celui la que je disais le lien c'est ICI!!!!

    regarde comment j'ai fait et reviens si tu a des questions

    au plaisir
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 73
    Par défaut
    Bonjour,

    Merci de votre réponse.

    Effectivement, j'avais bien pensé à une solution de ce genre (avec l'événement KeyDown. Le principe est le même). Mais j'aurais aimé quelque chose de plus "natif" dans vba.

    Par contre, reste le problème de savoir a quoi sert l'événement MSForms.Control.

    J'ai fait des modifications dans mon programme. Maintenant, je n'ai plus une erreur de type, mais une erreur indiquant que le contrôle ne gére pas les événements "Enter" et "BeforeUpdate". Pourtant les contrôles chargés sont des "TexteBox" .

    Si vous avez une idée ou des commentaires, je suis preneur.

    Et merci encore de votre intérêt pour mon problème.

    PS: j'ai enfin trouvé pour rrecevoir un mail lors d'une réponse à mes questions.
    Pour info voici le source :
    Dans une UserForm avec des contrôles TextBox ou autres
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    Private Sub UserForm_Click()
        Set ColCtrl = New Collection
        
        For Each Ctrl In Me.Controls
            Set MdC = New Classe_Ctrl
            Select Case LCase(TypeName(Ctrl))
                Case "textbox"
                    Set MdC.poub = Ctrl
                    ColCtrls.Add MdC
                Case "label"
                
                Case "frame"
                
                Case "checkbox"
                
                Case "optionbutton"
                
                Case "combobox"
                    Set MdC.poub = Ctrl 
                    ColCtrl.Add MdC ' OK bien pris en compte
            Set MdC.ColCtrl = Ctrl 
            ColCtrls.Add MdC ' Erreur 459 (l'objet ou la classe ne gére pas l'événement)            Case "commandbutton"
                    Set ColCtrl = Ctrl
                    ColCtrls.Add MdC
                Case "grid"
                
                Case "listbox"
                    Set MdC.ColCtrl = Ctrl
                    ColCtrls.Add MdC
                Case "multipage"
                
                Case "textbox"
                Case Else
            
            End Select
        Next
    End Sub
    Dans un module :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Public ColCtrls As Collection
    Dans un module de classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Option Explicit
     
    Public WithEvents ColCtrl As MSForms.Control
    Public WithEvents poub As MSForms.ComboBox
     
     
    Private Sub ColCtrl_Enter()
        MsgBox "coucou"
    End Sub

  6. #6
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    bonjour

    bon allez a mon tour

    beforupdate n'existe pas en natif si ce n'est que par une touche
    la touche entrer par exemple

    alors ouvre un nouveau classeur met lui un userform1 avec des tas de textboxs dont 1 assez large que tu nommera "affichage"

    ensuite dans le code du module de l'userform tu met

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub UserForm_Activate()
    classetextbox Me
    End Sub
    ensuite tu ajoute un module standard que tu nommera bien comme tu veux

    dans ce module tu met :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    Option Explicit
    Public texto() As New texteboxe    'initialisation de la classe
    'initialisation de la classe
    Public ctrls As Variant    'variable qui va servir a mémoriser tout les bouton
    Public maform1 As Object    'variable qui va servir a mémoriser l'userform
    Sub classetextbox(uf As Object)
        Set maform1 = uf        'dorénavant maform1 désignera l'userform dans tout le classeur
        Dim e As Long
        'on boucle sur tout les controls dans l'userform
        For Each ctrls In uf.Controls
            'on teste si le type de control est un bouton
            If TypeName(ctrls) = "TextBox" And ctrls.Name <> "affichage" Then
     
                e = e + 1    'on incremente la variablee
                'on regroupe tout les bouton dans la classe
                ReDim Preserve texto(1 To e)
                Set texto(e).Groupetexto = ctrls
            End If
        Next
    End Sub
    maintenant ajoute un module classe que tu nommera "texteboxe"
    et dans cette classe tu met :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    Public WithEvents Groupetexto As MSForms.TextBox
    Dim valeurdepart As String
    Private Sub Groupetexto_Change()
        maform1.affichage = "le textbox " & Groupetexto.Name & vbCrLf & vbCrLf & "est en train d'etre modifié"
    End Sub
     
    'si c'est la touche entrer qui est tapée alors le grand textbox bleu de dira ce qu'il y avait et ce qui il y maintenant
    Private Sub Groupetexto_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
        If KeyCode = 13 Then    ' si l'on appuie sur la touche "entrer"du clavier
            maform1.affichage.Value = "dans le " & Groupetexto.Name & " il y avait :" & vbCrLf & vbCrLf & valeurdepart & _
                                      vbCrLf & vbCrLf & " et  maintenant il y a :" & vbCrLf & vbCrLf & Groupetexto.Value
            Groupetexto.SetFocus
        Else: maform1.affichage = ""
        End If
    End Sub
     
    'au clic de la souris quand tu sélectionnera le textbox il va s'effacer et pres a recevoir les caracteres tapésmais on va _
     garder en memoire le texte de depart
    Private Sub Groupetexto_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    'lorsque que l'on va appuyer sur le clic gauche de la souris la variable "valeurdepart"vaprendre la valeur du textbox
        valeurdepart = Groupetexto.Value
        'on efface le textbox
        Groupetexto = ""
    End Sub
    voila maintenant une classe pour la gestion des textboxs n'a plus de secret pour toi

    j'oubliais au passage::
    Par contre, reste le problème de savoir a quoi sert l'événement MSForms.Control
    n'est pas un evenement c'est un object

    au plaisir
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

Discussions similaires

  1. Création dynamique de controles avec évènement
    Par Crampignon dans le forum VB.NET
    Réponses: 2
    Dernier message: 18/06/2009, 09h44
  2. Controls.Canvas & évènement mouseDown
    Par Kikos31 dans le forum Windows Presentation Foundation
    Réponses: 2
    Dernier message: 14/07/2008, 09h43
  3. Composite Control et évènements
    Par Le-Cortex dans le forum ASP.NET
    Réponses: 11
    Dernier message: 13/11/2007, 10h14
  4. Problèmes user control et événement
    Par gridin dans le forum VB.NET
    Réponses: 3
    Dernier message: 04/05/2007, 14h40
  5. [VB6] la collection controls
    Par tomnie dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 30/04/2003, 17h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo