C'est à toi, que ce conseil doit être donné, Patrick.reste a revoir la notion de "compliqué"
A moins que tu ne trouves "compliqué" ce qui, pour d'autres (à commencer par la machine), est d'une très grande simplicité ...
C'est à toi, que ce conseil doit être donné, Patrick.reste a revoir la notion de "compliqué"
A moins que tu ne trouves "compliqué" ce qui, pour d'autres (à commencer par la machine), est d'une très grande simplicité ...
Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .
****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...
Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.
Po po po po po...
N'allez pas trop vite en besogne!
Je ne suis pas rapide avec mon traîneau sans la neige...
@Jacques :
Super!
Tout fonctionne.
Me suis même permis deux modifs :
1- la mise sous une fonction de verif (si plusieurs textbox à vérifier...)
2- Un ajout pour le cas ou l'on voudrais saisir un second point juste pour embêter le monde.
Cela donne :
@Patrick :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 Option Explicit Private Sub TextBox1_Change() TextBox1.Text = VerifTextBox(TextBox1.Text) End Sub Private Function VerifTextBox(Texte) As String Static toto As String Dim c As String c = Replace(Texte, ",", ".") If InStr(c, ".") = 0 And InStr(toto, ".") > 0 Then VerifTextBox = Int(Val(toto)): toto = VerifTextBox: Exit Function End If If c = "" Then toto = "": Exit Function If Right(c, 1) = "." Then If Not toto Like "*.5" Then c = c & "5" ElseIf c Like "*.5." Then 'ajout d'un second point c = Mid(c, 1, Len(c) - 1) Else c = Int(Val(toto)) End If End If If Len(CStr(Val(c))) = Len(c) And Val(c) > 0 And Not c Like ("*.##*") Then VerifTextBox = c toto = Texte Else VerifTextBox = toto End If End Function
Laisse moi un peu de temps pour essayer ta solution.
Celle de Jacques fonctionne très bien, je le confirme.
EDIT : pour en revenir sur la notion de "complexe" (et non "compliqué").
Aucun des codes donnés ici n'est compliqué.
Le mien (le premier donné dans le sujet), je le considère comme "complexe" car il utilise 4 événements.
Beaucoup trop pour juste obtenir un "simple 5 après la saisie d'un point" et les quelques contraintes supplémentaires que je me suis imposé.
Ces contraintes supplémentaires auraient pu également être mises sur le compte de l'utilisateur. Il ne fait pas attention, tant pis pour lui!
Cordialement,
Franck
Patrick,
Ton code comporte deux gros défauts.
1- on ne peut pas se servir du point du clavier numérique (ce qui est handicapant lorsque l'on n'a que des chiffres à saisir),
2- On peut saisir autant de chiffres que l'on veux après la virgule.***
*** Pour tester cela :
1- inscrit un nombre, (ex : 1234)
2- appuies sur la virgule ==> affichage : 1234.5
[jusqu'ici tout va bien]
3- appuies, à nouveau sur la virgule ==> affichage 1234.55
4- tu peux maintenant saisir tous les chiffres que tu veux...
EDIT : j'ajoute un gros bug : erreur 5 sur If Mid(TextBox1.Value, TextBox1.SelStart) dans :
Pour le reproduire :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) 'on ne peut pas revenir apres le point sur ce qui est inscrit c'est a dire".5" exemple on ne peut pas taper un chiffre en positionnant le curseur avant le "5" 'par contre si tu veux ajouter un chiffre avant le point tu peux If Len(TextBox1.Value) > 0 Then If Mid(TextBox1.Value, TextBox1.SelStart) = ".5" Then KeyAscii = 0: Exit Sub End If
1- taper un chiffre
2- placer le curseur à gauche de ce chiffre
3- taper un chiffre...
Cordialement,
Franck
beep beep !!!!!!!
ah je vais pas le lacher celui la
mon cher jacques tape le nombre que tu veux puis tape deux fois sur la virgule d'affilé ou separer par un/des chffres
exemple essaie de taper
123,456,789
ou 123,,
heu.... aut'chose?
mes fichiers dans les contributions:
mail avec CDO en vba et mail avec CDO en vbs dans un HTA
survol des bouton dans userform
prendre un cliché d'un range
si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
et n'oublie pas de voter
Qu'est-ce que tu "racontes", Patrick ?
Avec MON code (il est, je te le rappelle, en message N° 13) : impossible de taper deux fois la virgule (ni le point, d'ailleurs). Et encore moins de frapper autre chose que ce qui a été demandé !
Alors ? Tu ne vas pas lâcher quoi et qui ? ça, alors ... (je commence à deviner ce que TU devrais lâcher, toi ...)
Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .
****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...
Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.
chez moi avec le codes de jacques si je tape 2 fois la virgule j'ai une erreur 13 incompatibilité de type parce que int sur un texte avec 2 virgules declenche l'erreur
j'ai palié au depart de l'evenement en faisant sauter le dernier ","
ca fonctionne
parcontre la suppression complete doit se faire en deux fois si il y a decimale
mes fichiers dans les contributions:
mail avec CDO en vba et mail avec CDO en vbs dans un HTA
survol des bouton dans userform
prendre un cliché d'un range
si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
et n'oublie pas de voter
Bonjour Patrice740
On le peut en utilisant la touche backspace.
Mais si tu tiens à ce qu'on puisse également le faire à l'aide de la touche SUPPR y compris dans ce cas-là, je ferai également cela à mon retour de la pêche
Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .
****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...
Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.
Allez, Patrick, montre-le donc, mon soit-disant code, tel que tu l'as écrit !
(un copié/collé de ce que tu as réellement mis sur ta machine et "testé", hein ...)
Je te rappelle qu'il ne doit pas être "accompagné" de TES évènements à toi (keypress ou autres) qui le pollueraient, hein ...
Et tu vas avoir honte de tes petites images plus haut.
Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .
****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...
Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.
re
je ne m'en était pas occupé un oubli de ma partMême un copié/collé alphabétique s'inscrit dans ton textbox. Pas dans celui de Jacques.
mes fichiers dans les contributions:
mail avec CDO en vba et mail avec CDO en vbs dans un HTA
survol des bouton dans userform
prendre un cliché d'un range
si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
et n'oublie pas de voter
ah oui Patrice c'est vrai j'avais pas tester caIl y a un autre problème, aussi à cause du Val(), on ne peut pas saisir 0.5
ca me parait bien compromis sa methode utilisant val
sauf pirouette en mode string
comme quoi des fois
cela dit la bascule de deux variable est seduisante
mais perso je préfere les evenements qui sont plus explicites en soit avec les constantes keyascii ou keycode
mes fichiers dans les contributions:
mail avec CDO en vba et mail avec CDO en vbs dans un HTA
survol des bouton dans userform
prendre un cliché d'un range
si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
et n'oublie pas de voter
Bonjour Patrice,
La suppression du 1er chiffre, si suivi d'un zéro, n'a pas grand intérêt.
Dans ce cas, il suffit de :
> pouvoir le remplacer (en le sélectionnant le code fonctionne)
> tout supprimer
> autre traitement, mais prévoir quoi faire si plein de 0 (zéros)
Tout simplement, ici mis en commentaires :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 Static toto As String Dim c As String c = Replace(Texte, ",", ".") If InStr(c, ".") = 0 And InStr(toto, ".") > 0 Then VerifTextBox = Int(Val(toto)): toto = VerifTextBox: Exit Function End If If c = "" Then toto = "": Exit Function If Right(c, 1) = "." Then If Not toto Like "*.5" Then c = c & "5" ElseIf c Like "*.5." Then c = Mid(c, 1, Len(c) - 1) Else c = Int(Val(toto)) End If End If If Len(CStr(Val(c))) = Len(c) And Val(c) > 0 And Not c Like ("*.##*") Then VerifTextBox = c toto = Texte 'ElseIf Left(c, 1) = "0" Then 'ici traiter la suppression du premier chiffre 'si 0 est en seconde position Else VerifTextBox = toto End If
Cordialement,
Franck
J'avais simplement compris que la demande concernait des nombres >= 1Il y a un autre problème, aussi à cause du Val(), on ne peut pas saisir 0.5
Mais si c'est cela qui vous arrête (vraiment ...) --->>
Fastoche également ---
remplacer
par
Code : Sélectionner tout - Visualiser dans une fenêtre à part If Len(CStr(Val(c))) = Len(c) And Val(c) > 0 And Not c Like ("*.##*") Then
Vraiment ... !!
Code : Sélectionner tout - Visualiser dans une fenêtre à part If Len(CStr(Val(c))) = Len(c) And c Like "[0-9]*" And Not c Like ("*.##*") Then
Aut'chose ?
Je vous préviens tout de suite : la logique de ce code est telle, qu'il est extrêmement facile de l'adapter sans le bouleverser (contrairement à d'autres approches)
Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .
****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...
Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.
Salut Franck
Et même avant d'aller à la pêche
(je l'ai dit : la logique même de ce code permet toutes les adaptations que l'on veut, sans bouleversement) :
Regarde : il suffit de modifier la valeur de la variable c ainsi :
Ce qui donne (pour récapituler le tout) :c = CStr(Val(Replace(TextBox1.Text, ",", ".")))
et Patrice est encore mieux servi que ce qu'il demandait -->> s'il supprime le 1 de 1032, il obtient directement 32 et non "032"
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 Private Sub TextBox1_Change() Static toto As String Dim c As String c = CStr(Val(Replace(TextBox1.Text, ",", "."))) If InStr(c, ".") = 0 And InStr(toto, ".") > 0 Then TextBox1.Text = Int(Val(toto)): toto = TextBox1.Text: Exit Sub End If If c = "" Then toto = "": Exit Sub If Right(c, 1) = "." Then If Not toto Like "*.5" Then c = c & "5" Else c = Int(Val(toto)) End If End If Application.EnableEvents = False If Len(CStr(Val(c))) = Len(c) And c Like "[0-9]*" And Not c Like ("*.##*") Then TextBox1.Text = c toto = TextBox1.Text Else TextBox1.Text = toto End If Application.EnableEvents = True End Sub
C'est toute la différence entre la maintenance/évolution d'un code soit-disant complexe et celle d'un code qui, lui, est construit de telle sorte que chaque nouvelle demande pose un nouveau problème ...
Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .
****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...
Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.
@jacques
tape"0," on obtiens "0.5"
puis tape la touche back(on reviend a "0"
puis tape "1"
y aurait il pas un moyen pour que ce 1 remplace le zero car en l'etat le 1 est inhibé on est donc bloqué si on ne fait pas un back sur le zero
code testé avec ta derniere mise a jour bien entendu
re probleme résolu comme ceci
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 Private Sub TextBox1_Change() Static toto As String Dim c As String c = Replace(TextBox1.Text, ",", ".") If InStr(c, ".") = 0 And InStr(toto, ".") > 0 Then TextBox1.Text = Int(Val(toto)): toto = TextBox1.Text: Exit Sub End If TextBox2 = c TextBox3 = toto If c = "" Then toto = "": Exit Sub If Right(c, 1) = "." Then If Not toto Like "*.5" Then c = c & "5" Else c = Int(Val(toto)) End If End If Application.EnableEvents = False If Len(CStr(Val(c))) = Len(c) And c Like "[0-9]*" And Not c Like ("*.##*") Then TextBox1.Text = c If Val(toto) = 0 And Len(toto) <> 0 And Val(c) = 0 Then TextBox1 = "" toto = TextBox1.Text Else TextBox1.Text = toto End If Application.EnableEvents = True End Sub
mes fichiers dans les contributions:
mail avec CDO en vba et mail avec CDO en vbs dans un HTA
survol des bouton dans userform
prendre un cliché d'un range
si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
et n'oublie pas de voter
Non Jacques.
Une telle modification (c = CStr(Val(Replace(TextBox1.Text, ",", ".")))) empêche la saisie de la virgule.
Je préfères traiter ce cas "à part" dans la seconde partie avec un ElseIf :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36 Option Explicit Private Sub TextBox1_Change() TextBox1.Text = VerifTextBox(TextBox1.Text) End Sub Private Function VerifTextBox(Texte) As String Static toto As String Dim c As String c = Replace(Texte, ",", ".") If InStr(c, ".") = 0 And InStr(toto, ".") > 0 Then VerifTextBox = Int(Val(toto)) toto = VerifTextBox Exit Function End If If c = "" Then toto = "": Exit Function If Right(c, 1) = "." Then If Not toto Like "*.5" Then c = c & "5" ElseIf c Like "*.5." Then ' MODIF c = Mid(c, 1, Len(c) - 1) Else c = Int(Val(toto)) End If End If If Len(CStr(Val(c))) = Len(c) And c Like "[0-9]*" And Not c Like ("*.##*") Then VerifTextBox = c toto = VerifTextBox ElseIf Left(c, 1) = "0" Then ' MODIF VerifTextBox = CStr(Val(c)) toto = VerifTextBox Else VerifTextBox = toto End If End Function
Cordialement,
Franck
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager