Bonjour à tous,
Je me suis inspiré du superbe tutoriel D'Emmanuel Tissot sur les modules de classe pour essayer de "simplifier" mon code.
Je souhaite limiter la saisie à certains caractères dans les TextBox commençant par certains caractères. Afin de simplifier plus encore, je souhaitais passer par un module afin de rattacher les TextBox à la classe, et c'est là que ça coince !
Si j'inscrit le code directement dans le UserForm_Initialize, aucun problème, par contre dans le module...
Au niveau du UserForm :
Au niveau du module :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 Private Sub UserForm_Initialize() Call forcenum(Me) End Sub
Et du module de classe :
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 Public Function forcenum(MeForm As Object) Dim Ctl As MSForms.Control Dim MyNumBox As NumBox Set NumBoxes = New Collection For Each Ctl In MeForm.Controls If TypeOf Ctl Is MSForms.TextBox Then If Left(Ctl.Name, 3) = "nxn" Or Left(Ctl.Name, 4) = "anxn" Then Set MyNumBox = New NumBox 'Crée une nouvelle instance Set MyNumBox.TargetBox = Ctl 'Connecte la variable à l'objet NumBoxes.Add MyNumBox 'Ajoute l'instance à la collection End If End If Next End Function
Avec ce code, je n'ai pas de message d'erreur, mais la saisie n'est en rien limitée ! Le code fait bien la boucle dans le module, en passant par chaque contrôle et en "détectant" ceux qui correspondent à mes critères.
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 Public WithEvents TargetBox As MSForms.TextBox Private Sub TargetBox_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) Dim i As Integer i = KeyAscii ' If KeyAscii < 48 Or KeyAscii > 57 Then KeyAscii = 0 If Not (InStr(1, "-0123456789,", Chr(i), vbBinaryCompare) > 0 Or i = 8) Then If i = 46 Then i = 44 Else i = 0 End If End If KeyAscii = i End Sub Private Sub TargetBox_Change() 'Evènement Change de la variable With TargetBox If Len(.Value) - Len(Replace(.Value, ",", "")) > 1 Then .Value = Left(.Value, Len(.Value) - 1) End If If Len(.Value) = 1 And .Value = "," Then .Value = "0," End If If Len(.Value) = 2 And .Value = "-," Then .Value = "-0," End If If Len(.Value) > 1 And Right(.Value, 1) = "-" Then .Value = Left(.Value, Len(.Value) - 1) End If End With End Sub
Une personne plus expérimentée que moi aurait une idée ?
Plutôt que "MeForm as Object", j'ai essayé le "MeForm as UserForm", pour un résultat identique !
En vous remerciant par avance,
Wulfram
Partager