textbox au format numérique

Alexandre_13

XLDnaute Nouveau
:eek: bonjour tout le monde!:)
J’essai de forcer un textbox au format numérique mais j'ai un souci avec les caractère (, ou .).
Comment puis-je intégrer ces deux codes

Private Sub TextBox5_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If KeyAscii = 46 Then KeyAscii = 44
End Sub

Private Sub textBox5_Change()
On Error Resume Next
If Not IsNumeric(Right(TextBox5, 1)) And Right(TextBox5, 1) <> "," Then
MsgBox "Le caractère saisi n'est pas valide"
TextBox5.SelStart = 0
TextBox5.SelLength = Len(TextBox5)
End If
End Sub

Donc! Dans le premier, je transforme le point du pavé numérique en virgule
Dans le deuxième j'intègre la virgule au format numérique
Le problème est que si j'utilise le pavé numérique le caractère n'est pas reconnu.
Quelqu’un a-t-il une solution s’il vous plait ?
 

pierrejean

XLDnaute Barbatruc
Re : textbox au format numérique

bonjour Alexandre
salut Jmps
salut Thierry

comme de coutume avec les carabiniers moi j'ai ceci qui fonctionne chez moi

Code:
Private Sub TextBox1_Change()
If Asc(Right(TextBox1, 1)) = 44 Then
TextBox1 = Left(TextBox1, Len(TextBox1) - 1) & "."
End If
End Sub
 

Alexandre_13

XLDnaute Nouveau
Re : textbox au format numérique

Merci de me répondre aussi vite
Effectivement cela fonctionne bien si je mets ma virgule avec le clavier texte mais si j'utilise le pavé numérique il prend la virgule mais lorsque je valide en fin d'usf, le msgbox se déclanche. Je vous envoie l'exemple complet.(c'est dans l'usf2)Regarde la pièce jointe Classeur2.1.zip
 

Pièces jointes

  • Classeur2.1.zip
    17.6 KB · Affichages: 98
  • Classeur2.1.zip
    17.6 KB · Affichages: 87

pierrejean

XLDnaute Barbatruc
Re : textbox au format numérique

re
@ jmps
j'ai deduis de sa macro qu'il souhaitais la virgule

@ Alexandre
ton fichier avec en tete de Textbox5_change mon bout de code et chez moi cela fonctionne

ATTENTION j'ais mis un ' devant une ligne qui faisait bugger
 

Pièces jointes

  • Classeur2.1.xls
    43 KB · Affichages: 170
  • Classeur2.1.xls
    43 KB · Affichages: 164
  • Classeur2.1.xls
    43 KB · Affichages: 182

pierrejean

XLDnaute Barbatruc
Re : textbox au format numérique

re

voila en fait la version deboguée

la validation voulait ramener textbox5 a ""

et c'est ici je pense que cela "toussait"

au passage j'ai corrigé textbox1 en textbox5

non jmps pas ZOP
 

Pièces jointes

  • Classeur2.1.zip
    19.8 KB · Affichages: 144
  • Classeur2.1.zip
    19.8 KB · Affichages: 167
  • Classeur2.1.zip
    19.8 KB · Affichages: 155

Alexandre_13

XLDnaute Nouveau
Re : textbox au format numérique

Bonjour Pierre jean, JMPS, le forum!
Bon je vien d'essayer ton bout de code, ça bloque.

Private Sub textBox5_Change()
If Asc(Right(TextBox5, 1)) = 44 Then ici! argument ou appel de procedure incorrect.
TextBox5 = Left(TextBox5, Len(TextBox5) - 1) & ","
End If


On Error Resume Next
If Not IsNumeric(Right(TextBox5, 1)) And Right(TextBox5, 1) <> "," Then
MsgBox "Le caractere saisi n'est pas valide"
TextBox5.SelStart = 0
TextBox5.SelLength = Len(TextBox5)
End If

End Sub

Pouvez vous m'expliquer pourquoi
Merci pour votre aide
Alex
 

_Thierry

XLDnaute Barbatruc
Repose en paix
Re : textbox au format numérique

Bonsoir Alexandre, Cher Amigo José, PierreJean, le Forum

J'ai comme l'impression que ce Fil fait couler beaucoup de caractères (encre), je vais en rajouter un peu !!! (lol)

Pour ce qui est du Caractère Séparateur de Décimales du Pavé Numérique, dans la Démo que j'ai mise en Ligne hier, une solution efficace y est proposée.

Il est important aussi de bien comprendre l'ordre d'entrée en Action des évènements déclenchés lors d'une Saisie dans un Contrôle ActiveX TextBox (il y a bien d'autres évènements, mais je ne m'attarderai que sur ceux qui nous interressent pour ce cas) :

Evénènement Agissant en Premier Dès Lors une Saisie : KeyPress
(Par conséquent on peut modifier le caractère tapé en temps réél)
Code:
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If KeyAscii = 44 Or KeyAscii = 46 Then
   KeyAscii = Asc(Application.International(xlDecimalSeparator))
