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 :

Création TextBox via Controls.Add WithEvents


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti Avatar de ylemasson
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Août 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 52
    Par défaut Création TextBox via Controls.Add WithEvents
    Bonjour

    Je souhaite créer des contrôles à la volée sur des formulaires, ce que j'arrive très bien à faire via Controls.Add

    Pour leur ajouter des évènements, je crée des modules de classes WithEvents, par exemple comme dans le code ci-dessous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Public WithEvents tbObjet As MSForms.TextBox
     
     
    Private Sub tbObjet_Change()
     
        MsgBox "Hello!"
     
    End Sub
    Or, je note que tous les évènements ne fonctionnent pas. Par exemple, pour un TextBox, je n'arrive qu'à faire fonctionner l'évènement "onChange".
    pour un commandButton, je n'arrive qu'à activer "onClick"

    Quelqu'un pourrait m'expliquer le pourquoi du comment ?

    Y a-t-il un moyen d'avoir des contrôles avec tous les évènements ?

    Merci

  2. #2
    Membre Expert Avatar de Zekraoui_Jakani
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    1 671
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 671
    Par défaut
    Avec l'évènement "onClick", vous pouvez créer vous-même une multitude d'évènements moyennant l'ouverture d'un sous-formulaire qui propose des actions telles que: ajouter, modifier, supprimer, imprimer, envoyer mail, enregistrer, fermer, ... etc.

  3. #3
    Membre émérite
    Homme Profil pro
    ingénieur d'étude
    Inscrit en
    Juin 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : ingénieur d'étude
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2013
    Messages : 563
    Par défaut
    Bonjour,

    Difficile de vous aider si vous ne fournissez pas votre code...
    Un exemple (simpliste) qui fonctionne :
    • Dans une UserForm nommée UserForm1 :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      Option Explicit
       
      Private CtrlCol As Collection
       
       
      Private Sub UserForm_Initialize()
          Dim Ctrl1 As Object, Ctrl2 As Object, Instance As New Classe1
          Set CtrlCol = New Collection
          Set Ctrl1 = Me.Controls.Add("Forms.TextBox.1")
          Set Ctrl2 = Me.Controls.Add("Forms.TextBox.1")
          Ctrl2.Left = 150
          Call Instance.Init(Ctrl1, Ctrl2)
          CtrlCol.Add Instance
      End Sub
    • Dans un module de classe nommé Classe1 :
      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
      Option Explicit
       
       
      Private WithEvents Ctrl1 As MSForms.TextBox
      Private WithEvents Ctrl2 As MSForms.TextBox
       
       
      Public Sub Init(TBx1 As Object, TBx2 As Object)
          Set Ctrl1 = TBx1
          Set Ctrl2 = TBx2
      End Sub
       
       
      Private Sub Ctrl1_Change()
          Debug.Print "Ctrl1_Change"
      End Sub
       
      Private Sub Ctrl1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
          Debug.Print "Ctrl1_MouseDown"
      End Sub
       
       
      Private Sub Ctrl2_Change()
          Debug.Print "Ctrl2_Change"
      End Sub
       
      Private Sub Ctrl2_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
          Debug.Print "Ctrl2_MouseDown"
      End Sub

    A adapter à votre besoin...

  4. #4
    Membre averti Avatar de ylemasson
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Août 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 52
    Par défaut
    Bonjour

    Merci pour votre réponse. Le seul code utile dans le cadre de ma question, je vous l'ai fourni..

    Je n'ai surement pas été très clair, je vais donc essayer de reformuler ma question.

    Lorsque vous redéfinissez une classe d'objet (par exemple un textbox) en l'intégrant dans une classe withevents,
    vous êtes sensé hériter des évènements relatifs à la classe du contrôle d'origine (textbox).

    Mais étrangement, si vous souhaitez impacter d'autres évènements en ajoutant d'autres subs évènementiels (essayez afterupdate par exemple), l'instance de classe ne réagira pas à ces autres évènements.

    Vous aurez le même problème avec d'autres types de contrôles. Grosso modo, seul quelques évènements sont définissables dans la classe.

    J'ai bien peur qu'il s'agisse d'une limitation inhérante au langage, mais bon on ne sait jamais quelque chose m'échappe peut-être

    Merci en tout cas.

  5. #5
    Membre averti Avatar de ylemasson
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Août 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 52
    Par défaut
    Bonjour

    Je vous remercie, mais ce n'était pas trop le sens de mon message. Je mettais surtout en évidence une incohérence au niveau de l'instanciation d'une classe withevents

    Citation Envoyé par Zekraoui_Jakani Voir le message
    Avec l'évènement "onClick", vous pouvez créer vous-même une multitude d'évènements moyennant l'ouverture d'un sous-formulaire qui propose des actions telles que: ajouter, modifier, supprimer, imprimer, envoyer mail, enregistrer, fermer, ... etc.

  6. #6
    Membre émérite
    Homme Profil pro
    ingénieur d'étude
    Inscrit en
    Juin 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : ingénieur d'étude
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2013
    Messages : 563
    Par défaut
    Bonjour,

    Je n'avais effectivement pas saisi le sens de votre question...
    Avez-vous essayé d'utiliser l'API ConnectToConnectionPoint, tel que décrit dans cette contribution ?

    Cdt

  7. #7
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 122
    Par défaut
    Salut

    Étrange, en utilisant ton code, j'ai bien accès à l'ensemble des propriétés du TextBox
    Nom : 2021-12-13_221300.png
