Microsoft 365 Imposer la saisie du signe + ou - dans une textbox

ivan27

XLDnaute Occasionnel
Bonsoir à tous,

Dans une textbox, numérique, je souhaiterais obliger l'utilisateur à saisir le signe + ou - devant le nombre qui suit

exemple : +30 ou -5

Si la saisie ne commence pas par le signe + ou - alors Msgbox d'erreur.

Merci d'avance pour votre aide

Bonne fin de soirée

Ivan
 

ivan27

XLDnaute Occasionnel
Bonsoir fanch55
Merci pour cette proposition qui ne correspond pas tout à fait à ma demande.
Là, le signe + se renseigne par défaut.
Ce que je souhaite, c'est que l'utilisateur soit contraint de saisir lui-même le signe souhaité + ou -
Ivan
 

kiki29

XLDnaute Barbatruc
Salut, à tester plus à fond , à priori une solution ... verbeuse, à adapter à ton contexte :
ne permet que la saisie d'un séparateur décimal et le substitue si besoin est ( . remplacé par , )
ne permet que la saisie d'un + ou d'un - ( même en cours de saisie ) , et le replace en tête.

VB:
Option Explicit

Const entrees_permises = "+-.,0123456789" & vbCr & vbBack

Const Point = "."
Const Virgule = ","
Const Moins = "-"
Const Plus = "+"

Private Sub  TextBox1_Change()
Dim Pos As Integer, iL As Integer
    iL = Len( TextBox1.Text)
    Pos = InStr( TextBox1.Text, Moins)
    If Pos > 1 Then
         TextBox1.Text = Moins & Left( TextBox1.Text, Pos - 1) & Mid( TextBox1.Text, Pos + 1, iL - Pos)
    End If
    Pos = InStr( TextBox1.Text, Plus)
    If Pos > 1 Then
         TextBox1.Text = Plus & Left( TextBox1.Text, Pos - 1) & Mid( TextBox1.Text, Pos + 1, iL - Pos)
    End If
End Sub

Private Sub  TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    If KeyAscii = Asc(Point) Then
        If InStr( TextBox1, Virgule) = 0 Then
            KeyAscii = Asc(Virgule)
        Else
            KeyAscii = 0
        End If
    ElseIf InStr(entrees_permises, Chr(KeyAscii)) = 0 Then
        KeyAscii = 0
    ElseIf InStr( TextBox1, Virgule) > 0 And KeyAscii = Asc(Virgule) Then
        KeyAscii = 0
    End If

    If KeyAscii = Asc(Moins) Then
        If InStr( TextBox1, Moins) = 0 And InStr( TextBox1, Plus) = 0 Then
            KeyAscii = Asc(Moins)
        Else
            KeyAscii = 0
        End If
    End If

    If KeyAscii = Asc(Plus) Then
        If InStr( TextBox1, Plus) = 0 And InStr( TextBox1, Moins) = 0 Then
            KeyAscii = Asc(Plus)
        Else
            KeyAscii = 0
        End If
    End If
End Sub

Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Dim Pos1 As Long, Pos2 As Long
    Pos1 = InStr(TextBox1.Text, Moins)
    Pos2 = InStr(TextBox1.Text, Plus)
    If Pos1 = 0 And Pos2 = 0 Then
        MsgBox "Saisir le signe (+-) de ce nombre", vbOKOnly + vbInformation
    End If
End Sub
 
Dernière édition:

fanch55

