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 ?
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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
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.
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
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
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.
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
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
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$1@gioia.aioe.org...
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.
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
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
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.
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