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 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
Private Sub UserForm_Initialize()
Call forcenum(Me)
End Sub
Au niveau du module :
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
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
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
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.
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