Module de Classe - Contrôle saisie

4 réponses
Avatar
Péhemme
Bonsoir à Tous,

Afin d'améliorer l'aspect des procédures d'un fichier comportant de nombreux
Userform et donc de Textbox, je me lance dans l'utilisation des Modules de
Classe.

À titre d'exemple, j'ai pondu le fichier joint que vous trouverez à
l'adresse :
https://cjoint.com/c/JHislqufDwc
Il s'agit de contrôler la saisie de TextBoxes ; les TextBox1, TextBox2 et
TextBox4 n'accepte que des nombres entiers positifs (s'agissant de dates
j'aviserai plus tard les limites des saisies des jours et mois).
Mon problème actuel concerne le TextBox3 : il s'agit d'accepter le signe "-"
(caractère 45) mais si et seulement si il est en 1ère position.
Mon module de classe est rédigé comme suit :
Option Explicit
Public WithEvents TBEntierPositif As MSForms.Textbox
Public WithEvents TBEntierPosOuNeg As MSForms.Textbox
Private Sub TBEntierPositif_KeyPress(ByVal KeyAscii As
MSForms.ReturnInteger)
'=====================================
'N'accepte que les nombres entiers positifs *
'=====================================
If KeyAscii < 48 Or KeyAscii > 57 Then KeyAscii = 0
End Sub
Private Sub TBEntierPosOuNeg_KeyPress(ByVal KeyAscii As
MSForms.ReturnInteger)
'================================================
'N'accepte que les nombres entiers (positifs ou négatifs) *
'================================================
Select Case KeyAscii
Case 45, 48 To 57
Case Else
KeyAscii = 0
End Select
End Sub

Quel est selon vous les modifications à apporter à la rédaction de cette
seconde macro afin d'atteindre mon objectif ?

Merci d'avance de votre aide
Michel

4 réponses

Avatar
MichD
Bonjour,
Essaie comme ceci :
'-------------------------------
Private Sub TBEntierPosOuNeg_KeyPress(ByVal KeyAscii As
MSForms.ReturnInteger)
'========================================================= 'N'accepte que les nombres entiers (positifs ou négatifs) *
'=========================================================
If TBEntierPosOuNeg = "" And KeyAscii = 45 Then
KeyAscii = 45
Else
Select Case KeyAscii
Case 45, 48 To 57
Case Else
KeyAscii = 0
End Select
End If
End Sub
'-------------------------------
N.B.- Tu pourrais utiliser seulement une variable comme textbox et tu
utilises un Select Case sur le nom du texbox pour définir les conditions
spécifiques à chacun.
MichD
Avatar
MichD
Le 08/08/20 à 16:05, MichD a écrit :
Bonjour,
Essaie comme ceci :
'-------------------------------
Private Sub TBEntierPosOuNeg_KeyPress(ByVal KeyAscii As
MSForms.ReturnInteger)
'========================================================= > 'N'accepte que les nombres entiers (positifs ou négatifs) *
'========================================================= >
 If TBEntierPosOuNeg = "" And KeyAscii = 45 Then
    KeyAscii = 45
 Else
    Select Case KeyAscii
        Case 45, 48 To 57
        Case Else
            KeyAscii = 0
    End Select
 End If
End Sub
'-------------------------------
N.B.- Tu pourrais utiliser seulement une variable comme textbox et tu
utilises un Select Case sur le nom du texbox pour définir les conditions
spécifiques à chacun.
MichD

Un petit exemple de module de classeur pour additionner le contenu de
textbox fait il y a déjà un bon moment afin de répondre à une question.
Ça peut te donner des idées.
https://www.cjoint.com/c/JHiujjZN7OM
MichD
Avatar
Péhemme
Salut Denis,
Juste à retirer le case 45 dans la partie Else et cela répond parfaitement à
mon besoin.
Dans le module de classe de ton fichier j'observe que, par la Sub, tu
appelles ta fonction de contrôle au lieu d'utiliser la sub directement.
Sachant que je suis néophyte en la matière, quel avantage y a-t-il ?
En revanche, si tu me le permets, ta fonction de contrôle admet le chr 45
même s'il n'est pas en 1ère position.
Dans ce cas, le signe"-" est bien noté en 1ère position et les chiffres déjà
saisis sont décalés vers la droite ; si tu saisis une seconde fois ce chr 45
celui-ci n'est pas admis.
À part cela, la vie est belle, le temps magnifique... bref, l'été en
Provence.
:-)))
Merci naturellement pour le coup de main.
Bien amicalement
Michel
"MichD" a écrit dans le message de groupe de discussion :
rgn0tj$1u9m$
Le 08/08/20 à 16:05, MichD a écrit :
Bonjour,
Essaie comme ceci :
'-------------------------------
Private Sub TBEntierPosOuNeg_KeyPress(ByVal KeyAscii As
MSForms.ReturnInteger)
'========================================================= > 'N'accepte que les nombres entiers (positifs ou négatifs) *
'========================================================= >
If TBEntierPosOuNeg = "" And KeyAscii = 45 Then
KeyAscii = 45
Else
Select Case KeyAscii
Case 45, 48 To 57
Case Else
KeyAscii = 0
End Select
End If
End Sub
'-------------------------------
N.B.- Tu pourrais utiliser seulement une variable comme textbox et tu
utilises un Select Case sur le nom du texbox pour définir les conditions
spécifiques à chacun.
MichD

Un petit exemple de module de classeur pour additionner le contenu de
textbox fait il y a déjà un bon moment afin de répondre à une question.
Ça peut te donner des idées.
https://www.cjoint.com/c/JHiujjZN7OM
MichD
Avatar
MichD
Le fichier exemple utilise un formulaire de 3 textbox pour saisir des
valeurs numériques quelconques et un dernier qui affiche au fur et à
mesure de la saisie la somme des 3 textbox.
Un nombre dans l'un des textbox de saisie permet le symbole "-" afin de
spécifier si la valeur est négative ou non. À cet effet, ce symbole ne
peut se situer qu'à l'extrême gauche du nombre saisi et il ne peut y en
avoir plus d'un est une évidence...même chose pour le séparateur
décimal, la présence d'un seul de ce symbole est possible...
La fonction est utilisée par chacun des textbox. Pourquoi utiliser 3
procédures différentes ayant le même objectif? Au lieu de 3 texbox, on
pourrait avoir 10, 15 ou 50 textbox et l'objectif d'une seule fonction
est de réduire la redondance du code et par le fait même la simplifier
le code. Sinon, pourquoi utiliser un module de classe.
MichD