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

Formatage de nombre

11 réponses
Avatar
Fred
Bonjour,

Sur un document dont le code est ci-dessou, je souhaiterais avoir le format
de nombre : 10,00 au lieu de 10,000 comme c'est le cas actuellement.
Pour moi, il me semble que la chaîne à modifier est : str_mot =
Mid(str_chaine, position_mot, InStr(position_mot, str_chaine, "*X*") -
position_mot)
Mais je sèche sur les options de format ainsi que sur l'endroit où les
positionner...

Si quelqu'un avait une petite idée cela m'arrangerait pas mal...
Merci.

FRED.





'Declare Function GetTickCount Lib "Kernel32" () As Long
Sub macro_item()
Dim str_item As String
Dim str_mot As String
Dim position_item As Double
Dim position_mot As Double
Dim champ As Field

For Each champ In ActiveDocument.Fields
If InStr(1, str_chaine, "ITEM") = 0 Then
Exit For
End If

If InStr(1, champ, "MACROBUTTON SAT") <> 0 Then
str_item = Trim(Mid(champ.Code, Len(" MACROBUTTON SAT ") + 1))
position_item = InStr(1, str_chaine, str_item)

If position_item > 0 Then
position_mot = InStr(position_item, str_chaine, "*X*") + 3
str_mot = Mid(str_chaine, position_mot, InStr(position_mot,
str_chaine, "*X*") - position_mot)
If str_mot = "" Then
champ.Delete
Else
champ.Select
Selection.Text = RTrim(LTrim(str_mot))

End If
str_chaine = Mid(str_chaine, 1, position_item - 1) &
Mid(str_chaine, position_mot + Len(str_mot) + 3)
End If
End If
Next

str_chaine = ""
Selection.GoTo what:=wdGoToLine, Which:=wdGoToFirst, Count:=1, Name:=""


' MsgBox "Temp execution" & GetTickCount - X & " ms"
End Sub

10 réponses

1 2
Avatar
Geo
Bonjour Fred

Un peu plus de précision pour cibler votre problème éviterait à vos
lectrices et lecteurs de loger dans votre code, sans savoir trop où
s'arrêter.
Vous voulez transformer quoi en quoi ?
exemple si c'est "10" en "10,00", pas besoin de format on ajoute ",00"
à la fin de la chaîne de caractère.
Si c'est un résultat de calcul à présenter avec deux décimales c'est
bien format qui est adapté.
Pour renvoyer un nombre décimal à deux chiffres :
Format(2.369, "#.##")
renvoie 2,37

--
A+
Avatar
Fred
Bonjour Geo,

Effectivement, c'est un peu confu, du fait en partie que le code que je
tente de modifier fait partie d'une assez longue extraction de notre
progiciel...

Il me semble la variable qu'il me faut soit "str_mot" :

str_mot = Mid(str_chaine, position_mot, InStr(position_mot,
str_chaine, "*X*") - position_mot)

C'est donc à cette varialble que je souhaite appliquer un format à deux
décimales (10,00) alors qu'actuellement nous obtenons trois décimales
(10,000).
Je ne vois pas trop à quel endroit rajouter "Format...".

FRED.




"Geo" a écrit dans le message de
news:
Bonjour Fred

Un peu plus de précision pour cibler votre problème éviterait à vos
lectrices et lecteurs de loger dans votre code, sans savoir trop où
s'arrêter.
Vous voulez transformer quoi en quoi ?
exemple si c'est "10" en "10,00", pas besoin de format on ajoute ",00" à
la fin de la chaîne de caractère.
Si c'est un résultat de calcul à présenter avec deux décimales c'est bien
format qui est adapté.
Pour renvoyer un nombre décimal à deux chiffres :
Format(2.369, "#.##")
renvoie 2,37

--
A+




Avatar
Geo
Bonjour

str_mot = Mid(str_chaine, position_mot, InStr(position_mot,
str_chaine, "*X*") - position_mot)

C'est donc à cette varialble que je souhaite appliquer un format à deux décimales
(10,00) alors qu'actuellement nous obtenons trois décimales (10,000).
Je ne vois pas trop à quel endroit rajouter "Format...".



S'il s'agit de supprimer le dernier caractère, modifiez votre
instruction ainsi
str_mot = Mid(str_chaine, position_mot, InStr(position_mot,
str_chaine, "*X*") - position_mot - 1)

