OVH Cloud OVH Cloud

dupliquer des contrôles dans une Form

10 réponses
Avatar
supers03
Bonjour =E0 tous,

j'aimerai pouvoir dupliquer des labels et des rectangles dans ma Form,
le tout dynamiquement (c'est =E0 dire une fois la macro lanc=E9e)
J'ai essay=E9

Load Label1(1)
Label1(1).Visible =3D True

mais lors de l'ex=E9cution de la macro j'ai l'erreur suivant :
=AB Erreur de compilation : Nombre d'arguments incorrect ou
affectation de propri=E9t=E9s incorrecte =BB

Quelqu'un saurrait-il faire cel=E0 ???

10 réponses

Avatar
michdenis
Bonjour Super03,

Un exemple de Frédéric Sigonneau sur comment insérer un bouton
de commande et le code associé à un fomulaire sur le volet.


'======================= 1
'ajoute un commandbutton à un userform existant
'(avec le code de son événement Click)

Sub AddBouton()
Dim Usf As Object, btn As Object
Set Usf = ThisWorkbook.VBProject.VBComponents("Userform1")
Set btn = Usf.Designer.Controls.Add("forms.commandbutton.1")
With btn
.Caption = "Cliquer ici !..."
.Left = 60: .Top = 50
End With
With Usf.CodeModule
X = .CountOfLines
.insertlines X + 1, "Sub CommandButton1_Click()"
.insertlines X + 2, " MsgBox ""coucou"""
.insertlines X + 3, " unload Me"
.insertlines X + 4, "End Sub"
End With
VBA.UserForms.Add (Usf.Name)
UserForms(UserForms.Count - 1).Show
End Sub 'fs
'======================

Salutations!



a écrit dans le message de news:
Bonjour à tous,

j'aimerai pouvoir dupliquer des labels et des rectangles dans ma Form,
le tout dynamiquement (c'est à dire une fois la macro lancée)
J'ai essayé

Load Label1(1)
Label1(1).Visible = True

mais lors de l'exécution de la macro j'ai l'erreur suivant :
« Erreur de compilation : Nombre d'arguments incorrect ou
affectation de propriétés incorrecte »

Quelqu'un saurrait-il faire celà ???
Avatar
Michel Gaboly
Bonsoir,

As-tu pensé à la méthode simple qui consiste à créer dés le d épart sur le UserForm tous les objets dont tu peux avoir
besoin, et à mettre à False (fenêtre propriétés ou événemen t Initialize) la propriété Visible de ceux qui ne doivent pas
étre affichés au départ.

Ensuite, dans des procédures événementielles, tu affiches et/ou tu masques ce qui doit l'être.

Pas possible ?



Bonjour à tous,

j'aimerai pouvoir dupliquer des labels et des rectangles dans ma Form,
le tout dynamiquement (c'est à dire une fois la macro lancée)
J'ai essayé

Load Label1(1)
Label1(1).Visible = True

mais lors de l'exécution de la macro j'ai l'erreur suivant :
« Erreur de compilation : Nombre d'arguments incorrect ou
affectation de propriétés incorrecte »

Quelqu'un saurrait-il faire celà ???




--
Cordialement,

Michel Gaboly
www.gaboly.com

Avatar
supers03
Merci bien pour cet exemple, mais malheuresement ça ne marche pas,
petite erreur d'execution :
"La méthode 'VBProject' de l'objet '_Workbook' a échoué"

Michdenis, une petie idée?

Merci d'avance,
Sylvain
Avatar
Michel Gaboly
Bonsoir,

Pour utiliser ce genre de code il faut avoir coché dans les référen ces (menu Outils de l'environnement VBE) "Microsoft
Visual Basic for Applications Extensibility".


Merci bien pour cet exemple, mais malheuresement ça ne marche pas,
petite erreur d'execution :
"La méthode 'VBProject' de l'objet '_Workbook' a échoué"

Michdenis, une petie idée?

Merci d'avance,
Sylvain




--
Cordialement,

Michel Gaboly
www.gaboly.com

Avatar
supers03
Michel Gaboly :

Désolé j'étais en train de répondre quand tu m'as répondu. Il ne
m'est pas possible de mettre les objets sur la Form dès le début
parce que je n'ai absolument aucune idée du nombre d'éléments qu'il
faudra (ça dépendra de l'utilisateur).

Sinon j'ai coché l'option que tu m'as indiqué, mais j'ai une nouvelle
erreur :
"l'accès par programme au projet Visual Basic n'est pas fiable"
puis la même erreur qu'auparavent !!!
Avatar
michdenis
Bonjour Michel,

Barre des menus de la feuille de calcul / outils / macro / sécurité / onglets :éditeurs approuvés

et dans le bas de la fenêtre, tu coches les 2 cases à cocher


Salutations!



a écrit dans le message de news:
Michel Gaboly :

Désolé j'étais en train de répondre quand tu m'as répondu. Il ne
m'est pas possible de mettre les objets sur la Form dès le début
parce que je n'ai absolument aucune idée du nombre d'éléments qu'il
faudra (ça dépendra de l'utilisateur).

Sinon j'ai coché l'option que tu m'as indiqué, mais j'ai une nouvelle
erreur :
"l'accès par programme au projet Visual Basic n'est pas fiable"
puis la même erreur qu'auparavent !!!
Avatar
michdenis
Bonjour Super03,

La procédure que je t'ai proposée ne requiert l'ajout d'aucune référence particulière à ton projet.

Pour la tester :

Ajoute un formulaire que tu nommes "userform1"
Laisse sans bouton et sans code afin de t'assurer qu'il n'y a pas
de conflit dans les noms des objets et dans les déclarations de procédure.
Tu places le code dans un module Standard et tu exécutes la procédure.

Et pis, ça marche !!!

Salutations!



a écrit dans le message de news:
Merci bien pour cet exemple, mais malheuresement ça ne marche pas,
petite erreur d'execution :
"La méthode 'VBProject' de l'objet '_Workbook' a échoué"

Michdenis, une petie idée?

Merci d'avance,
Sylvain
Avatar
supers03
Effectivement ça marche même sans ajouter "Microsoft Visual Basic for
Applications Extensibility", à condition donc de bien cocher les deux
cases dans les sécurités des macro.


MsgBox "coucou"
unload Me

Mais je comprend pas trop le Unload Me : j'aurrai pensé que ça
enlevait le bouton de la form, mais à priori non, après avoir fermé
la MsgBox le bouton reste, et il reste même après que la macro soit
terminée. C'est normal ça ?

En tout cas merci beacoup à tout deux ^_^
Amicalement,
Sylvain
Avatar
michdenis
Bonjour Super03,

'Décharge le formulaire de la mémoire vive
Unload Userform1

Que le bouton reste dans l'autre procédure présentée :
Oui, c'est normal et voulu !

Un autre exemple provenant de ce forum mais je n'ai plus
le nom de son auteur :

Permet de créer un formulaire à la volée et un bouton sur ce formulaire :
Code à copier dans un module Standard.
'---------------------------------
Sub UserForm_aLaVolee()
Dim UF As Object
Dim L As MSForms.Label
Dim CB As MSForms.CommandButton
Dim A$
Dim i&
On Error GoTo fin
'---- Crée dynamiquement un UserForm ----
Set UF = ThisWorkbook.VBProject _
.VBComponents.Add(vbext_ct_MSForm)
With UF
.Properties("Caption") = _
"UserForm à la volée"
.Properties("Height") = 240
.Properties("Width") = 320
End With
'---- Crée le bouton de fermeture ----
Set CB = UF.Designer.Controls _
.Add("forms.CommandButton.1")
With CB
.Caption = "Fermer"
.Left = 200
.Top = 180
End With
'---- Crée le label ----
Set L = UF.Designer.Controls _
.Add("forms.Label.1")
With L
.Caption = "mon texte"
.TextAlign = fmTextAlignCenter
.Left = 20
.Top = 20
.BackColor = vbRed
.BorderStyle = fmBorderStyleSingle
End With
'°°° Ajout du code évènementiel °°°
A$ = "Sub CommandButton1_Click()" & _
vbCrLf & "Unload Me" & _
vbCrLf & "End Sub"
With UF.CodeModule
i& = .CountOfLines
.InsertLines i& + 1, A$
End With
'-----------
A$ = "Sub Label1_Click()" & _
vbCrLf & "MsgBox " & _
"""Vous avez cliqué sur mon texte""" & _
vbCrLf & "End Sub"
With UF.CodeModule
i& = .CountOfLines
.InsertLines i& + 1, A$
End With
'---- Affiche le UserForm ----
VBA.UserForms.Add(UF.Name).Show
'---- Détruit le UserForm ----
ThisWorkbook.VBProject.VBComponents _
.Remove UF
fin:
End Sub
'---------------------------------


Salutations!





a écrit dans le message de news:
Effectivement ça marche même sans ajouter "Microsoft Visual Basic for
Applications Extensibility", à condition donc de bien cocher les deux
cases dans les sécurités des macro.


MsgBox "coucou"
unload Me

Mais je comprend pas trop le Unload Me : j'aurrai pensé que ça
enlevait le bouton de la form, mais à priori non, après avoir fermé
la MsgBox le bouton reste, et il reste même après que la macro soit
terminée. C'est normal ça ?

En tout cas merci beacoup à tout deux ^_^
Amicalement,
Sylvain
Avatar
supers03
En me balladant j'ai finalement trouvé une autre solution :

Dim c As Control
Set c = UserForm1.Controls.Add("Forms.Label.1", "toto", True)
c.Top = 50
c.Left = 50
c.BackColor = vbWhite
c.Caption = "coucou"
UserForm1.Show

Qui a l'avanage de ne pas avoir besoin des définir des niveau de
sécurité spécifique, ni d'ajouter des références.
Par contre, je n'ai pas réussi à adapter le code pour pouvoir
intégrer des procédures, comme c'est le cas pour l'exemple proposé
par Michdenis.

Sylvain