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.