str_mot fera un caractère de moins.

--
A+
Avatar
Fred
Génial, ça a l'air de fonctionner !
J'avais un peu peur que du coup le format lorsque l'on avait pas de
décimales (10 au lieu de 10,25) mais ça a l'air de fonctionner.
Merci encore.

FRED


"Geo" a écrit dans le message de
news:
Bonjour

str_mot = Mid(str_chaine, position_mot, InStr(position_mot,
str_chaine, "*X*") - position_mot)

C'est donc à cette varialble que je souhaite appliquer un format à deux
décimales (10,00) alors qu'actuellement nous obtenons trois décimales
(10,000).
Je ne vois pas trop à quel endroit rajouter "Format...".



S'il s'agit de supprimer le dernier caractère, modifiez votre instruction
ainsi
str_mot = Mid(str_chaine, position_mot, InStr(position_mot,
str_chaine, "*X*") - position_mot - 1)

str_mot fera un caractère de moins.

--
A+




Avatar
Fred
euh, j'ai parlé un peu vite!
en fait cela enlève aussi les nombres de dates (2009 devient 200)...
Il faudrait en fait bien manipuler les décimales...

FRED


"Geo" a écrit dans le message de
news:
Bonjour

str_mot = Mid(str_chaine, position_mot, InStr(position_mot,
str_chaine, "*X*") - position_mot)

C'est donc à cette varialble que je souhaite appliquer un format à deux
décimales (10,00) alors qu'actuellement nous obtenons trois décimales
(10,000).
Je ne vois pas trop à quel endroit rajouter "Format...".



S'il s'agit de supprimer le dernier caractère, modifiez votre instruction
ainsi
str_mot = Mid(str_chaine, position_mot, InStr(position_mot,
str_chaine, "*X*") - position_mot - 1)

str_mot fera un caractère de moins.

--
A+




Avatar
Geo
Bonjour

en fait cela enlève aussi les nombres de dates (2009 devient 200)...
Il faudrait en fait bien manipuler les décimales...



Il manque des éléments pour comprendre d'où sortent ces données et ce
qu'il faut en faire.
A première vue votre macro examine les boutons de lancement d'une macro
de nom SAT.
Le texte affiché sur ces boutons peut comporter un texte contenant * X
* (sans espaces) suivi d'une valeur qui peut être un nombre.
Le but est de récupérer ce nombre qui sous la forme numérique avec deux
décimales ou entier (date).
Si on utilise la fonction format et selon votre règle 10 doit
s'afficher 10,00, une année s'affichera 2009,00
Il faut donc une règle complémentaire pour déterminer si on doit mettre
des décimales ou pas.

Sinon le principe sera : récupérer la chaîne str_mot
vérifier qu'elle contient un nombre
traduire la chaîne en nombre
et la traduire en caractères par une instruction format.

--
A+
Avatar
Fred
Bonjour,

Effectivement, j'ai eu le problème avec les dates, que je pensais avoir
réglé avec un :

If InStr(str_mot, "/") > 0 Then ' vérifie qu'il y a un "/" dans le mot
str_mot = Format(CDate(str_mot), "dd/mm/yyyy")

Else
str_mot = Format(str_mot, "# ##0.00")
If IsDate(str_mot) Then
End If
End If


Mais pas mal de choses ne fonctionnent pas...
Il me semble que cela serait plus adapté de tester si la valeur comporte des
décimales.
Pensez-vous que cela soit possible ?

FRED.

"Geo" a écrit dans le message de
news:
Bonjour

en fait cela enlève aussi les nombres de dates (2009 devient 200)...
Il faudrait en fait bien manipuler les décimales...



Il manque des éléments pour comprendre d'où sortent ces données et ce
qu'il faut en faire.
A première vue votre macro examine les boutons de lancement d'une macro de
nom SAT.
Le texte affiché sur ces boutons peut comporter un texte contenant * X *
(sans espaces) suivi d'une valeur qui peut être un nombre.
Le but est de récupérer ce nombre qui sous la forme numérique avec deux
décimales ou entier (date).
Si on utilise la fonction format et selon votre règle 10 doit s'afficher
10,00, une année s'affichera 2009,00
Il faut donc une règle complémentaire pour déterminer si on doit mettre
des décimales ou pas.