XLDnaute Barbatruc
Salut @kiki29 ,
Une autre version avec la même démarche :
VB:
Option Explicit

Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    MsgBox "Textbox1=""" & TextBox1 & """ =" & Val(TextBox1)
End Sub

Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    If Not PM_Num(TextBox1, Chr(KeyAscii)) Then KeyAscii = 0
End Sub

Function PM_Num(T As String, C As String) As Boolean
Const Entrees_Permises = "+-.,0123456789" & vbCr & vbBack

    Select Case True
        Case Len(T) = 0 And InStr("-+", C) = 0
        Case InStr(Entrees_Permises, C) = 0
        Case C = "+" And (InStr(T, "-") Or InStr(T, "+"))
        Case C = "-" And (InStr(T, "-") Or InStr(T, "+"))
        Case C = "." And (InStr(T, ".") Or InStr(T, ","))
        Case C = "," And (InStr(T, ".") Or InStr(T, ","))
        
        Case Else: PM_Num = True
        
    End Select

End Function
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour,

Un p'ti code sans prétention mais très court :
VB:
Private Sub TextBox1_Change()
   If TextBox1 = "" Then Exit Sub Else If InStr("+-", Left(TextBox1, 1)) = 0 Then MsgBox "La saisie doit commencer par le signe + ou -", vbExclamation: TextBox1 = ""
End Sub
 

Pièces jointes

  • ivan27- plus ou moins- v1.xlsm
    17.5 KB · Affichages: 20
Dernière édition:

ivan27

XLDnaute Occasionnel
Bonjour à tous,

Merci pour vos propositions,

kiki29 : Très intéressant le fait de limiter la saisie à du numérique en acceptant les décimales. Cependant, je n'arrive pas à faire fonctionner ta proposition. Lors de la saisie d'un chiffre ou d'un signe +-, le code plante sur cette ligne :
Code:
If KeyAscii = Asc(Point) Then

fanch55 : Quelque soit la saisie dans la textbox, j'ai une Msgbox d'erreur et la saisie est conservée même en l'absence de signe

mapomme : C'est bon pour moi. J'ai modifié ta proposition comme suit :
Code:
Private Sub TextBox17_Exit(ByVal Cancel As MSForms.ReturnBoolean)
   If InStr("+-", Left(TextBox17, 1)) = 0 Then MsgBox "La saisie doit commencer par le signe + ou -", vbExclamation: TextBox17 = 0
End Sub


Ivan
 

ivan27

XLDnaute Occasionnel
Rebonjour tout le monde, kiki29,
Effectivement... Je ne comprends pas. Je n'arrive pas à identifier l'origine et mon formulaire est beaucoup trop avancé pour que j'en mette une version anonymisé sur le forum.
J'ai une erreur d'exécution 5 (argument ou appel de procédure incorrect) avec blocage sur la ligne :
If KeyAscii = Asc(Point) Then
Je me suis contenté de copier tout ton code et de remplacer TextBox1 par TextBox17.
Le blocage se produit lors de la saisie d'un chiffre ou d'un signe dans la TextBox.
Par contre, la TextBox est à ''0'' par défaut, si j'efface le chiffre ''0'' et que je quitte la TextBox (vide) j'ai le Msgbox ''vous devez saisir....''
Une idée sur ce qui peut provoquer ce dysfonctionnement ?
Ivan
 

patricktoulon

XLDnaute Barbatruc
bonjour a tous
si j'ai bien compris la demande
si je ne me suis pas trompé voila un tout en un

cahier des charges
  1. le symbole obligatoire en premier
  2. le point est remplacé par la virgule automatiquement
  3. seulement caractère numérique et virgule autorisés
  4. la virgule ne peut se trouver qu'apres le (2d ou plus)caractère qui est forcement numérique
  5. pas deux virgules possibles dans le textbox
  6. pas deux symboles possibles dans le textbox
encore un exemple d'interception du keyascii non pas dans le .value
mais dans le concat du .value+chr(keyascii)<<v>>
VB:
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    If KeyAscii = 46 Then KeyAscii = 44    'remplace point en virgule
    With TextBox1
        v = .Value & Chr(KeyAscii)    'on concat le value + la touche dans la variable v
        If Len(v) Then If InStr("+-", Left(v, 1)) = 0 Then KeyAscii = 0: MsgBox "le signe ""+"" ou ""-"" est obligatoire"   'on vire si + ou moins n'est pas le premier
        x = InStr(v, ",")    'on repere la virgule
        forme = Left(v, 1) & Application.Rept("#", Len(v) - 1)    'on crée le string format numerique
        If x > 2 Then Mid(forme, x) = "."    'on replace le separateur met en point pour test numerique
        '  ben...maintenant si la chaine(v)formatée avec forme n'est pas numerique alors annulation de touche
        If Len(v) > 1 And Not IsNumeric(Format(v, forme)) Then KeyAscii = 0
    End With
End Sub
edit:ajout du msgbox
 
Dernière édition:

fanch55

XLDnaute Barbatruc
Étonné que cela ne fonctionne pas :oops:
Ci-Joint un classeur mettant en pratique le code,
que ce soit pour un textbox sur Userform ou sur Feuille.

Si vous pouviez me dire à quelle ligne vous rencontrez une erreur dans le VBE ...:rolleyes:
 

Pièces jointes

  • Ivan.xlsm
    29 KB · Affichages: 7

patricktoulon

XLDnaute Barbatruc
j'ai repris ton fichier comme tel et supprimé tout les codes
dans le userform j'ai mis
VB:
Option Explicit

Private Sub CommandButton1_Click()
    Unload Me
End Sub

Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    textbox_KeyPress ActiveControl, KeyAscii
End Sub
Private Sub TextBox2_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    textbox_KeyPress ActiveControl, KeyAscii
End Sub
et dans le module j'ai mis mon event (post#10)globalisé
VB:
Option Explicit
Sub textbox_KeyPress(txtb, KeyAscii As MSForms.ReturnInteger)
    Dim V$, X&, forme$
    If KeyAscii = 46 Then KeyAscii = 44
    With txtb
        V = .Value & Chr(KeyAscii)
        If Len(V) Then If InStr("+-", Left(V, 1)) = 0 Then KeyAscii = 0: MsgBox "le signe ""+"" ou ""-"" est obligatoire au debut"   'on vire si + ou moins n'est pas le premier
        X = InStr(V, ",")
        forme = Left(V, 1) & Application.Rept("#", Len(V) - 1): If X > 2 Then Mid(forme, X) = "."
        If Len(V) > 1 And Not IsNumeric(Format(V, forme)) Then KeyAscii = 0
    End With
End Sub
a oui dans la feuille j'ai mis
VB:
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    textbox_KeyPress TextBox1, KeyAscii
End Sub
 
Dernière édition:

fanch55

XLDnaute Barbatruc
j'ai repris ton fichier comme tel et supprimé tout les codes
dans le userform j'ai mis ....

Erreur quand je veux entrer un chiffre : :rolleyes:
1598809904709.png


Sinon, tu remarqueras que j'ai mis l'Application.DecimalSeparator pour pas me faire ch.. tracasser pour les points ou virgules selon les versions d'excel ...;)
 

Discussions similaires

Statistiques des forums

Discussions
312 348
Messages
2 087 510
Membres
103 570
dernier inscrit
patrickb83p