Userform modifier par code VBA

Bonjour à tous,

Je souhaiterais créer un userform dans le quel je place un bouton pour créer un nombre de zone de textes à l’intérieur du userform.

Pour le moment, j'ai des bouton d'option allant de 1 a 10 que j'arrive à faire fonctionner et un bouton de validation. Je souhaites que sur un clic du bouton de validation, x zones de textes soit créées ou x est une valeur entre 1 et 10 associée à mes bouton d'option.

J'espère que c'est possible et que vous avez une solution pour y arriver =)

Sinon je pense partir sur des zones de texte cachées qui se révèleraient avec un .visible conditionnel pour chaque, mais la solution me parait moins élégante.

Hello Suibaku,

Pour créer un champ dans un userform en cours d'utilisation tu peux utiliser la fonction Controls.Add

Pour plus d'info sur la fonctionnalité tu peux aller sur https://docs.microsoft.com/fr-fr/office/vba/language/reference/user-interface-help/add-method-microsoft-forms

Par exemple pour ajouter une textbox visible appelée Monchamp dans ton userform, tu peux faire:

Controls.Add bstrprogID:="Forms.TextBox.1", Name:="Mon_champ", Visible:=True

Après tu peux gérer sa position en la mettant dans un objet

Set monobjet = Controls.Add("Forms.TextBox.1", "Mon_champ", True)
With monobjet
    .Top = 30
    .Left = 40
    .Height = 20
    .Width = 50
End With

Ca va créer une textbox a l'emplacement 30,40 avec une hauteur de champ de 20 et une largeur de 50. Toutes les propriété d'un champ textbox peuvent être ajoutées

Super ! Merci beaucoup =)

Par contre, les valeurs que j'entre dans le formulaire, j'y accède via textbox1.caption ?

Non dans mon exemple Monchamp.Value. car c'est un textbox

Si j'avais mis

Controls.Add bstrprogID:="Forms.Label.1", Name:="Mon_champ", Visible:=True

ce serait Monchamp.Caption.

Ça sera peut-être plus simple si j'ajoute le code que j'ai fait à partir de ça.

A mesure que je créer plusieurs mon_champ, il va me les numéroté tout seul ?

Private Sub Valider_parametre_Click()

    For x = 1 To valider Step 1

    If x < 6 Then

        Set monobjet = Controls.Add("forms.textbox.1", "mon_champ", True)

            With monobjet

                .Top = 120 + 40 * (x - 1)
                .Left = 80
                .Height = 30
                .Width = 130

            End With                            

    Else

        Set monobjet = Controls.Add("forms.textbox.1", "mon_champ", True)

            With monobjet

                .Top = 120 + 40 * (x - 6)
                .Left = 330
                .Height = 30
                .Width = 130

            End With

    End If

    Next

End Sub

Difficile de te dire avec certitude sans avoir une vision complète mais à priori il faut modifier ton code comme ça:

Private Sub Valider_parametre_Click()

    For x = 1 To valider Step 1

    If x < 6 Then

        Set monobjet = Controls.Add("forms.textbox.1", "mon_champ" & x, True)

            With monobjet

                .Top = 120 + 40 * (x - 1)
                .Left = 80
                .Height = 30
                .Width = 130

            End With                            

    Else

        Set monobjet = Controls.Add("forms.textbox.1", "mon_champ" & x, True)

            With monobjet

                .Top = 120 + 40 * (x - 6)
                .Left = 330
                .Height = 30
                .Width = 130

            End With

    End If

    Next

End Sub

Il va te numéroter le nom du champ avec x qui est variable

Pour le else, il me faut un & x + 5, parce que je veux faire deux colonnes.

Private Sub Valider_parametre_Click()

    For x = 1 To valider Step 1

    If x < 6 Then

        Set monobjet = Controls.Add("forms.textbox.1", "mon_champ" & x, True)

            With monobjet

                .Top = 120 + 40 * (x - 1)
                .Left = 80
                .Height = 30
                .Width = 130

            End With

    Else

        Set monobjet = Controls.Add("forms.textbox.1", "mon_champ" & x + 5, True)

            With monobjet

                .Top = 120 + 40 * (x - 6)
                .Left = 330
                .Height = 30
                .Width = 130

            End With

    End If

    Next

End Sub

Sinon tu n'as pas d'autre influence que la valeur de "valider" qui est une variable qui me contrôle le nombre de boite de dialogue créées.

J'ai essayé d'ajouter des labels devant mes boites de dialogue mais elles n'apparaissent pas. J'ai mis ce bout de code dans la boucle for.

        Set monobjet = Controls.Add("forms.label.1", "Parametre" & x, True)

            With monobjet

                .Top = 120 + 40 * (x - 1)
                .Left = 10
                .Height = 12
                .Width = 60

            End With

Si je comprend comment marche le code, form.label.1 c'est le name de mon label et parametre x c'est le caption de mon label avec enfin true pour visible ?

Non, Forms.Label.1 correspond au type d'objet à ajouter.

Tous les types d'objet sont sur la page Microsoft

