Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

pb avec le point décimal

8 réponses
Avatar
Piotr
bonjour,

Je rencontre un problème avec VB-Excel concernant le "point décimal" pour
une fonction qui devrait être partagée sur plusieurs postes ayant des
"paramètres régionaux" différents.

Voici la formule (partie problèmatique de la fonction) :
(pour information, il s'agit du test de Student en statistique)

w = Evaluate("2 * (1 - NormSDist(" + Format$(t, "0.000000") + "))")

"NormSDist" est une fonction Excel. J'obtiens donc le résultat en VB avec la
fonction "Evaluate".
"t" est déclaré et calculé précédemment (Double). Il est traduit en texte
avec la fonction "Format$".

Sur mon poste, le séparateur de décimal est le point ("." car j'utilise des
logiciels américains qui s'adpatent mal aux import-exports). Mais sur la
plupart des autres postes, c'est classiquement la virgule ("," définie par
défaut dans les paramètres régionaux en France).

J'ai testé la fonction sur un poste à virgule : cela ne marche pas. J'ai
testé plusieurs configurations avec
- un point ou une virgule dans la formule ("0.000000" ou "0,000000")
- un point ou une virgule dans les paramètres régionaux
- un point ou une virgule dans les paramètres d'Excel
La seule combinaison qui fonctionne est celle qui combine le point dans la
formule ET dans les paramètres régionaux (indifféremment des paramètres
d'Excel). Tout se passe donc comme si VB ne comprenait que l'américain et
nous imposait de l'être ! (je précise que je ne suis pas a priori
anti-américian, mais qu'il ne faut pas exagérer)

Pouvez-vous m'aider à adapter cette formule pour qu'elle fonctionne sur tous
les postes, qu'ils soient configurés "à l'américaine" ou "à la française" ?

Merci.
Piotr.

8 réponses

Avatar
Daniel.C
Bonjour.
J'ai déjà rencontré ce type de problème. De guerre lasse, j'ai changé le
séparateur décimal le temps de l'exécution de la macro.
Cordialement.
Daniel
"Piotr" a écrit dans le message de news:
fg7101$uo9$
bonjour,

Je rencontre un problème avec VB-Excel concernant le "point décimal" pour
une fonction qui devrait être partagée sur plusieurs postes ayant des
"paramètres régionaux" différents.

Voici la formule (partie problèmatique de la fonction) :
(pour information, il s'agit du test de Student en statistique)

w = Evaluate("2 * (1 - NormSDist(" + Format$(t, "0.000000") + "))")

"NormSDist" est une fonction Excel. J'obtiens donc le résultat en VB avec
la fonction "Evaluate".
"t" est déclaré et calculé précédemment (Double). Il est traduit en texte
avec la fonction "Format$".

Sur mon poste, le séparateur de décimal est le point ("." car j'utilise
des logiciels américains qui s'adpatent mal aux import-exports). Mais sur
la plupart des autres postes, c'est classiquement la virgule ("," définie
par défaut dans les paramètres régionaux en France).

J'ai testé la fonction sur un poste à virgule : cela ne marche pas. J'ai
testé plusieurs configurations avec
- un point ou une virgule dans la formule ("0.000000" ou "0,000000")
- un point ou une virgule dans les paramètres régionaux
- un point ou une virgule dans les paramètres d'Excel
La seule combinaison qui fonctionne est celle qui combine le point dans la
formule ET dans les paramètres régionaux (indifféremment des paramètres
d'Excel). Tout se passe donc comme si VB ne comprenait que l'américain et
nous imposait de l'être ! (je précise que je ne suis pas a priori
anti-américian, mais qu'il ne faut pas exagérer)

Pouvez-vous m'aider à adapter cette formule pour qu'elle fonctionne sur
tous les postes, qu'ils soient configurés "à l'américaine" ou "à la
française" ?

Merci.
Piotr.






Avatar
Piotr
Merci Daniel,

Ce problème VB m'en rappelle un autre : l'export de dates au format texte.
En "manuel", c'est bien le format "français" (jj/mm/aaa) qui est utilisé,
mais en VB c'est le format américain (mm/jj/aaaa).
Pour élargir la question, n'y a-t-il pas un moyen de "forcer" VB à utiliser
les paramètres régionaux du poste ?

Pour les dates, je m'en étais sorti en passant par un champ texte. Mais pour
mon "Evaluate" je suis concé (je dois avoir des paramètres régionaux
américains pour que la formule puisse être évaluée). A moins de les changer
temporairement et automatiquement durant l'appel de la fonction ? (remarque
: il s'agit d'une fonction d'utilisation récurrente et non pas d'une macro
d'utilisation ponctuelle)

NB : j'utilise Excel 2003 SP3 avec un poste sur XP professionnel V5.1.2600
SP2 Nu 2600. Ce problème est-il présent également dans la version 2007/vista
?

Piotr.

"Daniel.C" a écrit dans le message de news:

Bonjour.
J'ai déjà rencontré ce type de problème. De guerre lasse, j'ai changé le
séparateur décimal le temps de l'exécution de la macro.
Cordialement.
Daniel


Avatar
papou
Bonjour
Avec la macro complémentaire Paramreg.xla de Laurent Longre tu pourras le
faire :
http://xcell05.free.fr/

Cordialement
Pascal


"Piotr" a écrit dans le message de news:
fg780d$215$
Merci Daniel,

Ce problème VB m'en rappelle un autre : l'export de dates au format texte.
En "manuel", c'est bien le format "français" (jj/mm/aaa) qui est utilisé,
mais en VB c'est le format américain (mm/jj/aaaa).
Pour élargir la question, n'y a-t-il pas un moyen de "forcer" VB à
utiliser les paramètres régionaux du poste ?

Pour les dates, je m'en étais sorti en passant par un champ texte. Mais
pour mon "Evaluate" je suis concé (je dois avoir des paramètres régionaux
américains pour que la formule puisse être évaluée). A moins de les
changer temporairement et automatiquement durant l'appel de la fonction ?
(remarque : il s'agit d'une fonction d'utilisation récurrente et non pas
d'une macro d'utilisation ponctuelle)

NB : j'utilise Excel 2003 SP3 avec un poste sur XP professionnel V5.1.2600
SP2 Nu 2600. Ce problème est-il présent également dans la version
2007/vista ?

Piotr.

"Daniel.C" a écrit dans le message de news:

Bonjour.
J'ai déjà rencontré ce type de problème. De guerre lasse, j'ai changé le
séparateur décimal le temps de l'exécution de la macro.
Cordialement.
Daniel






Avatar
Daniel.C
Je n'ai pas tout essayé, mais je sais que le comportement varie aussi avec
la version d'Excel, ce qui est plus surprenant; par exemple un code
développé et testé avec la virgule avec XL2003 ne fonctionnait pas avec
XL2000. Peut-être, dans ton cas, essaie d'utiliser une cellule pour
récupérer le résultat, ou de mettre la formule dans une cellule.
Bon courage.
Daniel
"Piotr" a écrit dans le message de news:
fg780d$215$
Merci Daniel,

Ce problème VB m'en rappelle un autre : l'export de dates au format texte.
En "manuel", c'est bien le format "français" (jj/mm/aaa) qui est utilisé,
mais en VB c'est le format américain (mm/jj/aaaa).
Pour élargir la question, n'y a-t-il pas un moyen de "forcer" VB à
utiliser les paramètres régionaux du poste ?

Pour les dates, je m'en étais sorti en passant par un champ texte. Mais
pour mon "Evaluate" je suis concé (je dois avoir des paramètres régionaux
américains pour que la formule puisse être évaluée). A moins de les
changer temporairement et automatiquement durant l'appel de la fonction ?
(remarque : il s'agit d'une fonction d'utilisation récurrente et non pas
d'une macro d'utilisation ponctuelle)

NB : j'utilise Excel 2003 SP3 avec un poste sur XP professionnel V5.1.2600
SP2 Nu 2600. Ce problème est-il présent également dans la version
2007/vista ?

Piotr.

"Daniel.C" a écrit dans le message de news:

Bonjour.
J'ai déjà rencontré ce type de problème. De guerre lasse, j'ai changé le
séparateur décimal le temps de l'exécution de la macro.
Cordialement.
Daniel






Avatar
Modeste
Bonsour® Piotr avec ferveur ;o))) vous nous disiez :

Pour élargir la question, n'y a-t-il pas un moyen de "forcer" VB à
utiliser les paramètres régionaux du poste ?


Set NewBook = Workbooks.Add
NewBook.SaveAs Filename:=fName, Local:=True

----Tiré de l'aide F1
Filename Argument de type Variant facultatif. Chaîne qui indique le nom du
fichier à enregistrer. Vous pouvez inclure un chemin complet ; si vous ne le
faites pas, Microsoft Excel enregistre le fichier dans le dossier en cours.
../..
../..
Local Argument de type Variant facultatif. La valeur True enregistre les
fichiers en fonction de la langue de Microsoft Excel (y compris les paramètres
du Panneau de configuration). La valeur False (valeur par défaut) enregistre les
fichiers en fonction de la langue de Visual Basic pour Applications (VBA) (qui
est généralement l'anglais des États-Unis)

@+
;o)))

