Gérer la saisie d'une valeur négative dans un USERFORM

Bonjour,

Dans une zône de mon USERFORM je saisis le montant d'une valeur à ventiler.

J'avais rencontré un problème qui me plantait si je saisissais un point ou une virgule.

J'avais glané une solution pour résoudre mon problème qui me satisfaisait, par les instructions qui suivent. L'un d'entre vous pourrait-il parfaire cette instruction afin de permettre de saisir un montant négatif, car la lecture m'est difficile à comprendre.

Je vous en remercie par avance

'**********************************************************************************
'Le montant à ventiler plante si on utilise le "-" ou le point pour les décimales
'**********************************************************************************
Private Sub TxtMontant_a_Ventiler_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
Application.ScreenUpdating = False

'TRANSFORMER LE POINT PAR UNE VIRGULE
  If KeyAscii = 46 Then KeyAscii = 44

'ACCEPTER UNIQUEMENT UNE SEULE VIRGULE ET LES CHIFFRES ENTRE 0 ET 9
  If InStr("1234567890,-", Chr(KeyAscii)) = 0 Or (Me.TxtMontant_a_Ventiler.SelStart > 0 And Chr(KeyAscii) = "-") _
    Or (InStr(Me.TxtMontant_a_Ventiler.Value, ",") <> 0 And Chr(KeyAscii) = ",") _
    Or (Me.TxtMontant_a_Ventiler.SelStart = 0 And Chr(KeyAscii) = ",") _
    Or (Me.TxtMontant_a_Ventiler.SelStart = 0 And Chr(KeyAscii) = "-") Then KeyAscii = 0: Beep

End Sub

Bonjour Bruce,

'TRANSFORMER LE POINT PAR UNE VIRGULE

If KeyAscii = 46 Then KeyAscii = 44

le nombre 46 correspond à la valeur ASCII de la touche du point au clavier. Et le nombre 44 est celui de la virgule.

Donc si la touche point est enfoncée son code sera remplacée par celui de la virgule.

'ACCEPTER UNIQUEMENT UNE SEULE VIRGULE ET LES CHIFFRES ENTRE 0 ET 9

If InStr("1234567890,-", Chr(KeyAscii)) = 0 Or ...

Ici on vérifie si le résultat textuel chr(KeyAscii) a une correspondance dans le texte "0123456789,-). Si c'est le cas le test conditionnel sera supérieur à zéro. Il va dépendre de la position du 2ieme terme dans le 1ier. Si tu tapes sur la touche zéro la valeur sera 10, pour la touche moins ce sera 12. Donc si le test donne comme résultat 0 c'est que la touche enfoncée ne convient pas.

Pou ma part la suite du code est trop chargée. Le plus simple est de vérifier que si tu tapes un (-) . Celui-ci soit en première frappe.

Et qu'il n'existe qu'une seule fois. Pour la virgule il faut qu'elle n'existe qu'une fois. Donc il suffit de mettre un test compteur.

