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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 é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

  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
    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?

  4. #4
    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.

  5. #5
    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.

  6. #6
    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

  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
    C'est toujours sub.....()
    Pour les classes?

  8. #8
    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.

  9. #9
    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?

  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
    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.

  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
    J'y vois déjà plus clair pour le cas présent

  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
    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????

  13. #13
    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?????

  14. #14
    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.

  15. #15
    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

  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
    Voilà les codes:
    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    '// DynamicTextBox
     
     
    '// Classe encapsulant un textbox
    Option Explicit
     
    Private Form As UserForm    '// reference vers le formulaire parent
     
    Private WithEvents Frame As MSForms.Frame
       '// 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 FrCreate(ByRef Form As UserForm, ByVal FrName As String, FrTop As Long, ByVal FrWidth As Long, ByVal frHeight As Long)
            '// creation et positionnement du textbox
        Set Frame = Form.Controls.Add("Forms.Frame.1", FrName, True)
     
        Frame.Top = FrTop
        Frame.Width = FrWidth
        Frame.Height = frHeight
     
     
     
    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
    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
    '// DynamicTextBox
    Public CADRE As String
     
     
    '// 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 TxCreate(ByRef Form As UserForm, ByVal FrName As String, ByVal TxName As String, TxTop As Long, ByVal TxWidth As Long, ByVal TxHeight As Long)
            '// creation et positionnement du textbox
     
     
    MsgBox CADRE
        Set TextBox = Form.Controls(CADRE).Controls.Add("Forms.TextBox.1", TxName, True)
     
     
        TextBox.Top = TxTop
        TextBox.Width = TxWidth
        TextBox.Height = TxHeight
     
    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
    Modules cassiques
    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
    '// Module Factory
    'Option Explicit
    Public CADRE As String
     
     
    Public Function FrCreate_Frame(ByRef Form As UserForm, ByVal FrName As String, ByVal FrTop As Long, ByVal FrWidth As Long, ByVal frHeight As Long) As DFrame
        Dim Frame As DFrame
        Set Frame = New DFrame
        FrName = CADRE
        Frame.FrCreate Form, FrName, FrTop, FrWidth, frHeight
     
        Set FrCreate_Frame = Frame
     
    End Function
     
        '// Fonction qui encapsule l'instanciation de la classe DynamicBox
    Public Function TxCreate_TextBox(ByRef Form As UserForm, ByVal FrName As String, ByVal TxName As String, ByVal TxTop As Long, ByVal TxWidth As Long, ByVal TxHeight As Long) As DynamicTextBox
     
        MsgBox CADRE
     
     
        Dim TextBox As DynamicTextBox
     
        Set TextBox = New DynamicTextBox
     
        TextBox.TxCreate Form, FrName, TxName, TxTop, TxWidth, TxHeight
     
        Set TxCreate_TextBox = TextBox
    End Function

    USERFORM
    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
    '// UserForm UserForm1
    'Option Explicit
    Public CADRE As String
    Private Textboxes As Collection '// collection pour ranger les textbox
    Private Frams As Collection '// collection pour ranger les textbox
     
     
    Public Sub UserForm_Initialize()
     
    Userform8.Show 0
     
        Set Textboxes = New Collection
        Set Frams = 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, Frame As DFrame
     
            CADRE = "MyFrame" & i + 3
            Set Frame = Factory.FrCreate_Frame(Me, CADRE, i * 20, 80, 80)
            Frams.Add Frame
    '     Next i
    MsgBox CADRE
    '     For j = 0 To 2
            'Form.Controls(CADRE).Controls.Add
            Set TextBox = Factory.TxCreate_TextBox(Me, CADRE, "MyTextBox" & i, i * 20, 20, 20)
            Textboxes.Add TextBox
        Next i
    End Sub
     
     
     
     
    Private Sub UserForm_Click()
     
    End Sub

    Donc le problème que j'ai:
    J'ai déjà deux frame dans mon userform, j'essaie de différencier en passant par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CADRE = "MyFrame" & i + 3
    pour aller chercher le troisième cadre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set TextBox = Form.Controls(CADRE).Controls.Add("Forms.TextBox.1", TxName, True)
    mais la valeur de ne suit pas les passages de code et dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set TextBox = Form.Controls(CADRE).Controls.Add("Forms.TextBox.1", TxName, True)
    = "" et la textobox s'intègre dansmon frame n°1......pas dans le frame n°3

  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
    C'est OK avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
            CADRE = "MyFrame" & i + 3
     
            ThisWorkbook.Names.Add "CADRE", RefersTo:=CADRE, Visible:=False

  18. #18
    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
    Avec quelques modifications, on peut l'adapter avec n'importe quel conteneur susceptible d'accueillir des contrôles dynamique (formulaire, frame, multipage ect ..).

    Le probleme est que les conteneurs ne sont pas de même type, ni du même type de base, on est donc obligé d'utiliser un type générique (Object) qui offre beaucoup moins de garanties.
    Pour pallier à cela, on va utiliser une assertion:
    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
    '// Class DynamicTextBox
    '// Classe encapsulant un textbox
    Option Explicit
     
    Private WithEvents mTextBox 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 Container As Object, ByVal Name As String, ByVal Top As Long)
            '// creation et positionnement du textbox
        Set mTextBox = Container.Controls.Add("Forms.TextBox.1", Name, True)
        mTextBox.Top = Top
    End Sub
     
        '// gestionnaires d'evennements du textbox
    Private Sub mTextBox_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
        MsgBox "You clicked on " & mTextBox.Name
    End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    '// Module Factory
    Option Explicit
     
        '// Fonction qui encapsule l'instanciation de la classe DynamicBox
    Public Function Create_TextBox(ByRef Container As Object, ByVal Name As String, ByVal Top As Long) As DynamicTextBox
        Debug.Assert TypeOf Container Is UserForm Or TypeOf Container Is Control    '// Assertion pour garantir le type de Container
     
        Dim TextBox As DynamicTextBox
        Set TextBox = New DynamicTextBox
        TextBox.Create Container, Name, Top
        Set Create_TextBox = TextBox
    End Function
    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(Frame1, "MyTextBox" & i, i * 20)
            Textboxes.Add TextBox
        Next
    End Sub

  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
    @Kestion100:
    Ton code est peut être fonctionnel, mais il est très moche.
    Indexer les contrôles par leur nom plutôt que de passer par des références, c'est source d'erreur, qui ne seront pas détectées à la compilation, et aucun garde-fou ne t'en protègeras.

    Tu peux penser que dans un petit projet ce n'est pas grave, mais dans un projet plus conséquent, c'est une source de bug très difficile à détecter qui te fera passer des nuits blanches.
    Autant prendre les bonnes habitudes tous de suite: Privilégie les références.

    A propos, abandonne la notification hongroise, d'une part les types de donnée ne sont utiles que pour le compilateur, d'autre part ça diminue la lisibilité. (FrCreate ça veut dire quoi ? France Create ?)
    Un bon code source doit avant tout être lisible, produire le comportement escompté n'arrive qu'en seconde position.
    Bref, la notation hongroise, c'est de la M**** en branche qui n'apporte rien de bon.

    Tu n'as pas intégré le concept de formulaire, c'est une classe, et tu confond également la portée des variables
    D'un côté CADRE est une variable membre du formulaire, qui n'existe que lorsque le formulaire est instancié, et d'autre part tu as une variable globale CADRE qui n'a rien à voir avec le formulaire
    Les variables globales, c'est le mal, n'en utilise que quand tu as une raison valable (ici, tu n'en as pas).

  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
    Je serais peut être voir certainement ok avec toi mais il faut que tu éclaire ma lanterne: notation hongroise?

+ 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