Avatar
MichDenis
Il me semble que quelque chose comme ceci devrait fonctionner
peu importe le séparateur décimal


Dim T As Variant
' à tester aussi avec un point comme séparateur décimale
T = "125,36"
T = Application.WorksheetFunction.Substitute(T, ",", ".")
T = Val(T)
'T = Format(T, "0.000000")
OU
w = Evaluate("2 * (1 - NormSDist(" + Format$(T, "0.000000") + "))")




"Piotr" a écrit dans le message de news: fg7101$uo9$
bonjour,

Je rencontre un problème avec VB-Excel concernant le "point décimal" pour
une fonction qui devrait être partagée sur plusieurs postes ayant des
"paramètres régionaux" différents.

Voici la formule (partie problèmatique de la fonction) :
(pour information, il s'agit du test de Student en statistique)

w = Evaluate("2 * (1 - NormSDist(" + Format$(t, "0.000000") + "))")

"NormSDist" est une fonction Excel. J'obtiens donc le résultat en VB avec la
fonction "Evaluate".
"t" est déclaré et calculé précédemment (Double). Il est traduit en texte
avec la fonction "Format$".

Sur mon poste, le séparateur de décimal est le point ("." car j'utilise des
logiciels américains qui s'adpatent mal aux import-exports). Mais sur la
plupart des autres postes, c'est classiquement la virgule ("," définie par
défaut dans les paramètres régionaux en France).

J'ai testé la fonction sur un poste à virgule : cela ne marche pas. J'ai
testé plusieurs configurations avec
- un point ou une virgule dans la formule ("0.000000" ou "0,000000")
- un point ou une virgule dans les paramètres régionaux
- un point ou une virgule dans les paramètres d'Excel
La seule combinaison qui fonctionne est celle qui combine le point dans la
formule ET dans les paramètres régionaux (indifféremment des paramètres
d'Excel). Tout se passe donc comme si VB ne comprenait que l'américain et
nous imposait de l'être ! (je précise que je ne suis pas a priori
anti-américian, mais qu'il ne faut pas exagérer)

Pouvez-vous m'aider à adapter cette formule pour qu'elle fonctionne sur tous
les postes, qu'ils soient configurés "à l'américaine" ou "à la française" ?

Merci.
Piotr.
Avatar
Piotr
Merci MichDenis,
C'est toi qui m'a fourni la solution (je n'ai pas testé toutes les autres,
mais la tienne fonctionne).

Réponse :
1- La fonction "Evaluate" ne fonctionne qu'avec des chiffres au format
américain, quelque soit les paramètres régionaux du poste. Vous pouvez
tester avec la fonction exemple suivante :
Public Function test_1(t As String) As Double
test_1 = Evaluate(t)
End Function
Elle fonctionne toujours avec 0.01, mais jamais avec 0,01

2- La fonction Format$ n'utilise que des formats américains, mais son
résultat dépend des paramètres régionaux. Pour exemple la fonction suivante
:
Public Function test_2(t As Double, f As String) As String
test_2 = Format$(t, f)
End Function
Avec paramètres régionaux à virgule, t=0,01 et f="0.000000", on obtient
0,010000, mais cela ne fonctionne pas avec f="0,000000" (en fait il
interprète la virgule comme un séparateur de milier, comme à l'américaine).

3- C'est donc la sortie de Format$ qui pose problème. Il suffit de remplacer
la virgule par un point avec Substitute. La fonction exemple suivante marche
donc bien avec des paramètres régionaux à la Française :
Public Function test_3(t As Double, f As String) As Double
Dim temp As String
temp = Format$(t, f)
temp = Application.WorksheetFunction.Substitute(temp, ",", ".")
test_3 = Evaluate("2 * (1 - NormSDist(" + temp + "))")
End Function
Pour t=1,96, f="0.000000", on aboutit bien à 5%, même avec des paramètres
régionaux à virgule (et aussi avec les paramètres régionaux à point).

Pour élargir la résolution de ce problème à tous les paramètres régionaux,
il faudrait une fonction qui traduise un nombre en caractères en conservant
le résultat au format américain, sans tenir compte des paramètres régionaux.
Je chercherai si cela existe demain. Si quelqu'un a la réponse à cette
question...

Merci à tous d'avoir fait avancer le schmilblick.

Piotr.


"MichDenis" a écrit dans le message de news:

Il me semble que quelque chose comme ceci devrait fonctionner
peu importe le séparateur décimal


Dim T As Variant
' à tester aussi avec un point comme séparateur décimale
T = "125,36"
T = Application.WorksheetFunction.Substitute(T, ",", ".")
T = Val(T)
'T = Format(T, "0.000000")
OU
w = Evaluate("2 * (1 - NormSDist(" + Format$(T, "0.000000") + "))")



Avatar
MichDenis
| Pour élargir la résolution de ce problème à tous les paramètres régionaux,
| il faudrait une fonction qui traduise un nombre en caractères en conservant
| le résultat au format américain, sans tenir compte des paramètres régionaux.
| Je chercherai si cela existe demain. Si quelqu'un a la réponse à cette
| question...

La difficulté première, c'est dans certains coins du monde, le fait de modifier
le séparateur décimal pour le point comme dans l'exemple précédent, peut
devenir conflictuel avec au moins un autre éléments des paramètres locaux
utilisant déjà le pont soit comme séparateur de date ou de milliers. Dans ces
cas de figures non seulement faudra-t-il modifier le séparateur décimale mais
aussi l'autre paramètre qui utilise le point sinon les résultats ne seront pas très
probants ! .... bonne chance !

Dans notre exemple, j'aurai pu faire comme cela :

Dim T As Variant
Dim Sep As String

Sep = Application.International(xlDecimalSeparator)
' à tester aussi avec un point comme séparateur décimale
T = "125,36"
T = Val(Application.Substitute(T, Sep, "."))
T = Format(T, "0.000000")







"Piotr" a écrit dans le message de news: fg7uq9$c4v$
Merci MichDenis,
C'est toi qui m'a fourni la solution (je n'ai pas testé toutes les autres,
mais la tienne fonctionne).

Réponse :
1- La fonction "Evaluate" ne fonctionne qu'avec des chiffres au format
américain, quelque soit les paramètres régionaux du poste. Vous pouvez
tester avec la fonction exemple suivante :
Public Function test_1(t As String) As Double
test_1 = Evaluate(t)
End Function
Elle fonctionne toujours avec 0.01, mais jamais avec 0,01

2- La fonction Format$ n'utilise que des formats américains, mais son
résultat dépend des paramètres régionaux. Pour exemple la fonction suivante
:
Public Function test_2(t As Double, f As String) As String
test_2 = Format$(t, f)
End Function
Avec paramètres régionaux à virgule, t=0,01 et f="0.000000", on obtient
0,010000, mais cela ne fonctionne pas avec f="0,000000" (en fait il
interprète la virgule comme un séparateur de milier, comme à l'américaine).

3- C'est donc la sortie de Format$ qui pose problème. Il suffit de remplacer
la virgule par un point avec Substitute. La fonction exemple suivante marche
donc bien avec des paramètres régionaux à la Française :
Public Function test_3(t As Double, f As String) As Double
Dim temp As String
temp = Format$(t, f)
temp = Application.WorksheetFunction.Substitute(temp, ",", ".")
test_3 = Evaluate("2 * (1 - NormSDist(" + temp + "))")
End Function
Pour t=1,96, f="0.000000", on aboutit bien à 5%, même avec des paramètres
régionaux à virgule (et aussi avec les paramètres régionaux à point).

Pour élargir la résolution de ce problème à tous les paramètres régionaux,
il faudrait une fonction qui traduise un nombre en caractères en conservant
le résultat au format américain, sans tenir compte des paramètres régionaux.
Je chercherai si cela existe demain. Si quelqu'un a la réponse à cette
question...

Merci à tous d'avoir fait avancer le schmilblick.

Piotr.


"MichDenis" a écrit dans le message de news:

Il me semble que quelque chose comme ceci devrait fonctionner
peu importe le séparateur décimal


Dim T As Variant
' à tester aussi avec un point comme séparateur décimale
T = "125,36"
T = Application.WorksheetFunction.Substitute(T, ",", ".")
T = Val(T)
'T = Format(T, "0.000000")
OU
w = Evaluate("2 * (1 - NormSDist(" + Format$(T, "0.000000") + "))")