Pour la virgule: if KeyASCII = 44 then V=V+1. Ceci avant le code If instrr("0123...) . Si V=2 alors omettre la frappe, la remplacer par du vide ou par une KeysAscii = 65. Ce qui ne sera pas pris dans le test conditionnel puisque c'est un A.

Idem pour le moins. If KeyAscii = 45 then M=M+1. Si M=2 alors KeyAscii = 65. Vérifiez aussi que c'est la première frappe dans le textbox pour l'accepter. Par un compteur de frappe pourquoi pas. S'il se trouve au delà de la 1ère frappe c'est faux.

Bonne continuation.

Bonjour X CELLUS.

Merci pour ta réponse, j'ai parcouru tes observations, mais ça nécessite un peu plus de concentration pour moi pour bien comprendre. Je vois déjà mieux la construction de la syntaxe.

J'approfondirai demain, et ne manquerai pas de me rapprocher de toi si nécessaire.

Je te tiens informé.

Bien cordialement,

Bruce

Bonsoir Bruce,

Merci pour cette première réponse. Si j'ai le temps, je construirais un exemple avec une TextBox et te le fournirais.

Comme cela tu verras mieux le code fonctionner.

A plus.

Bonjour X CELLUS.

Merci par avance, c'est très gentil pour ce geste.

Je reste à l'écoute.

A bientôt

Bonne soirée.

Salut Bruce,

Voici en pièce attaché un fichier textBox. J'ai codé différemment que le code transmis.

D'ailleurs ce code interdisait l'usage de la touche moins. Je pense qu'il avait été réalisé uniquement pour rentrer des valeurs positives donc. Il convenait à un cas particulier.

Maintenant les valeurs négatives sont acceptées.

Bonne continuation.

39textbox.xlsm (21.66 Ko)

Bonjour X CELLUS

J'ai eu d'autres tâches prioritaires, ce qui explique un peu mon absence.

Merci pour le temps passé pour résoudre ma question.

J'ai apporté les corrections telles que suggérées et ça fonctionne, seulement ça me génére une erreur pour la suite du programme.

Notamment je ne peux pas alimenter ma variable à la suite de cette correction. Il ne semble par reconnaitre la valeur

Erreur de d'exécution 13

Incompatibilité de type

Ventil = Me.TxtMontant_a_Ventiler.Value

Est-ce que tu vois de quoi ça peut provenir.

Bonjour Bruce21130,

Il y a incompatibilité de type lorsque tu tentes de mettre une valeur dans une variable qui est prévue pour recevoir du texte. Et inversement.

Donc fait Ventil = Me.TxtMontant_a_Ventiler.Text

Ce que tu rentres dans un TextBox (comme son nom l'indique) c'est toujours du texte. Seulement il a deux

propriétés. L'une qui est Text, l'autre qui est Value.

Cela pour s'adapter à deux types de variable, soit recevant du texte, soit recevant une valeur.

Donc si la variable VentilTexte est définie comme as string elle recevra du texte et pas de valeur.

Et si VentilVal est définie comme as integer ou cdbl (donc numérique) elle recevra une valeur et non du texte.

Il suffit de voir comment Ventil est définie, mais vu que tu n'as pas proposé de fichier joint. Je ne peux l'affirmer. Seulement le supposer.

A suivre...

Je vais approfondir ta remarque et te remercie encore de ta réponse.

Je ne pense pas que cela vienne de la déclaration de ma variable, dans le sens ou avant de réaliser la modification tout fonctionne bien si je rentre une valeur positive, le message d'erreur apparaît si je saisi une valeur négative, ce que je ne pouvais pas faire auparavant et qui a été l'objet de la présente demande.

A mon humble avis, la première reflexion qui me vient à l'esprit est peut-être que la position du signe négatif transforme le contenu en valeur text, mais ce n'est qu'une supposition.

Je regarde de plus près et je te tiens informé.

Pour information je ne peux difficilement déposé le fichier sur le site parce qu'il est volumineux et je ne peux pas détacher une partie de l'application, car il y a trop d'éléments imbriqués et en plus ça reste confidentiel.

Merci pour ta compréhension

Bonjour Bruce21130,

Cela ne me renseigne pas sur la déclaration de ta variable Ventil. Est-elle format texte (string) ou format valeur (value)?

Je le répète le textbox ne reçoit que du texte. Pour lui tout caractère du clavier sera interprété comme du texte.

C'est ensuite à savoir si l'on souhaite récupérer l'entrée en format texte ou valeur. Et aussi dans le cas numérique si on désire un entier, un nombre avec virgule..

A suivre...

Bonjour X Cellus

Ce matin j'ai un peu de temps libre pour analyser tes observations et les mettre en pratique

J'ai modifié le ".value" par le ".Text" et le message d'erreur est le même

Après reflexion j'ai réalisé les modifications suivantes

J'air retiré toutes les conversions ASCII

J'ai nommé ma variable Dim Ventil As Double

Et ce qui fait toute la différence c'est cette correction : Ventil = Val(Me.TxtMontant_a_Ventiler)

Ta reflexion sur la gestion de la variable était la bonne, je ne m'y prenais pas dans le bons sens. Visiblement c'est résolu.

Pour autant j'ai du mal à comprendre la subtilité de l'instruction entre :

Ventil = Val(Me.TxtMontant_a_Ventiler)
Ventil=Me.TxtMontant_a_Ventiler.value

Merci encore une fois pour ton concours...

Bonjour Bruce21130,

J'ai nommé ma variable Dim Ventil As Double

Effectivement il faut que la variable corresponde. Avec un nombre réel (avec virgule) négatif, la sortie du contrôle textbox doit être raccord.

On peut aussi "forcer" cette sortie par Cdbl(Me.TxtMontant_a_Ventiler) pour la rendre compatible avec la variable Ventil paramétrée comme Double.

Bonne continuation.

Bonjour X CELLUS

Merci pour ce complément d'information. Il est certain que je ne ferai plus l'erreur, c'est en façonnant que l'on apprend, pour autant j'ai bien noté ta remarque avec CDbl.

Bonne journée et merci encore pour cet échange, sans toi je n'aurais pas progresser dans mon souci...

Cordialement

Rechercher des sujets similaires à "gerer saisie valeur negative userform"