Sinon le principe sera : récupérer la chaîne str_mot
vérifier qu'elle contient un nombre
traduire la chaîne en nombre
et la traduire en caractères par une instruction format.

--
A+




Avatar
Geo
Bonjour

Il me semble que cela serait plus adapté de tester si la valeur comporte des décimales.
Pensez-vous que cela soit possible ?



Tout est possible ou presque, du moment que vous connaissez les données
à traiter.
Vous pourriez utiliser la fonction isDate pour déterminer si c'est une
date.
Pour savoir s'il y a des décimales, c'est vous qui pouvez savoir comme
faire en fonction des données qui se présentent, y a-t-il une virgule
suivie de 1 chiffre, 2 chiffres, 3 chiffres ... ?
Il faut d'abord décrire ce qui vous permet à vous, être humain, de
déterminer que c'est un nombre à afficher avec deux décimales, puis le
programmer.
regardez l'opérateur Like qui pourrait vous aider et vous avez des
fonctions intéressantes : IsDate, IsNumeric, IsError.


--
A+
Avatar
Fred
Merci, L'opérateur Like fonctionne, mais j'ai toujours un problème (encore
!!).

Ma recherche "mycheck" me renvoie bien mes nombre à trois décimales, mais
mon formatage reste sans effet...
Si je rentre str_mot = Format("# ##0.00") (j'ommet donc str_mot), c'est bien
mes chiffres à trois décimales qui sont impactés mais bien entendu je perds
la valeur de str_mot (j'obtiens # ##0.00 écris à la place)....

Je vais craquer !!

FRED.



'Declare Function GetTickCount Lib "Kernel32" () As Long
Sub macro_item()
Dim str_item As String
Dim str_mot As String
Dim position_item As Double
Dim position_mot As Double
Dim champ As Field

Dim MyCheck


For Each champ In ActiveDocument.Fields
If InStr(1, str_chaine, "ITEM") = 0 Then
Exit For
End If

If InStr(1, champ, "MACROBUTTON SAT") <> 0 Then
str_item = Trim(Mid(champ.Code, Len(" MACROBUTTON SAT ") + 1))
position_item = InStr(1, str_chaine, str_item)

If position_item > 0 Then
position_mot = InStr(position_item, str_chaine, "*X*") + 3
str_mot = Mid(str_chaine, position_mot, InStr(position_mot,
str_chaine, "*X*") - position_mot)


MyCheck = str_mot Like "*.000*"
If MyCheck = True Then
str_mot = Format(str_mot, "# ##0.00")
Else
End If


"Geo" a écrit dans le message de
news:
Bonjour

Il me semble que cela serait plus adapté de tester si la valeur comporte
des décimales.
Pensez-vous que cela soit possible ?



Tout est possible ou presque, du moment que vous connaissez les données à
traiter.
Vous pourriez utiliser la fonction isDate pour déterminer si c'est une
date.
Pour savoir s'il y a des décimales, c'est vous qui pouvez savoir comme
faire en fonction des données qui se présentent, y a-t-il une virgule
suivie de 1 chiffre, 2 chiffres, 3 chiffres ... ?
Il faut d'abord décrire ce qui vous permet à vous, être humain, de
déterminer que c'est un nombre à afficher avec deux décimales, puis le
programmer.
regardez l'opérateur Like qui pourrait vous aider et vous avez des
fonctions intéressantes : IsDate, IsNumeric, IsError.


--
A+




Avatar
Geo
Bonjour FRED.
[ Cette réponse est faite sur le forum public Word :
news://msnews.microsoft.com/microsoft.public.fr.word ]
Merci, L'opérateur Like fonctionne, mais j'ai toujours un problème (encore !!).

Ma recherche "mycheck" me renvoie bien mes nombre à trois décimales, mais mon formatage
reste sans effet...
Si je rentre str_mot = Format("# ##0.00") (j'ommet donc str_mot), c'est bien mes
chiffres à trois décimales qui sont impactés mais bien entendu je perds la valeur de
str_mot (j'obtiens # ##0.00 écris à la place)....



str_mot est une chaîne de caractère et non une valeur numérique, la
fonction Format n'a donc aucune action sur son contenu.
Passez par une variable numérique :
Dim Valeur as Double
Valeur = str_mot
str_mot = Format(Valeur, "# ##0.00")

--
A+
1 2