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 SubMerci 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 Submais 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
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 SubCe 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
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 Bytedans 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 SubLe 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