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

  2. #22
    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

  3. #23
    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

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

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

  6. #26
    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
    Je serais peut être voir certainement ok avec toi mais il faut que tu éclaire ma lanterne: notation hongroise?
    Google est ton ami: https://fr.wikipedia.org/wiki/Notation_hongroise
    Cette notation avait du sens lorsque notre seul outil de développement était un simple éditeur texte, mais depuis l'avènement des interfaces graphiques (il y a au moins 30 ans) les environnements de développement (IDE) offrent suffisamment de fonctionnalités pour rendre cette pratique obsolète.
    Oublie cette pratique issue du crétacé.

  7. #27
    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
    Dernière précision, la finalité serait de modifier la valeur d'une autre textbox fixe par la somme de tous ces textbox dynamiques à chaque modification de la valeur de l'un de ces textbox dynamiques.

    Je comprends parfaitement ton discours. N'ayant pas du tout une formation ni même un emploi d'informaticien, j'apprends sur le tas notamment grace aux explications fournies dans ce forum qui devrait être remboursé par la sécu. Mais mes possibilités de mobilisations de temps ne me permet pas d'un prime abord de développer un code ex anté mais je chercher toujours des solutions poir moderniser, systématiser, automatiser, accélérer les tâches des services dans lesquels je travaille grace à cette boîte à outils sans fond qu'est Excel, aussi grace au VBA.

    Merci pour ton aide orienté explications et non seulement solution!!!!

  8. #28
    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
    Je pense qu'il faudra que tu investisses un minimum de temps personnel sur l'apprentissage des bonnes pratiques et du langage.

    Avoir recours aux forums, c'est bien mais:
    1) C'est chronophage.
    2) Les solutions proposées ne sont pas toujours pédagogiques, précise (ça dépend des informations que tu donnes au départ) ou maintenable (ça dépend du niveau des intervenants).

  9. #29
    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 tout cas, je suis dépatouillé de mon blocage pour l'instant. MERCI

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

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