dsl mais je ne comprends pas tout. j'inscris ce code ou?
Version imprimable
dsl mais je ne comprends pas tout. j'inscris ce code ou?
Salut Ouskel'n'or,
Je ne parle pas de les modifier, mais de les connaître pour pouvoir interpréter, corriger ou rejeter la saisie...
Cela pourrait se faire via les RegEx dans VBA, par exemple...
jbggg,
Le code que je donne ne s'utilise pas tel quel, il permet simplement de connaître les séparateurs utilisés par Excel et de tester la saisie en fonction des séparateurs.
J'ai bien une solution mais j'aimerais tout de même savoir si la proposition de Pierre peut régler le problème.
La solution consiste à passer par une variable déclarée dans le textbox_exit et non dans change
Si la solution de Pierre est ok, tu oublies ;)Code:
1
2
3
4
5 Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean) Dim result As Variant result = Val(Replace(TextBox1, ",", ".")) Range("feuil1!G19") = result End Sub
Merci pour ta réponse, Pierre.
En fait, je ferais autre chose que mon code précédent :
Toujours dans Exit
Ainsi tu contrains l'opérateur géomètre à saisir un point à la place d'une virgule.Code:
1
2
3
4
5
6
7
8
9 Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean) If Not TextBox1 Like ("*.###") Then 'je pense que les distance sont limitées au mm Cancel = True Beep Else Cancel = False End If If Not Cancel Then Range("feuil1!G19") = TextBox1.Value End Sub
Il y a sans doute plus sioux mais là c'est tout ce qui me vient.
Edit
J'ajouterais tout de même
Code:
1
2 if textbox1 = "" then exit sub If Not TextBox1 Like ("*.###") Then
donc il faudrait que je fasse de même pour tout mes textbox?
parce que je ne suis pas super balèze et doonc je ne sais pas si pour mon projet cela va passer!!
Faut ce que faut !
En effet, à part les N° de points... A moins que la solution proposée par Pierre puisse être utilisée ici.
Mais je modifierais encore le code et je vérifierais tout de même si la valeur saisie est bien un numérique. Si l'opérateur saisit 1O1.456 au lieu de 101.456 tu auras une erreur. Suffit d'ajouter ici and not isnumeric(textbox1)
Tu peux même ajouter un message sur la ligne du dessous pour rappeler les consignes...Code:If Not TextBox1 Like ("*.###") and not isnumeric(textbox1) Then
Ceci dit, à quoi rime cette saisie manuelle de carnet alors que les carnets électroniques permettent depuis le début des années 80 le transfert des données directement du tachéomètre au micro... C'est un exercice ? C'est un calcul de polygonnale ? ;)
A+
Edit
Pour les angles, comme tu peux avoir quatres chiffres après la virgule, remplace If Not TextBox1 Like ("*.###") par If Not TextBox1 Like ("*.####") Mais cela imposera la saisie de 4 chiffres après la virgule.
# signifie que le caractère saisi est un chiffre.
* remplace n'importe quel caractère (c'est pourquoi tu dois vérifier si la partie entière est numérique)
Merci pour ton appel du pied, Joël... ;)
Cela étant, ma solution, comme n'importe laquelle à mon avis, s'applique sur chaque contrôle. Il y a moyen d'utiliser une fonction qui renvoie les valeurs converties, mais il faudra de toute façon traiter chaque contrôle, soit sur l'exit comme tu le préconises, soit lors de la validation de l'ensemble de la saisie du userform...
Habituellement je préfère vérifier en fin de saisie mais dans le cas de nombres avec plein de virgules, qui ne sont pas "parlants", et pour avoir travaillé sur des logiciels de calculs en topographie, je pense que dans ce cas précis une vérification continue est préférable. Mais ce n'est qu'un avis. (on a déjà eu la discussion avec un certain uchs :mouarf:
(Si tu passes par là, "Bonjour ucfoutu !")
Oui je sais que des logiciels de topo existent déjà, mais c'est mon projet d'info.
ce qui est bizard c'est qu'un ancien a utilisé des userform et avait fait pratiquement la même chose que moi et j'ai regardé, il utilise directement c'est textbox avec des chiffres virgules dedans.
Parce que cela dépend des paramètres régionaux de Windows ou des paramètres d'Excel.
Dans Outils/Options/International, tu as la possibilité de choisir les paramètres régionaux du système ou de définir les tiens. Attention, c'est un paramètre d'application et pas un paramètre fichier... ce qui risque d'amener à des petits problèmes lors de l'utilisation du fichier sur un autre pc...
en fait le problème se pose lorsqu'il y a une virgule.
ainsi pour des entiers, l'addition 1+1 donne bien 2
mais lorsqu'il y a une virgule, l'addition 1,5+1,5 donne 1,51,5
Si le fichier ne doit fonctionner que sur ta machine, utilise
Cela devrait solutionner ton problèmeCode:replace(textbox1.value,",",".")
ba non il doit aussi fonctionner sur le pc de mon prof
je dois lui envoyer par mail.
alors la je teste avec des variable. j'ai crée un module avec tous les types de variable.
en gros je mets: Range("calcul1!D17") = a+b
avec a as single et b as single
Bonjour tlm,
Si j'ai bien compris, le problème réside dans la saisie du séparateur de décimale qui peut être la virgule sur un poste et le point sur un autre poste (frappez moi sur les doigts si ce n'est pas ça...pas sur la tête please :aie:)
Quelque chose de ce genre ne pourrait pas convenir ?
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14 Private Sub CommandButton1_Click() Dim a As Single, b As Single If Application.International(xlDecimalSeparator) = "," Then a = CSng(Replace(TextBox1, ".", ",")) b = CSng(Replace(TextBox2, ".", ",")) Else a = CSng(Replace(TextBox1, ",", ".")) b = CSng(Replace(TextBox2, ",", ".")) End If Sheets("calcul1").Range("D17") = a + b End Sub
En voyant le code de fring, (bonsoir fring) comme je vois qu'il utilise un bouton : As-tu un bouton de validation ? Parce que si oui, alors tu peux passer en revue tous tes textbox concernés par ton pb de virgule d'un seul coup et dans une même procédure. C'est ton prof qui serait étonné :mouarf:
Tu dis
A+
Juste pour embê** Fring (c'est pour rire...;);))
Et si la personne pense que le séparateur des milliers est la virgule...??? 8O
Ceci dit, je n'ai pas LA solution, mais simplement, je souligne que ce n'est pas aussi simple que cela en a l'air...
Oui Pierre oeuf corse, je ne peux te donner que raison, à ce moment là on peut aussi se poser la question : et si l'utilisateur introduit 10.251,35 ou 10.251.35 ou 10,251,35 ou ...etc...
Comme tu dis ce n'est pas simple de parer à toutes les éventualités.
Sujet intéressant :)
Salut Fred, ;)
Oui, il faut définir le degré de sécurité de la saisie. Avec Excel, on a moins de possibilités coercitives qu'avec Access, par exemple.
En fonction de ce degré de sécurité souhaité, on aura un truc simple ou un truc...moins simple...
Sur ce, pour moi, c'est ... au dodo...
:mouarf:
Heu, pour l'oeuf corse, c'est rapport à mon crâne très peu chevelu ?? re:mouarf:
Juste pour embê** Pierre (c'est du sérieux... :twisted: )
Sur une idée de fring, donc...
Code:
1
2
3
4
5
6
7
8
9 Sub TesteBoxen_Exit() Dim nombre As Variant, result As Double nombre = Array("125.254", "4 256,1125", "12,153", "1,254.257", "4.458,2485") For i = 0 To UBound(nombre) result = bidouille(nombre(i)) MsgBox result Range(Qui va bien) = Result Next End Sub
Et ce que tu envoies à la fonction, c'est textbox1 tout court à la place de Textbox1.valueCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 Private Function bidouille(nombre As Variant) As Double Dim nbt nbt = nombre 'ici, tu remplaces l'éventuel séparateur de milliers quel qu'il soit If InStr(nbt, ",") > InStr(nbt, ".") Then nbt = Replace(nbt, ".", "") ElseIf InStr(nbt, ".") > InStr(nbt, ",") Then nbt = Replace(nbt, ",", "") End If 'ce qui reste est le nombre avec le séparateur décimal... donc... Select Case Application.International(xlDecimalSeparator) Case "," bidouille = CDbl(Replace(nbt, ".", ",")) Case "." bidouille = CDbl(Replace(nombre, ",", ".")) Case Else bidouille = CDbl(nombre) End Select End Function
Bien sûr, tu remplaces Sub TesteBoxen_Exit() par
Bonne journéeCode:
1
2
3
4
5
6
7
8
9
10
11 Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean) Dim Result as double if Textbox1 = "" then exit sub Result = Bidouille(TextBox1) if not is numeric(Result) then cancel = true else cancel = false Range("feuil1!G19") = Bidouille(TextBox1) endif End Sub
Après une nuit de réflexion... ce devrait être bon
hello,
je me pose une question, ne pourrait-on simplement pas se dire que le premier séparateur rencontré à partir de la droite est le séparateur des décimales?
genre
tordu mais bon!Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 Dim I, J, K, L, M, X Dim T As String T = "123 123 256 789.456789" K = Split(T, ".") J = Split(K(UBound(K)), ",") I = 10 ^ Len(J(UBound(J))) L = J(UBound(J)) / I M = Replace(T, ",", "") M = Replace(M, ".", "") M = Replace(M, " ", "") X = CDbl(M) / L