Mettre un point dans la saisie du nombre, qu'il soit positif ou négatif

Bonjour
Dans une TextBox je dois pouvoir saisir un nombre négatif ou positif. (coordonnées GPS)
Le nombre doit avoir un point (et non pas une virgule) comme décimale après le premier chiffre. ça, j'ai réussi.
Jusqu'à présent je ne saisissais que des nombres positifs, sans le " + " bien entendu.

Le but est de conserver le signe " - " quand il est saisi, mais du coup, tel que j'ai codé ma TextBox, le point se met après le signe négatif.
Je n'ai aucune idée comment :
1 : conserver le - et que le point se mette donc après le premier chiffre.
2 : augmenter de 1 caractère si il y a le - dans la TextBox pour conserver les 6 chiffres après le point décimal

Voici le code de ma TextBox

Private Sub TextBoxLongCor_Change()

                TextBoxLongCor.MaxLength = 8 'nb caractères maxi autorisé dans le textbox. 
                ValeurLongCor = Len(TextBoxLongCor)
                If ValeurLongCor = 1 Then TextBoxLongCor = TextBoxLongCor & "."
                TextBoxLongCor = Replace(TextBoxLongCor, ",", "")
                TextBoxLongCor = Replace(TextBoxLongCor, "..", ".")

End Sub

Merci de votre aide

Bonsoir,

voyer ceci :

Private Sub TextBox1_Change()
    If TextBox1 = "" Then Exit Sub
    TextBox1.MaxLength = IIf(Left(TextBox1, 1) = "-", 9, 8)
    valeurlongcor = Len(TextBox1)
    If valeurlongcor = 1 And TextBox1.MaxLength = 9 Then Exit Sub
    If (valeurlongcor = 2 And TextBox1.MaxLength = 9) Or (valeurlongcor = 1 And TextBox1.MaxLength = 8) Then TextBox1 = TextBox1 & "."
    TextBox1 = Replace(TextBox1, ",", "")
    TextBox1 = Replace(TextBox1, "..", ".")
End Sub

mais ce n'est pas beau... En plus on ne peut effacer la valeur avec le retour chariot... on reste coincé au point... Mais bon, si cela peut faire avancer le problème.

@ bientôt

LouReeD

Bonjour papicx , LouReeD ,

Un autre code. On peut saisir comme premier caractère le signe plus ou le signe moins ou le point décimal ou la virgule décimale ou bien un chiffre. La saisie refuse tout autre caractère. La saisie refuse aussi les doublons pour le plus, le moins, la virgule et le point.

nota : le signe plus ou moins doit être suivi d'un chiffre (le point et la virgule sont proscrits dans ce cas).

Le code :

Private Sub TextBox1_Change()
Dim x$
   x = Replace(TextBox1, " ", "")            ' on ôte les espaces
   If x = "" Then TextBox1 = "": Exit Sub    ' si x est vide, on quitte la procédure
   If Len(x) = 1 Then                        ' cas d'un seul caractère
      If x = "-" Or x = "+" Or x = "." Or x Like "#" Then Exit Sub   'si - ou + ou . alors on ne fait rien
      If x = "," Then TextBox1 = ".": Exit Sub     ' si virgule, on la remplace par un point
   End If
   x = Replace(x, ".", ",")      ' on remplace un éventuel point par une virgule
   ' si c'est numérique on remplace la virgule par un point sinon on ôte le dernier caractère
   If IsNumeric(x) Then TextBox1 = Replace(x, ",", ".") Else TextBox1 = Left(TextBox1, Len(TextBox1) - 1)
End Sub

Ce n'est pas sans doute pas parfait mais ça le fait à 99%, du moins me semble-t-il...

Bonsoir à tous.

Tout d'abord un GRAND MERCI à vous deux de m'avoir fourni des codes que j'ai testés, triturés et finalement mixés !

Je vous livre le code final de la dernière TextBox qui change de couleur si les réponses ne sont pas comprises entre des valeurs prédéfinies dans des cellules nommées "NORD, SUD, EST OUEST et Commune" (Merci LouReed ) que j'ai mise dans l'onglet "Code_VBA"

J'ai en fait privilégié le code de LouReed car plus simple et finalement plus efficace, je trouve.
Je te remercie @mafraise car j'ai pu faire des tests en tout genre (voir les lignes en commentaire dans le fichier vba du fichier excel fourni)
Je ne jette pas tes lignes de codes, car sans le savoir, je pense qu'elles vont me servir ultérieurement.

Ce que je n'arrive pas à comprendre, c'est que dans ce fichier, j'ai du dupliquer la ligne

Dim ValeurLongCor As Byte

dans la seconde partie du code alors que dans mon fichier ce n'est que dans la première partie et que ça fonctionne correctement.
mystère...

Bref, SUJET RéSOLU !

Grâce à vous, mon fichier est utilisable dans toute la France ! Tant à l'est qu'à l'ouest ou à cheval sur le méridien de Greenwich !

NB : j'ai mis des coordonnées complètement farfelues, et le nom de LAVAL au hasard aussi, c'est juste pour tester le code.

MERCI

Private Sub TextBoxLongCor_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)

' change la couleur de la Box du texte, colore le texte en rouge, affiche une boite de dialogue circonstancielle si la valeur est en dehors de celles définies dans l'onglet Code_vba.

    Dim varLongCor As Variant
    varLongCor = TextBoxLongCor.Value
    Dim ValeurLongCor As Byte
    Dim LongOuest
    LongOuest = Range("OUEST")  ' OUEST est le nom de la cellule de la valeur longitude maximale OUEST dans l'onglet Code_Vba
    Dim LongEst
    LongEst = Range("EST")      ' EST est le nom de la cellule de la valeur longitude maximale EST dans l'onglet Code_Vba
    Dim Comm
    Comm = Range("COMMUNE")     ' COMMUNE est le nom de la cellule de la valeur "nom de la commune" dans l'onglet Code_Vba

  ' If Val(varLongCor) > 2.2836507 Then    ' si la variable est supérieure à 2.2836507 alors VRAI
   If Val(varLongCor) > Val(LongEst) Then    ' si la variable est supérieure à la valeur définie dans la cellule "longitude EST maximale" dans l'onglet "Code_vba" alors VRAI

        TextBoxLongCor.ForeColor = vbRed
        TextBoxLongCor.BackColor = vbWhite
        varLongCor = MsgBox("La valeur de longitude saisie est trop à l'Est de " & (Comm) & "." & vbCrLf & vbCrLf & _
                            "Les longitudes de " & (Comm) & " sont comprises entre :" & vbCrLf & _
                           "•  " & (LongOuest) & " pour la valeur la plus à l'Ouest et " & vbCrLf & _
                           "•  " & (LongEst) & " pour la valeur la plus à l'Est.", vbExclamation, "VALEUR DE LONGITUDE HORS DE LA COMMUNE")

   ElseIf TextBoxLongCor = "" Then   ' si la variable est vide alors affichage des couleurs par défaut

        TextBoxLongCor.ForeColor = vbBlack
        TextBoxLongCor.BackColor = &H80C0FF        ' couleur par défaut
        MsgBox " La case de la Longitude corrigée est vide !"

   ElseIf Val(varLongCor) < Val(LongOuest) Then    ' si la variable est inférieure à la valeur définie dans la cellule "longitude OUEST maximale" dans l'onglet "Code_vba" alors VRAI

        TextBoxLongCor.ForeColor = vbRed
        TextBoxLongCor.BackColor = vbWhite
        varLongCor = MsgBox("La valeur de longitude saisie est trop à l'Ouest de " & (Comm) & "." & vbCrLf & vbCrLf & _
                            "Les longitudes de " & (Comm) & " sont comprises entre :" & vbCrLf & _
                           "•  " & (LongOuest) & " pour la valeur la plus à l'Ouest et " & vbCrLf & _
                           "•  " & (LongEst) & " pour la valeur la plus à l'Est.", vbExclamation, "VALEUR DE LONGITUDE HORS DE LA COMMUNE")

   Else                             ' si c'est dans la plage, affichage des couleurs par défaut

        TextBoxLongCor.ForeColor = vbBlack
        TextBoxLongCor.BackColor = &H80C0FF        ' couleur orange par défaut  &H80C0FF

   End If

End Sub
Private Sub TextBoxLongCor_Change()

    If TextBoxLongCor = "" Then Exit Sub
    TextBoxLongCor.MaxLength = IIf(Left(TextBoxLongCor, 1) = "-", 9, 8)

                Dim ValeurLongCor As Byte
                ValeurLongCor = Len(TextBoxLongCor)

                If ValeurLongCor = 1 And TextBoxLongCor.MaxLength = 9 Then Exit Sub
                If (ValeurLongCor = 2 And TextBoxLongCor.MaxLength = 9) Or (ValeurLongCor = 1 And TextBoxLongCor.MaxLength = 8) Then TextBoxLongCor = TextBoxLongCor & "."

                TextBoxLongCor = Replace(TextBoxLongCor, ",", "")
                TextBoxLongCor = Replace(TextBoxLongCor, "..", ".")
                TextBoxLongCor = Replace(TextBoxLongCor, "--", "-")
                TextBoxLongCor = Replace(TextBoxLongCor, "_", "-0")

