Insérer dynamiquement un label dans un USF

solquagerius

XLDnaute Junior
Bonjour,

J'ai un problème dans l'insertion dynamique d'un label dans un userform...
Présentement, j'arrive à insérer le label sans problème et à lui affecter un nom (Label1, Label2, etc...).
Je sais que je vais avoir un certain nombre de ces labels, et dans ma macro j'écris directement les procédures associées à ces labels.

En gros : j'insère dynamiquement un label qui a pour nom Label1
Dans ma macro, j'ai une procédure qui s'appelle Sub Label1_Click() que j'ai écrite avant de lancer la macro.
Quand je clique sur le Label1, rien ne se passe...

Qqun a t-il une idée ?
Merci beaucoup !
 

PMO2

XLDnaute Accro
Re : Insérer dynamiquement un label dans un USF

Bonjour,

Il faut construire un module de classe. J'ai répondu, en 2007, à une question similaire à la votre. Je me contente de la reproduire, ci-dessous, et je mets une pièce jointe en exemple.

Bonjour,

Un code exemple qui devrait aller dans votre sens.

POUR FAIRE UN TEST

A - DANS EXCEL
1) Ouvrez un nouveau classeur
2) Nommez une feuille "Data"
3) En colonne A de cette feuille et à partir de "A1" copiez les catégories

CAHIER
CAHIER
CAHIER
CAHIER
CAHIER
PAPIER
PAPIER
PAPIER
STYLO BILLE
STYLO BILLE
STYLO BILLE
STYLO BILLE
TABLEAU

4) En colonne B et à partir de "B1" copiez les articles

132 pages
192 pages
240 pages
50 pages
96 pages
A3
A4
A5
BLEU
NOIR
ROUGE
VERT
NOIR

B - DANS LE VBE

1) Créez un module STANDARD et copiez-y le code suivant

******************
'### Constante à adapter ###
'### (nom de la feuille de ###
'### la liste d'articles) ###
Const MA_BDD As String = "Data"

Type structBase
Count As Long
Position() As Long
Texte() As String
Article() As String
End Type

Public Base As structBase
'_____________________________
Sub GetBDD(Optional dummy As Byte)
Dim var
Dim R As Range
Dim S As Worksheet
Dim i&
Set S = Sheets(MA_BDD)
Set R = S.[a1].CurrentRegion
R.Sort key1:=S.[a1], Order1:=xlAscending, _
key2:=S.[b1], Order1:=xlAscending, header:=xlNo
var = R
With Base
ReDim .Article(1 To UBound(var, 1))
For i& = 1 To UBound(var, 1)
If i& = 1 Then
.Count = 1
ReDim .Texte(1 To .Count)
.Texte(.Count) = var(i&, 1)
Else
If var(i&, 1) <> var(i& - 1, 1) Then
.Count = .Count + 1
ReDim Preserve .Position(1 To .Count)
.Position(.Count - 1) = i& - 1
ReDim Preserve .Texte(1 To .Count)
.Texte(.Count) = var(i&, 1)
End If
End If
.Article(i&) = var(i&, 2)
Next i&
.Position(UBound(.Position)) = i& - 1
End With
End Sub
'_____________________________
Sub Launch()
UserForm1.Show
End Sub
'******************

2) Créez un module de CLASSE et affectez sa propriété (Name) =
clsControlsEvents
et copiez-y le code suivant

'******************
Public WithEvents Lbl As MSForms.Label
Public WithEvents Cmd As MSForms.CommandButton
Public Frm As UserForm
'_____________________________
Private Sub Cmd_Click()
UserForm1.Hide
With Base
.Count = 0
Erase .Position
Erase .Texte
Erase .Article
End With
End Sub
'_____________________________
Private Sub Lbl_Click()
MsgBox Lbl.Tag
End Sub
'******************

3) Créez un UserForm (la propriété (Name) = UserForm1)
et copiez-y le code suivant

'******************
Dim ColLabels As New Collection
Dim ColCommandButtons As New Collection
'_____________________________
Private Sub UserForm_Activate()
Dim obEvents As clsControlsEvents
Dim CBT As MSForms.CommandButton
Dim MP As MSForms.MultiPage
Dim LB As MSForms.Label
Dim i&
Dim j&
Dim PosTop!
Dim ctl As MSForms.Control
Call GetBDD
Set CBT = Me.Controls.Add("forms.CommandButton.1")
CBT.Caption = "Quitter"
Set MP = Me.Controls.Add("forms.MultiPage.1")
MP.Top = 50
MP.Height = 300
MP.Width = 300
For i& = 1 To Base.Count
If i& > 2 Then MP.Pages.Add
MP.Pages(i& - 1).Caption = Base.Texte(i&)
Next i&
j& = 1
PosTop! = 10
For i& = 1 To UBound(Base.Article)
If Base.Position(j&) < i& Then
j& = j& + 1
PosTop! = 2
End If
Set LB = MP.Pages(j& - 1).Controls.Add("forms.Label.1")
LB.Caption = Base.Article(i&)
LB.Tag = "toto" & i&
LB.Top = PosTop!
LB.Left = 10
LB.BackColor = RGB(15, 200, 75)
PosTop! = PosTop! + LB.Height + 10
Next i&
For Each ctl In Me.Controls
If TypeOf ctl Is MSForms.CommandButton Then
Set obEvents = New clsControlsEvents
Set obEvents.Cmd = ctl
Set obEvents.Frm = Me
ColCommandButtons.Add obEvents
End If
If TypeOf ctl Is MSForms.Label Then
Set obEvents = New clsControlsEvents
Set obEvents.Lbl = ctl
Set obEvents.Frm = Me
ColLabels.Add obEvents
End If
Next ctl
'******************

Si je n'ai rien oublié, il n'y a plus qu'à lancer la macro "Launch"
Celle-ci ouvre le UserForm qui, par son évènement Activate, construit,
de manière dynamique, le Multipage (avec le nombre de Pages
qui va bien), les contrôles Label en bonne place et un contrôle
CommandButton. Ces contrôles, par le biais du module de Classe,
se voit associer un évènementiel.
Un truc, qui semble anodin mais qui peut s'avérer fort utile, est
la propriété Tag des contrôles qui peut servir à les distinguer par la suite.

Bien sûr, l'esthétique n'a pas été ma préoccupation et
le résultat visuel est très moche.
A vous de mettre la touche artistique et d'adapter le code à votre projet.

Cordialement.

PMO
Patrick Morange
 

solquagerius

XLDnaute Junior
Re : Insérer dynamiquement un label dans un USF

Bonjour,

je reviens sur le sujet (1 an plus tard...) parcequ'il y a une chose que j'ai pas comprise... J'utilise maintenant fréquemment cette méthode pour ajouter dynamiquement des contrôles dans mon USF, par contre je me demande toujours pourquoi on est obligé de déclarer une collection et d'y ajouter la variable ObEvents (qui est l'instance de classe qui permet de faire une action sur le contrôle créé)....

Si je reprends le code :

Code:
Dim ColLabels As New Collection ' <-- pourquoi est on obligé de mettre cette variable ?

public sub test()
    Dim obEvents As clsControlsEvents
    [...]
    Set obEvents = New clsControlsEvents
    Set obEvents.Lbl = ctl
    Set obEvents.Frm = Me
    ColLabels.Add obEvents '<-- c'est cette ligne là que je ne comprend pas
end sub
 

Discussions similaires

Réponses
3
Affichages
349

Statistiques des forums

Discussions
312 525
Messages
2 089 324
Membres
104 121
dernier inscrit
bobquad01