Création de contrôles dynamiques

Le
Liv'
Bonjour à tous,

Je suis débutant 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érer des bons de commandes et des stocks de materiels.

Je rentre manuellement sur une feuille excel un article et sa
catégorie (1ere colonne=catégorie, 2ème colonne=article)par
exemple, dans la catégorie "stylo à bille" on trouve les articles
"stylo de couleur noir" ou rouge, bleu

Voici mon problème :

j'ai crée une form (userform1) comportant un multipage (multipage1).

la macro est censée ajouter une page au multipage pour chaque
catégorieet jusque là, aucun problème, j'ai bien ma page "stylo à=

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

Mais cette macro serait aussi censée créer pour chaque article d'une
catégorie, une série de contrôles tels que des frames, labels, textbox=

etc

Pour faire simple, on va dire que je souhaite créer sur chaque page un
seul contrôle par article, un label par exemple.

On aurait donc, sur la page "stylo à bille", un label "stylo bleu", un
autre "stylo vert"et bien sûr, j'aimerai pouvoir en modifier les
propriétés.

Jai essayé à peu près toutes les solutions que j'ai pu trouver sur le
net, mais aucune ne fonctionne.

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

Si quelqu'un pouvait m'aider, ça serait vraiment sympa car je
m'arrache les cheveux sur ce problème depuis pas mal de temps,
d'autant que ma version d'excel (ou plutôt celle qu'on m'impose au
boulot) est assez ancienne et mes connaissances limitées.

En vous remerciant infiniement d'avance.
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
PMO
Le #5341881
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
Publicité
Poster une réponse
Anonyme