End Sub

Bonjour,

Vous n'avez pas "dupliqué" la ligne en question. Il faut bien comprendre la portée de vos variables. Étendue - Visual Basic | Microsoft Learn

Vous créez dans le Sub TextBoxLongCor_BeforeUpdate une variable nommée ValeurLongCor, et dans le Sub extBoxLongCor_Change une AUTRE variable avec le meme nom. Elles n'ont, en elles-meme, rien en commun, ne se connaissent pas et ne se voient pas. D'où la nécessité de redéclarer, dans le deuxième sub votre variable. Alternativement il faut faire une variable globale. Déclaration de variables (VBA) | Microsoft Learn

En dehors de cela, le code actuel me semble manquer d'une vérification assez cruciale puisqu'il autorise l'entrée de texte. Mafraise le checkait en partie mais n'a pas poussé (vu que non demandé) le code à indiquer une entrée incorrecte. Mais personnelement je ne comprends pas trop la motivation à "modifier" ainsi l'entrée utilisateur. Je trouverai ça assez perturbant si je l'utilisait. Pourquoi ne pas convertir les valeurs après ?

Bonjour saboh12617.

Merci pour ces explications. J'irai consulter les pages quand je serai de retour sur mon pc.

Je modifierai la variable pour ne pas avoir de conflit possible.

La toute dernière ligne de code est pour éviter que l'utilisateur utilise le _ au lieu du -

Comme je ne sais pas comment faire et que surtout "l'urgence" était ailleurs, j'ai pris cette liberté. :/

J'ai bien essayé de limiter la saisie aux chiffres, au point et au caractère - , mais je suis trop novice pour cela.

La problématique est qu'il faut avoir un point après le premier chiffre, qu'il soit précédé d'un signe - ou pas.

Est ce possible de corriger le code existant sans trop le compliquer ?

Par ailleurs j'avais idée d'ajouter à droite de la TextBox une petite image avec un point d'interrogation qui déclencherait une msgbox où j'idiquerais les raccourcis pour faire des -1. -2. ... jusqu'à -5.

Je sais faire les msgbox, mais c'est la "liaison" (en survol de préférence) entre une image et la msgbox que je ne connais pas. (j'en étais là à l'heure d'aller dormir)

Merci d'avance de votre aide.

Bonsoir,

dernière proposition en reprenant l'interrogation de saboh12617 :

Option Explicit
Public EnCours As Boolean

Private Sub TextBox1_Change()
    If EnCours Then Exit Sub
    TextBox1.MaxLength = IIf(Left(TextBox1, 1) = "-", 9, 8)
    EnCours = True
    If Len(TextBox1) = TextBox1.MaxLength And InStr(TextBox1, ".") = 0 Then
        If Left(TextBox1, 1) = "-" Then
            TextBox1 = Left(TextBox1, 2) & "." & Mid(TextBox1, 3, 99)
        Else
            TextBox1 = Left(TextBox1, 1) & "." & Mid(TextBox1, 2, 99)
        End If
    Else
        TextBox1 = Replace(TextBox1, ".", "")
    End If
    EnCours = False
End Sub

Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
   If InStr("1234567890-", Chr(KeyAscii)) = 0 Or TextBox1.SelStart > 0 And Chr(KeyAscii) = "-" Then
      KeyAscii = 0: Beep
   End If
End Sub

Le fichier :

@ bientôt

LouReeD

Merci LouReed,

Je vais prendre la dernière partie de ton code pour limiter la saisie aux chiffres et caractères autorisés.
Bien que répondant à la question de saboh12617, le code est parfait pour le contrôle, la méthode de saisie ne me semble pas naturelle.
Mais merci quand même d'avoir proposé un code bien ficelé.

il me reste à trouver comment afficher une fenêtre d'aide au survol de la TextBox ou une image, style "point d'interrogation".
Si je ne trouve pas, je ferai une autre demande. (pour ne pas s'écarter du titre du sujet de cette demande

Merci à tous.

Bon ben voilà le fichier avec une saisie "naturelle" mais "verrouillé" avec un test du survol et affichage d'un message :

@ bientôt

LouReeD

Rechercher des sujets similaires à "mettre point saisie nombre soit positif negatif"