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 :

Userform textbox objet


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    gestion
    Inscrit en
    Mai 2017
    Messages
    163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : gestion

    Informations forums :
    Inscription : Mai 2017
    Messages : 163
    Par défaut Userform textbox objet
    Bonjour à tous,

    Voilà je cherche à générer un objet "textbox" automatiquement après avoir cliqué sur un bouton,

    et cela doit se faire à l'infini sans limite.

    J'ai bien trouver un tuto sur ce site:

    http://silkyroad.developpez.com/VBA/VisualBasicEditor/

    mais il me fait passer par un module de classe,

    Alors que moi je souhaite que mon code soit contenu dans l'userform voir dans dans un module standard.

    Avez-vous une idée svp ?

  2. #2
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour

    Alors que moi je souhaite que mon code soit contenu dans l'userform voir dans dans un module standard
    Tu peux toujours ajouter dynamiquement un contrôle activex.
    En utiliser les évènements ne sera par contre pas possible comme tu l'entends (sans module de classe).

  3. #3
    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
    bonsoir
    ou alors ajouter ton textbox et écrire dynamiquement le code de son évènement mais c'est un truc de fou si ca doit se répéter indéfiniment donc module classe

    apres tu peut ecrire le code de ta classe en commentaire dans le code de ton userform et le réimplanter dans un module classe dynamiquement

    j'avais fait cela pour un demandeur il y a pas mal de temps mais on devrait pouvoir retrouver la discussions
    l'intérêt de cette méthode et d'avoir un module userform transportable
    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

  4. #4
    Membre confirmé
    Homme Profil pro
    gestion
    Inscrit en
    Mai 2017
    Messages
    163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : gestion

    Informations forums :
    Inscription : Mai 2017
    Messages : 163
    Par défaut Probable somution
    J'ai trouvé un petit bout de code sur ce lien:

    http://silkyroad.developpez.com/VBA/UserForm/#LIV-H

    Qu'en pensez-vous ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Private Sub CommandButton1_Click()
        Dim Obj As Control
     
        Set Obj = Me.Controls.Add("forms.Textbox.1")
        With Obj
            .Name = "monTextBox"
            .Left = 140
            .Top = 30
            .Width = 50
            .Height = 20
        End With
     
        MsgBox Obj.Name & " ajouté dans l'UserForm."
    End Sub
    Cela ne résout pas tout le problème mais il permet d'avancer un peu non ?

    Problème, j'ai l'impression qu'il crée les textbox les uns sur les autres et non au dessous dans ma combobox,

    Donc à chaque fois qu'un textbox est crée, il cache le précedent.

    Avez-vous une piste pour remédier à ça ?

  5. #5
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Donc à chaque fois qu'un textbox est crée, il cache le précedent.
    Et tu t'en étonnes ? Vraiment ?
    Rien d'étonnant puisque tu donnes les mêmes propriétés de positionnement (140, 30, 50,20) à chacun d'eux ! Ils se trouvent tous au même endroit et avec les mêmes dimensions.

    Une piste pour y remédier ? --->> un compteur de positionnement, soit vertical, soit horizontal, selon ce que tu cherches à faire.
    Cela ne résout pas tout le problème mais il permet d'avancer un peu non ?
    Pas vraiment. Tu te retrouves avec des textboxes sans vraiment pouvoir les utiliser totalement.

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Bonjour Franck,

    Pas testé, mais aucun doute... (Ca me semble tout de même plus simple et plus propre que ce qui avait été proposé par ailleurs...)

    Merci pour le demandeur initial.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  7. #7
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Bonjour,

    Voici une piste avec un module de classe pour la gestion des évènements (ici, pour l'exemple, un seul, l'évènement "Change()" ).

    Le code ci-dessous est à mettre dans le module du formulaire et les variables doivent être en tête de module :
    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    Dim Txt() As New Classe1
    Dim Haut As Long
    Dim I As Long
     
    Private Sub CommandButton1_Click()
     
        Dim Obj As Control
        Dim MargeH As Integer
        Dim MargeG As Integer
        Dim H As Integer
        Dim L As Integer
        Dim Larg As Integer
     
        MargeH = 10 'espace entre contrôles
        MargeG = ComboBox1.Left 'idem ComboBox
     
        H = ComboBox1.Height 'idem ComboBox
        L = ComboBox1.Width 'idem ComboBox
     
        'si pas encore initialisé
        If Haut = 0 Then Haut = ComboBox1.Top
     
        'céation du contrôle ActiveX
        Set Obj = Me.Controls.Add("forms.Textbox.1")
     
        'calcul du top
        Haut = Haut + H + MargeH
     
        'positionnement
        With Obj
     
            .Left = MargeG
            .Top = Haut
            .Width = L
            .Height = H
     
        End With
     
        'ajout dans le tableau pour la gestion des évènements
        I = I + 1
        ReDim Preserve Txt(1 To I)
        Set Txt(I).GroupeTxt = Obj
     
        'ajout de la barre verticale sur la Form
        Me.ScrollBars = fmScrollBarsVertical
        Me.ScrollHeight = Haut
     
    End Sub
    et celui-ci est à mettre dans un module de classe nommé Classe1 (nom par défaut !) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Public WithEvents GroupeTxt As MSForms.TextBox
     
    Private Sub GroupeTxt_Change()
     
        'ici, créer le code nécessaire pour ton utilisation...
     
        'pour le test...
        MsgBox "Le TextBox porte le nom '" & GroupeTxt.Name & "' et sa valeur est : " & GroupeTxt.Text
     
    End Sub
    Les TextBox que tu va créer dynamiquement vont se positionner les uns sous les autres et alignés à ton ComboBox nommé "ComboBox1" (adapter dans le code si différent !) et de même taille.
    Pour l'évènement "Change()" et pour le test, quand tu vas entrer une valeur dans un des TextBox, une boite de message va apparaître et te donner le nom du TextBox et le texte qu'il contient

  8. #8
    Membre confirmé
    Homme Profil pro
    gestion
    Inscrit en
    Mai 2017
    Messages
    163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : gestion

    Informations forums :
    Inscription : Mai 2017
    Messages : 163
    Par défaut
    Merci pour cette réponse mais je me rend compte que je ne peux pas utiliser de combobox,

    Je voulais tout faire à l'intérieur mais c'est assez compliqué et inaproprié.

    je voudrai créer 5 textbox de même taille les uns à coté des autre dans un frame

    et au click d'un CommandButton1 cinq nouveau textbox se crée juste en dessous avec les mêmes dimensions que ceux du dessus.

    Cela créerai plusierus étages de textbox à chaque click et je positionnerai le CommandButton1 au niveau de l'étage le plus bas.

    vous avez des pistes svp pour ce truc assez complexe je pense ?

  9. #9
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Salut.

    Pourriez-vous rédiger une synthèse propre, bien codée et utilisable par le demandeur? Pour compléter la remarque de Jacques sur le bien et le mieux, je pense qu'il est utile que le demandeur puisse s'y retrouver à un moment donné. Libre à vous, par la suite, de développer vos solutions sur le forum Contribuez, voire en demandant l'ouverture d'un projet. .

    Mais honnêtement, sans synthèse, je ne vois pas bien ce que le demandeur va pouvoir faire de tout ceci, vu le niveau qu'il a lui-même annoncé...
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  10. #10
    Membre Expert
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 817
    Billets dans le blog
    10
    Par défaut
    Bonjour,

    Voici un exemple, vite codé, tout simple d'utilisation.

    1 Userform comportant :
    > 5 textbox (TextBox1, TextBox2, ..., TextBox5)
    > 1 CommandButton1 (caption : OK)
    > 1 ListBox1 (régler la propriété Width à 345)
    placés comme ceci :
    Nom : userform.png