Affichages : 135
Taille : 8,0 Ko

    Je te souhaite une bonne soirée
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  8. #8
    Membre averti Avatar de ylemasson
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Août 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 52
    Par défaut
    Bonjour

    Ce qui est étrange, c'est que vous ne vous êtes pas rendu compte que votre liste est JUSTEMENT
    restreinte, si vous la comparez aux évènements d'un textbox.
    Sans le vouloir, vous venez de mettre le doigt sur le problème !

    Merci pour votre contribution

  9. #9
    Membre Expert
    Avatar de tototiti2008
    Homme Profil pro
    Formateur/développeur
    Inscrit en
    Octobre 2008
    Messages
    1 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Formateur/développeur

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 173
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    Je peux me tromper, mais on dirait qu'il manque les évènements qui sont différents entre une Textbox dans un Userform et une Textbox dans la feuille de calcul (contrôle ActiveX)
    Par exemple, de mémoire, dans la feuille de calcul on a un évènement LostFocus, remplacé par Exit dans un userform
    Un peu comme si on avait 2 classes dont l'une hérite de l'autre (je comprend mal les héritages de classe, dites moi si je m'égare)
    une Textbox générale avec les évènements communs, une Textbox ActiveX dans la feuille de calcul qui hérite de la 1ère, une Textbox dans un Userform qui hérite de la 1ère aussi ?

  10. #10
    Membre Expert
    Avatar de tototiti2008
    Homme Profil pro
    Formateur/développeur
    Inscrit en
    Octobre 2008
    Messages
    1 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Formateur/développeur

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 173
    Billets dans le blog
    2
    Par défaut
    Re,

    Au temps pour moi, les évènements Exit, Enter, AfterUpdate, BeforeUpdate semblent être attachés à la classe Control (j'ai parcouru la bibliothèque MSForms dans l'explorateur d'objets)
    Pas sûr que ça aide, mais ça peut donner des pistes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Option Explicit
     
    Public WithEvents Tbx As MSForms.TextBox
    Public WithEvents TbxCtrl As MSForms.Control
     
     
    Private Sub Tbx_Change()
     
    End Sub
     
    Private Sub TbxCtrl_Enter()
     
    End Sub

  11. #11
    Membre averti Avatar de ylemasson
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Août 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 52
    Par défaut
    Bonjour

    Merci pour votre contribution. Oui c'est bizarre, car de toute façon on part bien d'une instance de classe sur MSForms.textbox, donc on devrait avoir exactement les mêmes évèvements.
    Pour la classe control, oui c'est intéressant, peut-être en faisant un "mix" des deux..

    Merci en tout cas

  12. #12
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 122
    Par défaut
    Citation Envoyé par ylemasson Voir le message
    Or, je note que tous les évènements ne fonctionnent pas. Par exemple, pour un TextBox, je n'arrive qu'à faire fonctionner l'évènement "onChange".
    Comment faite-vous la déclaration de votre instance de classe?

    De mon coté, même si en effet il manque une partie des événements (j'ai du compter avec des moufles...), ceux qui sont présents fonctionnent parfaitement

    Dans un UserForm avec une textbox1 et un CommandButton1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Private C1 As Classe1
     
    Private Sub CommandButton1_Click()
     
    Set C1 = New Classe1
    Set C1.tbObjet = TextBox1
     
    End Sub
    Par contre si vous avez fait votre déclaration d'instance de classe dans le code du bouton... L'instance est détruite au moment du "End Sub"

    [Edit]
    Pour ce qui est des limitations (AfterUpdate, Exit, Enter,...) une recherche sur google et Commentcamarche a fait un article expliquant qu'ils ne sont pas accessibles et qu'il existe (je n'ai pas tout lu) des moyens de contourner ces limitations.
    [/Edit]

    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

Discussions similaires

  1. [XL-2010] BUG ? Controls.Add("Forms.TextBox.1")
    Par mjpmjp dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 19/10/2017, 13h13
  2. [XL-2003] transmettre un paramètre via OnAction (Control.Add)
    Par manudad dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 02/07/2014, 15h46
  3. [C#] Visual 2005 : Sortie d'un textBox via la touche Entrée
    Par Gold.strike dans le forum Windows Forms
    Réponses: 5
    Dernier message: 08/08/2006, 17h03
  4. passage d'onglet à onglet via controle
    Par yorki dans le forum Access
    Réponses: 4
    Dernier message: 15/03/2006, 16h43
  5. [VB6] Création dynamique de controles dans un SSTab
    Par Txomin dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 20/12/2004, 11h13

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