Bonjour,
Je suis en train de créer une interface pour me simplifier la vie.
Celle-ci servira à contrôler les saisies dans les TextBox de mon Userform.
Pour cela, je me suis grandement inspiré de ce post
Pour l'exemple, on va considérer deux traitements différents, les TextBox impairs = numéro de sécurité sociale, les pairs : majuscules uniquement.
Voici mon code actuel :
Code de l'UserForm :
L'interface nommée ITextbox :
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 Option Explicit Dim TB_SS(30) As New cSecuSociale Dim WithEvents TBevent_SS As cSecuSociale Dim TB_NOMS(30) As New cMajuscules Dim WithEvents TBevent_Nom As cMajuscules Private Sub UserForm_Initialize() Dim Ctrl As Control, i As Byte For Each Ctrl In Me.Controls If TypeOf Ctrl Is MSForms.TextBox Then If i Mod 2 = 0 Then Set TBevent_SS = New cSecuSociale TB_SS(i).Add TBevent_SS, Ctrl Else Set TBevent_Nom = New cMajuscules TB_NOMS(i).Add TBevent_Nom, Ctrl End If i = i + 1 End If Next Ctrl End Sub Private Sub UserForm_Terminate() Erase TB_SS Erase TB_NOMS End Sub
Module de classe cSecuSociale
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 Option Explicit Public Sub OnKeyDown(TextBox As MSForms.TextBox, KeyCode As MSForms.ReturnInteger, Shift As Integer) End Sub Public Sub OnKeyPress(TextBox As MSForms.TextBox, ByVal KeyAscii As MSForms.ReturnInteger) End Sub
Module de classe cMajuscules
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 Option Explicit Implements ITextBox Private WithEvents T_Bx As MSForms.TextBox Private T_Appel As ITextBox Event KeyDown(TextBox As MSForms.TextBox, KeyCode As MSForms.ReturnInteger, Shift As Integer) Public Sub Add(HEvent As cSecuSociale, TBox As MSForms.TextBox) If Not HEvent Is Nothing And Not TBox Is Nothing Then If T_Appel Is Nothing Then Set T_Appel = HEvent If T_Bx Is Nothing Then Set T_Bx = TBox End If End If End Sub Private Sub ITextBox_OnKeyDown(TextBox As MSForms.IMdcText, KeyCode As MSForms.ReturnInteger, Shift As Integer) Select Case KeyCode Case 96 To 105 'chiffres pavé numérique If Shift = 1 Then KeyCode = 0 If Len(TextBox.Text) = 15 Then KeyCode = 0 Case 48 To 57 'chiffre touches clavier alphanumérique If Shift = 0 Then KeyCode = 0 If Len(TextBox.Text) = 15 Then KeyCode = 0 Case 8, 9, 16, 46 'touches retour arrière, TAB, Shift, Suppr 'action à voir Case Else KeyCode = 0 End Select End Sub Private Sub T_Bx_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) Call T_Appel.OnKeyDown(T_Bx, KeyCode, Shift) End Sub Private Sub ITextBox_OnKeyPress(TextBox As MSForms.IMdcText, ByVal KeyAscii As MSForms.ReturnInteger) End Sub
Au départ, avant de me lancer dans ce projet, j'imaginais créer, depuis l'userForm, une unique variable tableau globale de type ITextbox qui comprendrait tous mes textbox.
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 Option Explicit Implements ITextBox Private WithEvents T_Bx As MSForms.TextBox Private T_Appel As ITextBox Event KeyPress(TextBox As MSForms.TextBox, KeyAscii As MSForms.ReturnInteger) Public Sub Add(HEvent As cMajuscules, TBox As MSForms.TextBox) If Not HEvent Is Nothing And Not TBox Is Nothing Then If T_Appel Is Nothing Then Set T_Appel = HEvent If T_Bx Is Nothing Then Set T_Bx = TBox End If End Sub Private Sub ITextBox_OnKeyPress(TextBox As MSForms.IMdcText, ByVal KeyAscii As MSForms.ReturnInteger) Select Case KeyAscii Case 32 'espace KeyAscii = 0 Case 45 'trait d'union If Len(TextBox.Text) = 0 Then KeyAscii = 0 Case 65 To 90 'majuscules Case 97 To 122 'minuscules KeyAscii = KeyAscii - 32 Case Else KeyAscii = 0 End Select End Sub Private Sub T_Bx_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) Call T_Appel.OnKeyPress(T_Bx, KeyAscii) End Sub Private Sub ITextBox_OnKeyDown(TextBox As MSForms.IMdcText, KeyCode As MSForms.ReturnInteger, Shift As Integer) End Sub
Puis, la répartition entre chaque type de classe se serait faite dans l'initialize.
En "faux code", voici ce que j'imaginais faire et qui (bien entendu) ne fonctionne pas :
Faux code de l'UserForm :
Pensez-vous cela réalisable tout de même?
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 Option Explicit Dim TB(30) As ITextbox Private Sub UserForm_Initialize() Dim Ctrl As Control, i As Byte For Each Ctrl In Me.Controls If TypeOf Ctrl Is MSForms.TextBox Then If T Mod 2 = 0 Then Set TB(i) = New cSecuSociale TB(i).Add Ctrl Else Set TB(i) = New cMajuscules TB(i).Add Ctrl End If i = i + 1 End If Next Ctrl End Sub Private Sub UserForm_Terminate() Erase TB End Sub
Parce qu'en fait, à terme, je vais avoir une dizaine de "types" de textbox, donc une dizaine de classes et donc, une dizaine de variables tableaux à déclarer dans l'UserForm...
Partager