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éer un textbox et un code textbox clic par userform initialize


Sujet :

Macros et VBA Excel

  1. #1
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    1 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 1 150
    Par défaut Créer un textbox et un code textbox clic par userform initialize
    Bonjour,
    Je souhaiterais créer un certain nombre de textbox (qui variera selon les cas) dans un userform.
    Je pense utiliser une boucle dans userform initialize mais je souhaiterais aussi déclencher des actions lors des utilisations des textbox et je pensais utiliser textbox clic.
    Est il possible donc de créer ces n textbox pas userform initialize en incluant une sorte de textbox n clic?


    Je vous remercie du coup de main

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 501
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 501
    Par défaut
    Ouais heu .....
    1) Prévoir un nombre maximum de contrôles, c'est l'opposé du principe dynamique, et ça gaspille des ressources
    2) Ecrire du code qui écrit du code, c'est marrant mais c'est super casse-gueule.
    Dans les 2 cas, la maintenance est absolument dégueulasse.

    On a de meilleurs outils: Les classes.
    L'idée consiste à encapsuler ton contrôle dynamique et ses gestionnaires d'évènements dans une classe, que tu instancieras à la demande.
    Il nous faut d'abord une classe:
    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
    '// Class DynamicTextBox
    '// Classe encapsulant un textbox
    Option Explicit
     
    Private Form As UserForm    '// reference vers le formulaire parent
     
    Private WithEvents TextBox As MSForms.TextBox   '// instance du textbox
                                                    '// On oublie pas le mot clef WithEvents pour pouvoir ecrire les gestionnaires d'evennement
     
        '// pseudo-constructeur (pour nous faciliter la vie)
    Public Sub Create(ByRef Form As UserForm, ByVal Name As String, ByVal Top As Long)
            '// creation et positionnement du textbox
        Set TextBox = Form.Controls.Add("Forms.TextBox.1", Name, True)
        TextBox.Top = Top
    End Sub
     
        '// gestionnaires d'evennements du textbox
    Private Sub TextBox_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
        MsgBox "You clicked on " & TextBox.Name
    End Sub
    Puis, dans un module standard, une fonction utilitaire chargée d'instancier la classe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    '// Module Factory
    Option Explicit
     
        '// Fonction qui encapsule l'instanciation de la classe DynamicBox
    Public Function Create_TextBox(ByRef Form As UserForm, ByVal Name As String, ByVal Top As Long) As DynamicTextBox
        Dim TextBox As DynamicTextBox
        Set TextBox = New DynamicTextBox
        TextBox.Create Form, Name, Top
        Set Create_TextBox = TextBox
    End Function
    Enfin, un peu de code dans le formulaire:
    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
    '// UserForm UserForm1
    Option Explicit
     
    Private Textboxes As Collection '// collection pour ranger les textbox
     
    Private Sub UserForm_Initialize()
        Set Textboxes = New Collection
     
            '// Ajoute 3 textbox dynamiques et les range dans une collection
        Dim i As Integer
        For i = 0 To 2
            Dim TextBox As DynamicTextBox
            Set TextBox = Factory.Create_TextBox(Me, "MyTextBox" & i, i * 20)
            Textboxes.Add TextBox
        Next
    End Sub

  3. #3
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    1 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 1 150
    Par défaut
    deedolith, Je crois avoir compris le mécanisme et l'intérêt de ton codemais loupe une marche.
    J'ai copié tes codes dans un module de classe, un module standard et dans le userform mais rien ne se passe, je ne vois pas trop comment le déclencher.

    PS: petite précision pour l'ordre et le nom des textebox, j'en ai déjà une dans un frame.

  4. #4
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    1 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 1 150
    Par défaut
    Quand de lance à partir d'un module standard userform8.show (c'est le numéro de mon userform), j'obtiens une erreur sur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TextBox As DynamicTextBox
    Erreur de compilation type défini parr l'utilisateur non défini dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private Sub UserForm_Initialize()

  5. #5
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    1 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 1 150
    Par défaut
    Valtrase, ton code a provoqué un plantage complet du fichier "erreur irrémédiable" de mémoire, je n'ai aucune envie de reproduire la chose pour retrouver le nom exact de l'erreur....

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 501
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 501
    Par défaut
    Citation Envoyé par Kestion100 Voir le message
    PS: petite précision pour l'ordre et le nom des textebox, j'en ai déjà une dans un frame.
    Le nom des contrôles dynamique n'a que peu d'importance, la seule exigeance est qu'il soit unique. Calcul le comme tu en as envie (mon code n'a pour but que démonstration).
    Citation Envoyé par Kestion100 Voir le message
    Quand de lance à partir d'un module standard userform8.show (c'est le numéro de mon userform), j'obtiens une erreur sur TextBox As DynamicTextBox:
    Erreur de compilation type défini par l'utilisateur non défini
    As-tu nommé tes modules correctement ?
    Sinon, peux-tu uploader ton fichier ?

  7. #7
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    1 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 1 150
    Par défaut
    En effet, je n'avais pas précisé userform8_initialize
    Avec cette correction, absolument rien ne se passe quand j'ouvre le userform

  8. #8
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    1 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 1 150
    Par défaut
    On est bien d'accord que je copie la partie de ton code classe dans un module de classe, module standard dans un module standard et la fin dans le userform? Et je lance par un userform.show dans un module standard?

    Autre chose, comment intégrer le code que je souhaite inscrire dans mes textbox_click à partir de ton code?

  9. #9
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 501
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 501
    Par défaut
    Citation Envoyé par Kestion100 Voir le message
    On est bien d'accord que je copie la partie de ton code classe dans un module de classe, module standard dans un module standard et la fin dans le userform? Et je lance par un userform.show dans un module standard?
    Oui, et tes modules doivent être nommés correctement.
    La classe s'appelle DynamicTextBox.
    Le module s'appelle Factory.

    Ci joint un fichier exemple:
    Sample.xlsm


    Citation Envoyé par Kestion100 Voir le message
    Autre chose, comment intégrer le code que je souhaite inscrire dans mes textbox_click à partir de ton code?
    Les textbox n'ont pas d'evennement Click, il va te faloir passer par l'evennement MouseDown.

  10. #10
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 501
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 501
    Par défaut
    Citation Envoyé par Kestion100 Voir le message
    En effet, je n'avais pas précisé userform8_initialize
    Non, c'est UserForm_Initialize, quelque soit le nom le nom du formulaire.

  11. #11
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    1 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 1 150
    Par défaut
    Ok, donc j'ai mal nommé les codes, j'ai copier coller tes codes c'est tout.

    Donc je ré essaye avec les bons noms et ça devrait corriger le userform \\ userform8

  12. #12
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    1 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 1 150
    Par défaut
    C'est toujours sub.....()
    Pour les classes?

  13. #13
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 501
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 501
    Par défaut
    Non, ca depend si tu veux retourner une valeur ou non.

  14. #14
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    1 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 1 150
    Par défaut
    Alors là il faut que tu m'aides un peu plus.
    Dans notre cas, quel formalisme utiliser? On attend des valeurs dans certains cas et pas dans d'autre me semble t il?

  15. #15
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 501
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 501
    Par défaut
    Pour faire simple, en VB, il existe 2 type de fonctions:
    - Celles qui renvoient une valeur, par exemple:
    Function MaFunction() As Long

    - Celles qui ne renvoient pas de valeur (aussi appelées procédures), par exemple:
    Sub MaProcedure()

    Les classes sont codées entre autre, avec des fonction, des procédures.
    Une classe représente un objet concret (par exemple: une voiture) ou abstrait (par exemple: un trajet), et définit un certain nombre de services qui s'y rapportent.
    Je t'invite à consulter un bon tutoriel sur ce sujet, tellement il est vaste, et les fonctionnalités que les classes apportent sont puissantes.

  16. #16
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    1 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 1 150
    Par défaut
    J'y vois déjà plus clair pour le cas présent

  17. #17
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    1 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 1 150
    Par défaut
    J'ai changé le nom du module de classe dans propriété..........
    Je dois aussi changer le nom du module classique de la même façon je suppose???

    Interrogation, habituellement, je lance mes initialize depuis des sub dans des modules classiques, je crois comprendre que la tu l'inscrits dans le code "général" du userform (en double cliquant n'important dans le userform). Tu passe sensuite par un show dans un sub de module classique????

  18. #18
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    1 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 1 150
    Par défaut
    Ca y est, c'est bon, j'ai pu créer les 3 textbox. Il restait un initialize userform8...

    Maintenant, je vois que ton code mouse down n'a pas d'effet, je dois donc encore le tavailler.
    C'est là que j'intégrerai le code que je veux développer pour gérer les action aux remplissages?????

  19. #19
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 501
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 501
    Par défaut
    Citation Envoyé par Kestion100 Voir le message
    C'est là que j'intégrerai le code que je veux développer pour gérer les action aux remplissages?????
    Précisément.

  20. #20
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    1 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 1 150
    Par défaut
    Alors ok, je comprends.

    En revanche, pour mon projet, petite complexité, je souhaiterais inscrire le textbox dans un frame, j'ai essayé de dédoubler ton code entre frame et textbox et bien-sûr, d'utiliser le add du texbox dans le frame mais ça a bloqué sur le module create du textbox.

    Je n'ai pas la possibilité immédiate de copier coller le nouveau code

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Créer une textbox
    Par lepgwen dans le forum VBA Access
    Réponses: 2
    Dernier message: 11/06/2008, 13h37
  2. Créer une textBox "mot de passe"
    Par loic20h28 dans le forum C#
    Réponses: 2
    Dernier message: 22/02/2008, 15h48
  3. Créer une textbox en vba
    Par Dryss51 dans le forum IHM
    Réponses: 2
    Dernier message: 24/07/2007, 15h08
  4. Réponses: 2
    Dernier message: 25/05/2007, 14h16
  5. [VB.NET] Créer une textbox from scratch
    Par AP dans le forum Windows Forms
    Réponses: 2
    Dernier message: 07/04/2006, 10h09

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