ControlProgID value
CheckBoxForms.CheckBox.1
ComboBoxForms.ComboBox.1
CommandButtonForms.CommandButton.1
FrameForms.Frame.1
ImageForms.Image.1
LabelForms.Label.1
ListBoxForms.ListBox.1
MultiPageForms.MultiPage.1
OptionButtonForms.OptionButton.1
ScrollBarForms.ScrollBar.1
SpinButtonForms.SpinButton.1
TabStripForms.TabStrip.1
TextBoxForms.TextBox.1
ToggleButtonForms.ToggleButton.1

Le mieux ce serait de poster un fichier exemple pour que ce soit plus clair.

Je suis nouveau ici, comment je poste un fichier ?

Icone avec le X à côté du x² dans la barre de réponse

Je ne suis pas sûr que ça soit vraiment très éclairant.

La majorité de ce qui se trouve dans le fichier excel n'a pas d'intérêt pour le code

Voilà une code qui devrait correspondre:

Private Sub Valider_parametre_Click()

    For x = 1 To valider Step 1

    If x < 6 Then

        Set monobjet = Controls.Add("forms.textbox.1", "mon_champ" & x, True)

            With monobjet

                .Top = 120 + 40 * (x - 1)
                .Left = 80
                .Height = 30
                .Width = 130

            End With

        Set monobjet = Controls.Add("forms.label.1", "Parametre " & x, True)

            With monobjet

                .Top = 120 + 40 * (x - 1)
                .Left = 10
                .Height = 12
                .Width = 60
                .Caption = "Parametre " & x
            End With

    Else

        Set monobjet = Controls.Add("forms.textbox.1", "mon_champ" & x + 5, True)

            With monobjet

                .Top = 120 + 40 * (x - 6)
                .Left = 330
                .Height = 30
                .Width = 130

            End With

        Set monobjet = Controls.Add("forms.label.1", "Parametre " & x + 5, True)

            With monobjet

                .Top = 120 + 40 * (x - 6)
                .Left = 250
                .Height = 12
                .Width = 60
                .Caption = "Parametre " & x + 5

            End With

    End If

    Next

Valider_parametre.Enabled = False

End Sub

En revanche c'est du one shot. C'est à dire que si on sélectionne 10 et qu'on valide, si après on sélectionne 8 et qu'on valide il laisse 10 paramètres affichés.

Est-ce que ce ne serait pas mieux avec un bouton pour ajouter des paramètres et un pour en supprimer avec un maximum fixé à 10 paramètres?

Il faudrait que j'ajoute une fonction qui tuerait tous les textbox créées lorsque l'on active un bouton option.

Mais pour le moment, c'est pour traiter des données, donc j'affinerais quand j'aurais du temps libre =)

En tout cas merci pour l'aide apporté =)

Par contre, pour récupérer les valeurs entrées dans les textbox, j'utilise mon_champ 1, 2 ect ?

Oui.

Ci-joint quand meme une piste différente pour l'ajout de tes paramètres.

J'ai modifié le userform.

Merci, je jette un oeuil dessus ce soir ou demain.

Wow, c'est génial !

Par contre il va me falloir du temps pour comprendre le code ....

Me.heigth c'est la hauteur du userform ?

Donc si je comprend comment ça marche, au click sur + on a : nb_parametre = partie entière de (((52.5 - 60 )/25)+1) à savoir partie entière de 0.7 =1

On ajoute 25 à me.heigth qui passe à 77.5

on construit une nouvelle textbox avec un label

on vérifie qu'on a entre 1 et 11 parametres

Il me reste plus qu'à coder ce que je veux sur mon bouton de validation.

Par contre, j'ai toujours pas compris comment j'accède au contenus des textbox... Elle se nomment textbox1 textbox2 ect ? ou new_parametre1 2 ect ...

pour accèder au contenu c'est bien nom_textbox.value ?

Au bout de quelques heures de recherches/essais infructueux en passant par des modules de classes et j'en passe. J'ai trouvé ce bout de code qui me permet d'accéder à la valeur dans ma textbox créée dynamiquement

MsgBox Me.Controls("parametre1").Value

Parfait, c'est effectivement la solution pour accéder au champ.

Concernant le code, j'ajuste la hauteur de formulaire Me.Height en fonction du nombre de paramètres.

Le formulaire initial fait 60px. Un champ fait 18px donc j'ajoute 25px pour chaque paramètre en hauteur (pour laisser de la marge).

On a donc la hauteur du formulaire égale à 60px + nombre de paramètres * 25.

J'en déduit donc le nombre de paramètres en faisant (Me.Height - 60)/25. J'ajoute 1 pour qu'il me prenne en compte le prochain paramètre.

Par exemple quand il n'y a pas de paramètres, Me.Height = 60. donc nb_parametre = (60-60)/25 +1 = 1.

Si j'ai déjà un paramètre existant nb_paramètre = (85-60)/25 +1 = 2

La fonction Round est là pour gérer les approximations car quand on spécifie une hauteur a 60 des fois le système la met à 59,xx donc ca ne donne pas un chiffre exact.

Rechercher des sujets similaires à "userform modifier code vba"