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.
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
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
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.
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.