End If
End Sub

Ce code de Cédric du MPFE offre en outre l'avantage de rendre l'application compatible sur un PC configuré en US ou UK et Vice-Versa vers un PC configuré en FR ou autres...

________


Pour ce qui est d'alerter l'utilisateur d'une saisie non numérique, c'est lors de l'évènement intervenant ensuite...

Evénènement Agissant en Second Pendant une Saisie : Change
(on peut analyser la chaine de caratères saisie en temps réél)
Code:
Private Sub TextBox1_Change()
With Me.TextBox1
    If Not IsNumeric(.Value) Then
         ValTextBox1 = 0
        .SelStart = 0
        .SelLength = Len(.Text)
        .SetFocus
    Else
         ValTextBox1 = .Value
    End If
End With
End Sub

Dans ce code je ne stresse pas l'utilisateur par un message intempestif, ce que l'on remarquera d'ailleurs dans les applications professionnelles, où les tests d'intégrités sont appliqués au moment de la validation, toutefois ce code selectionne et surligne le Texte Saisie en empêchant de poursuivre la saisie par ce bias.

Dans l'éventualité d'un calcul en temps réél de la valeur numérique saisie dans cette TextBox, il suffit de passer par une Variable Publique de Type Double (qui est matérialisée dans mon exemple par "ValTextBox1"...)


________



Pour vraiment coincer le "méchant" user qui ne voit pas que son texte saisie c'est surlignée en bleu... Et en bien mieux qu'un message stressant.... On le bloque définitivement (et Paf ! lol) :

Evénènement Intervenant immédiatement Après une Saisie : Exit
(Optionnel, mais utile, Impossibilité de sortie du Contrôle)
Code:
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
With Me.TextBox1
    If Not IsNumeric(.Value) And Not .Value = Empty Then Cancel = True
End With
End Sub


________



Avec ces quelques bases, je pense que la question sera un peu plus vite maîtrisée et... j'espère... résolue.

Bonne Nuit

@+Thierry

 

pierrejean

XLDnaute Barbatruc
Re : textbox au format numérique

bonjour Alexandre
salut jmps
salut Thierry

je prends note des explications de Thierry , comme toujours lumineuses et j'engage Alexandre à modifier son code comme indiqué

le bug engendré par ma solution venait du fait qu'a la validation de l'userform une mise à "" du textbox5 etait demandée et aboutissait a l'evenement change .Celui-ci butait sur le Asc(Right(TextBox5, 1))
la solution ,fort laborieuse je l'admet, avait été d'ecrire

For I = 1 To 8
If I = 5 Then
Controls("TextBox" & I) = "0"
Else
Controls("TextBox" & I) = ""
End If
Next I

Heureusement il y a des vrais specialistes pour nous remettre sur le bon chemin

Merci encore Thierry
 

Alexandre_13

XLDnaute Nouveau
Re : textbox au format numérique

Bonsoir Pierre jean, Jmps Thierry, et le forum!

Thierry quel cours magistral !!!! (En tout cas pour moi le néophyte de VBA, et même d'Excel) je vais garder tes explications en mémoire, elles me seront très certainement utile bientôt.
Rassure toi grâce aussi à Pierre jean mon code fonctionne à merveille.
Quand je suis arrivé sur ce forum je n'avais aucune idées de ce que pouvait être la programmation et je dois dire qu'avec vous tous je me sent des ailes.
Merci pour tout.
Alex
:) :) :)
 

Pierwak

XLDnaute Occasionnel
Re : textbox au format numérique

bonjour,
Je déterre quelque peu ce fil dans lequel on retrouve un message de Thierry extremement intéressant.
Pour ma part, j'utilise le blocage de la sortie car mes utilisateur sont un peu "méchants" lol !!! Seulement il y a un léger problème, j'applique ce controle sur un userform contenant beaucoup de champs et surtout des frames différentes.
Lorsque je veux sortir d'un textbox controlé vers un autre controle de la meme frame pas de souci.
Mais si j'entre une valeur texte genre "piègé" dans le controle d'un frame A et que je sors du controle vers un controle d'une autre frame (disons B), le message d'erreur n'apparait pas et l'utilisateur peut naviguer dans tous les controles du usf excepté ceux de la frame A.
Quelqu'un aurait il une idée pour que le controle se fasse dans tous les cas ??
pour mémoire voici le code utilisé (c'est celui de thierry plus une msgbox)

Code:
Private Sub Txtsav_Exit(ByVal Cancel As MSForms.ReturnBoolean)
With Me.Txtsav
    If Not IsNumeric(.Value) And Not .Value = Empty Then
    MsgBox "This is a numeric field, please enter a number or leave empty", vbInformation
    Cancel = True
    End If
    End With
End Sub
 

Discussions similaires

Statistiques des forums

Discussions
312 472
Messages
2 088 710
Membres
103 930
dernier inscrit
Jibo