Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Création de contrôles dynamiques

1 réponse
Avatar
Liv'
Bonjour =E0 tous,

Je suis d=E9butant et ceci est mon premier post. Je travaille sous
windows 2000pro et excel 97.

Je travaille actuellement sur une macro qui devrait me permettre de
g=E9rer des bons de commandes et des stocks de materiels.

Je rentre manuellement sur une feuille excel un article et sa
cat=E9gorie (1ere colonne=3Dcat=E9gorie, 2=E8me colonne=3Darticle)...par
exemple, dans la cat=E9gorie "stylo =E0 bille" on trouve les articles
"stylo de couleur noir" ou rouge, bleu...

Voici mon probl=E8me :

j'ai cr=E9e une form (userform1) comportant un multipage (multipage1).

la macro est cens=E9e ajouter une page au multipage pour chaque
cat=E9gorie...et jusque l=E0, aucun probl=E8me, j'ai bien ma page "stylo =E0=

billes", une autre pour les crayons de bois, par exemple et ainsi de
suite...

Mais cette macro serait aussi cens=E9e cr=E9er pour chaque article d'une
cat=E9gorie, une s=E9rie de contr=F4les tels que des frames, labels, textbox=

etc...

Pour faire simple, on va dire que je souhaite cr=E9er sur chaque page un
seul contr=F4le par article, un label par exemple.

On aurait donc, sur la page "stylo =E0 bille", un label "stylo bleu", un
autre "stylo vert"...et bien s=FBr, j'aimerai pouvoir en modifier les
propri=E9t=E9s.

Jai essay=E9 =E0 peu pr=E8s toutes les solutions que j'ai pu trouver sur le
net, mais aucune ne fonctionne.

J'ai presque r=E9ussi =E0 en cr=E9er, le gros probl=E8me c'est que je ne peu=
x
pas donner d'index aux contr=F4les et donc, ne pouvant les nommer, je ne
peux rien en faire.(d'autant que le nombre d'articles et donc, de
contr=F4les =E0 cr=E9er est variable selon ce qu'on rentre sur la feuille
excel)

Si quelqu'un pouvait m'aider, =E7a serait vraiment sympa car je
m'arrache les cheveux sur ce probl=E8me depuis pas mal de temps,
d'autant que ma version d'excel (ou plut=F4t celle qu'on m'impose au
boulot) est assez ancienne et mes connaissances limit=E9es.

En vous remerciant infiniement d'avance.

1 réponse

Avatar
PMO
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