bonjour a tous
depuis quelques jour je m'emploie a reduire mes codes
aujourdh'ui je suis sur mon effet mouse over sur les controls dans l'userform
le tout gérer par une classe
cela dit pour chaque type de control une classecontrol est instanciée
y a t il un moyen de regrouper les control qui ont le meme type d'evenement et de propriété
exemple les commandbutton,les labels ,les checkboxs,les optionButtons ont tous un evenements click et une caption ,un backcolor,font.color,forecolor
regrouper ces controls dans la memeinstance reduirait forcement les intances de la classecontrol
seulement dans la classecontrol il y a en haut de module
groupe..... representant chaque type de control
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 Public WithEvents GroupeBouton As MSForms.CommandButton Public WithEvents Groupeusf As MSForms.UserForm Public WithEvents Groupelabel As MSForms.Label Public WithEvents Groupeopt As MSForms.OptionButton Public WithEvents Groupecheckbox As MSForms.CheckBox Public WithEvents GroupeImage As MSForms.Image
enfin bref je vous donne les codes en entier pour que vous puissiez juger
dans le userform on va mettre
les arguments apres me sont facultatif vous pouvez simplement mettre "memo Me"
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 Private Sub UserForm_Activate() memo Me, , , True, True End Sub
dans un module standard on vamettre ceci:
ce module va servir a mettre chaque control dans leur instances de la classecontrol
comme vous pouvez le constater des le depart on a chaque variable tableau representant un type de control instancier une classe (c'est ce qui me gene un peu je dois dire )
maintenant la classecontrol
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63 Option Explicit Public bouton() As New classe_forme 'initialisation de la classe Public usf() As New classe_forme Public labelo() As New classe_forme Public optbouton() As New classe_forme Public checko() As New classe_forme Public stImage() As New classe_forme Dim a, e, i, d, s, c, z Public ctrls As Object 'variable qui va servir a memoriser tout les bouton Public maform As Object 'variable qui va servir a memoriser l'userform Public oldbouton As String, oldlabel As String, oldcheckbox As String, oldoptionbouton As String Public sfontbold As Boolean, sfontItalic As Boolean Public coulover As Variant, coultextover As Variant Sub memo(uf As Object, Optional backcouleur As Variant = vbRed, Optional couleurtext As Variant = vbWhite, Optional ftbold As Boolean = False, Optional ftitalic As Boolean = False) coulover = backcouleur coultextover = couleurtext sfontbold = ftbold sfontItalic = ftitalic Set maform = uf 'dorénavant maform designera l'userform dans tout le classeur Dim e As Long 'on boucle sur tout les controls dans l'userform For Each ctrls In uf.Controls If TypeName(ctrls) = "CommandButton" Then 'on memorise leur couleur de base dans leur propre tag au cas ou on voudrais avoir l'effet mouse over _ appliquer dans la classe sur le move des boutons dans cet exemplaire exemple ctrls.Tag = ctrls.BackColor & ":" & ctrls.ForeColor If ctrls.Font.Bold = True Then ctrls.Tag = ctrls.Tag & ":oui" Else: ctrls.Tag = ctrls.Tag & ":non" If ctrls.Font.Italic = True Then ctrls.Tag = ctrls.Tag & ":oui" Else: ctrls.Tag = ctrls.Tag & ":non" a = a + 1 'on regroupe tout les bouton dans la classe ReDim Preserve bouton(1 To a) Set bouton(a).GroupeBouton = ctrls ElseIf TypeName(ctrls) = "Label" Then e = e + 1 'on regroupe tout les label dans la classe ReDim Preserve labelo(1 To e) Set labelo(e).Groupelabel = ctrls ElseIf TypeName(ctrls) = "OptionButton" Then i = i + 1 'on regroupe tout les OptionButton dans la classe ReDim Preserve optbouton(1 To i) Set optbouton(i).Groupeopt = ctrls ElseIf TypeName(ctrls) = "CheckBox" Then i = i + 1 'on regroupe tout les CheckBox dans la classe ReDim Preserve checko(1 To i) Set checko(i).Groupecheckbox = ctrls ElseIf TypeName(ctrls) = "Image" Then d = d + 1 'on regroupe tout les CheckBox dans la classe ReDim Preserve stImage(1 To d) Set stImage(d).GroupeImage = ctrls End If Next ReDim Preserve usf(1) Set usf(1).Groupeusf = uf End Sub
voila alors y a t il un moyen de reduire ce code
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45 Public WithEvents GroupeBouton As MSForms.CommandButton Public WithEvents Groupeusf As MSForms.UserForm Public WithEvents Groupelabel As MSForms.Label Public WithEvents Groupeopt As MSForms.OptionButton Public WithEvents Groupecheckbox As MSForms.CheckBox Public WithEvents GroupeImage As MSForms.Image Dim truc As OLEObjects 'EVENEMENT MouseMove DE TOUS LES BOUTONS Public Sub GroupeBouton_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) If oldbouton <> "" Then remet_oldcontrol_normal If GroupeBouton.BackColor <> vbRed Then GroupeBouton.BackColor = coulover: GroupeBouton.ForeColor = coultextover: GroupeBouton.Font.Bold = sfontbold: GroupeBouton.Font.Italic = sfontItalic oldbouton = GroupeBouton.Name End If End Sub 'EVENEMENT Mousemove DE L USERFORM Private Sub Groupeusf_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) ' si un bouton a été survolé oldbouton n'est plus vide alors If oldbouton <> "" Then remet_oldcontrol_normal End Sub 'EVENEMENT Click DE TOUS LES LABELS Private Sub Groupelabel_Click() MsgBox "coucou je suis un " & TypeName(Groupelabel) & vbCrLf & "mon nom est " & Groupelabel.Name End Sub 'EVENEMENT Click DE TOUS LES OPTIONBOUTON Private Sub Groupeopt_Click() MsgBox "coucou je suis un " & TypeName(Groupeopt) & vbCrLf & "mon nom est " & Groupeopt.Name End Sub 'EVENEMENT Click DE TOUS LES CHECKBOXS Private Sub Groupecheckbox_Click() MsgBox "coucou je suis un " & TypeName(Groupecheckbox) & vbCrLf & "mon nom est " & Groupecheckbox.Name End Sub 'EVENEMENT Click DE TOUtes LES Images Private Sub GroupeImage_Click() MsgBox "coucou je suis un " & TypeName(GroupeImage) & vbCrLf & "mon nom est " & GroupeImage.Name End Sub 'REMET LE DERNIER BOUTON SURVOLE A SON ETAT INITIALen utilisant la variables "oldcontrol" qui contient le nom du dernier bouton survolé Sub remet_oldcontrol_normal() maform.Controls(oldbouton).BackColor = Split(maform.Controls(oldbouton).Tag, ":")(0) maform.Controls(oldbouton).ForeColor = Split(maform.Controls(oldbouton).Tag, ":")(1) If Split(maform.Controls(oldbouton).Tag, ":")(2) = "non" Then maform.Controls(oldbouton).Font.Bold = False If Split(maform.Controls(oldbouton).Tag, ":")(3) = "non" Then maform.Controls(oldbouton).Font.Italic = False End Sub
merci pour le retour au plaisir
Partager