Affichages : 238
Taille : 7,5 Ko

    Le code de l'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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    Option Explicit
     
    Private EnableEvents As Boolean
     
    Private Sub CommandButton1_Click()
    Dim i As Byte, rep As Integer
        rep = vbNo
        If ListBox1.ListIndex <> -1 Then rep = MsgBox("Voulez-vous modifier la ligne sélectionnée?", vbYesNo + vbQuestion)
        If rep = vbNo Then
            ListBox1.AddItem TextBox1
            For i = 1 To 4
                ListBox1.List(ListBox1.ListCount - 1, i) = Me.Controls("TextBox" & i + 1)
                Me.Controls("TextBox" & i) = ""
            Next
            TextBox5 = ""
            TextBox1.SetFocus
        Else
            EnableEvents = True
            For i = 0 To 4
                ListBox1.List(ListBox1.ListIndex, i) = Me.Controls("TextBox" & i + 1)
                Me.Controls("TextBox" & i + 1) = ""
            Next
            TextBox5 = ""
            TextBox1.SetFocus
            EnableEvents = False
            ListBox1.ListIndex = -1
        End If
    End Sub
     
    Private Sub ListBox1_Click()
    Dim i As Byte
     
        If ListBox1.ListIndex = -1 Or EnableEvents Then Exit Sub
        For i = 0 To 4
            Me.Controls("TextBox" & i + 1) = ListBox1.List(ListBox1.ListIndex, i)
        Next
    End Sub
     
    Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
    Dim rep As Integer
        If ListBox1.ListIndex = -1 Then Exit Sub
        rep = MsgBox("Voulez-vous supprimer la ligne sélectionnée?", vbYesNo + vbQuestion)
        If rep = vbYes Then
            ListBox1.RemoveItem (ListBox1.ListIndex)
        End If
    End Sub
     
    Private Sub TextBox5_Exit(ByVal Cancel As MSForms.ReturnBoolean)
        CommandButton1.SetFocus
    End Sub
     
    Private Sub UserForm_Activate()
    Dim i&, ArrCol
        TextBox1.SetFocus
        ListBox1.ColumnCount = 5
        ListBox1.ColumnWidths = "50;50;120;40;80"
        ArrCol = Array(0, 50, 100, 220, 260)
        For i = 1 To 5
            Me.Controls("TextBox" & i).Width = Split(Replace(ListBox1.ColumnWidths, " pt", ""), ";")(i - 1)
            Me.Controls("TextBox" & i).Left = ArrCol(i - 1) + ListBox1.Left
        Next i
        ListBox1.Width = 345
        CommandButton1.Move TextBox5.Left + TextBox5.Width, TextBox5.Top
    End Sub
    EDIT :
    On remplit les textbox,
    Un clic sur le bouton :
    >> si aucune ligne de la listbox n'est sélectionnée ==> ajoute une ligne et la remplit des infos contenues dans les textbox
    >> si une ligne est sélectionnée ==> demande si l'utilisateur veux modifier cette ligne
    ===>>>> si oui : modifie la ligne et la déselectionne
    ===>>>> si non : ajoute une nouvelle ligne
    >> Vide les textbox
    >> place le focus sur le textbox1
    Un clic sur la listbox ==> remplit les textbox des infos contenues dans cette ligne
    Voilà...

    EDIT 2 : un double clic sur une ligne de la listbox supprime cette ligne

  11. #11
    Invité
    Invité(e)
    Par défaut
    Bonjour

    Citation Envoyé par manufer Voir le message

    Voilà je cherche à générer un objet "textbox" automatiquement après avoir cliqué sur un bouton,

    et cela doit se faire à l'infini sans limite.
    A un moment tu vas quand même être limité par la taille de ton UserForm, je ne vois pas l'intérêt de ta démarche.

    Philippe

  12. #12
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Bonjour Philippe,

    Avec la ScrollBar verticale il aura accès à tous les TextBox (testé sur 100 lignes donc 500 TextBox) mais selon le nombre la gestion va être super coton !!!

  13. #13
    Membre confirmé
    Homme Profil pro
    gestion
    Inscrit en
    Mai 2017
    Messages
    163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : gestion

    Informations forums :
    Inscription : Mai 2017
    Messages : 163
    Par défaut
    Salut Theze,

    J'essaie ça tout de suite Merci beaucoup.

    Salut Philippe,

    Je pense que je vais largement dépasser le millier et cela me permet de ne pas avoir de limite définit.

  14. #14
    Invité
    Invité(e)
    Par défaut
    Re

    Citation Envoyé par manufer Voir le message

    Salut Philippe,

    Je pense que je vais largement dépasser le millier et cela me permet de ne pas avoir de limite définit.
    Je pense que tu devrais revoir ta stratégie et expliquer pourquoi tu veux faire cela, car avec ce nombre de contrôle et suivant ce que tu veux en faire cela risque de ramer sérieusement.

    Philippe

  15. #15
    Membre Expert
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 817
    Billets dans le blog
    10
    Par défaut
    Bonjour,

    @Philippe JOCHMANS :
    Je pense que tu devrais revoir ta stratégie et expliquer pourquoi tu veux faire cela
    D'autant plus qu'avec 5 textbox et 5 listbox (par exemple), voir juste avec 5 combobox selon ce que l'on veux faire, tu fais largement le taf...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. UserForm, TextBox & Controle de saisie
    Par wipMan dans le forum Macros et VBA Excel
    Réponses: 13
    Dernier message: 26/06/2013, 11h35
  2. [XL-2010] userform multipage objet
    Par pilounet54 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 27/08/2012, 08h21
  3. [XL-2010] blocage du userform textbox
    Par tompom3108 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 05/04/2012, 15h56
  4. userform --> textbox valeur par défaut changeante
    Par damsmut dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 10/03/2008, 09h21
  5. [VBA-E] userform TextBox
    Par mulanzia2003 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 25/03/2006, 09h18

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