OVH Cloud OVH Cloud

Utilisation de la fontion Val (VBA)

11 réponses
Avatar
Francois
Bonjour,

Je pensais trouver la solution à mon problème dans le fil récent sur
CDate mais raté !

J'utilise VBA pour formater un graphique avec des flèches vers le bas
quand la valeur du point de la série est inférieure à 0 et flèche vers
le haut sinon. Pas de soucis mais ... je ne peux pas faire référence à
la valeur de la cellule source de chaque point du graphique parce que
les feuilles sources des graphiques à traiter ont une organisation que
je dirais assez aléatoire. Donc, pour chaque point, j'ajoute un label
dont je récupère le contenu et que je transforme en valeur numérique
avec la fonction Val. Puis je fais un test sur la valeur pour savoir si
j'utilise le dessin flèche vers le haut ou flèche vers le bas pour
mettre en forme mon point de donnée.

Le problème : le séparateur décimal est la virgule sur certains postes
et donc Val ne prend pas en compte la partie décimale des valeurs.
Gênant puisque je travaille sur des pourcentages d'évolution de quelques
unités. Je pensais m'en sortir avec l'utilisation combinée de CDbl et
Val comme suggéré dans l'aide d'Excel mais que nenni, je suis obligé de
passer par un substitute. Qu'est ce que je n'ai pas compris dans la
combinaison de Val et CDbl ?

Le code :
Sub fleches()
Dim p As Point, etiq As String, vetiq As Double
Sheets("graph1").Select
For Each p In ActiveChart.SeriesCollection(1).Points
p.HasDataLabel = True
'********************************************
'C'est la qu'est le problème
'********************************************
etiq = Application.WorksheetFunction.Substitute _
(p.DataLabel.Text, ",", ".")
vetiq = Val(etiq)
'********************************************
'Fin du problème
'*********************************************
If vetiq >= 0 Then
p.Fill.UserPicture PictureFile:="C:\Mes documents\mpfe\haut.emf", _
PictureFormat:=xlStretch, PicturePlacement:=xlAllFaces
Else
p.Fill.UserPicture PictureFile:="C:\Mes documents\mpfe\bas.emf", _
PictureFormat:=xlStretch, PicturePlacement:=xlAllFaces

p.HasDataLabel = False
End If
Next p

End Sub


D'avance Merci

--
François L

10 réponses

1 2
Avatar
JB
Bonjour

Il semblerait que Cdbl ne fonctionne pas avec . comme séparateur.

temp = "123.456789123" ' ou 123,456789123
temp = "123,456789123"
y = CDbl(Replace(temp, ".", ",")) ' Excel 2000+
ou
z = Val(Replace(temp, ",", ".")) ' Excel 2000+
ou
y = CDbl(Application.Substitute(temp, ".", ","))
ou
z = Val(Application.Substitute(temp, ",", "."))

Cordialement JB
Avatar
Francois
Bonjour

Il semblerait que Cdbl ne fonctionne pas avec . comme séparateur.

temp = "123.456789123" ' ou 123,456789123
temp = "123,456789123"
y = CDbl(Replace(temp, ".", ",")) ' Excel 2000+
ou
z = Val(Replace(temp, ",", ".")) ' Excel 2000+
ou
y = CDbl(Application.Substitute(temp, ".", ","))
ou
z = Val(Application.Substitute(temp, ",", "."))



Merci JB,

Donc je suis obligé de garder mon substitute.

--
François L

Avatar
michdenis
Bonjour JB,

| Il semblerait que Cdbl ne fonctionne pas avec . comme séparateur.

Les fonctions de conversion utilise le séparateur décimale définit
dans le panneau de configuration de Windows.

Perso. j'utilise la virgule et ça fonctionne !

2 exemples -> virgule -> panneau de configuration
Dim V As String
V = "10,25"
a = CDbl(V) OK

V = "10.25"
a = CDbl(V) Ça plante !

Avec le poiint -> panneau de configuration
c'est l'inverse qui se produit !


Salutations!



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

Il semblerait que Cdbl ne fonctionne pas avec . comme séparateur.

temp = "123.456789123" ' ou 123,456789123
temp = "123,456789123"
y = CDbl(Replace(temp, ".", ",")) ' Excel 2000+
ou
z = Val(Replace(temp, ",", ".")) ' Excel 2000+
ou
y = CDbl(Application.Substitute(temp, ".", ","))
ou
z = Val(Application.Substitute(temp, ",", "."))

Cordialement JB
Avatar
Francois
Bonjour JB,

| Il semblerait que Cdbl ne fonctionne pas avec . comme séparateur.

Les fonctions de conversion utilise le séparateur décimale définit
dans le panneau de configuration de Windows.




Bonsoir michdenis,

Avec ton explication, j'ai compris ou était mon erreur !

Merci

--
François L

Avatar
michdenis
Bonjour François,

La fonction Val() n'est confortable qu'avec le point nonobstant le
séparateur décimale du panneau de configuration de Windows.

La fonction CDBL() requiert le même séparateur décimale que celui
définit dans le panneau de configuration de Windows.


Salutations!




"Francois" a écrit dans le message de news:
Bonjour,

Je pensais trouver la solution à mon problème dans le fil récent sur
CDate mais raté !

J'utilise VBA pour formater un graphique avec des flèches vers le bas
quand la valeur du point de la série est inférieure à 0 et flèche vers
le haut sinon. Pas de soucis mais ... je ne peux pas faire référence à
la valeur de la cellule source de chaque point du graphique parce que
les feuilles sources des graphiques à traiter ont une organisation que
je dirais assez aléatoire. Donc, pour chaque point, j'ajoute un label
dont je récupère le contenu et que je transforme en valeur numérique
avec la fonction Val. Puis je fais un test sur la valeur pour savoir si
j'utilise le dessin flèche vers le haut ou flèche vers le bas pour
mettre en forme mon point de donnée.

Le problème : le séparateur décimal est la virgule sur certains postes
et donc Val ne prend pas en compte la partie décimale des valeurs.
Gênant puisque je travaille sur des pourcentages d'évolution de quelques
unités. Je pensais m'en sortir avec l'utilisation combinée de CDbl et
Val comme suggéré dans l'aide d'Excel mais que nenni, je suis obligé de
passer par un substitute. Qu'est ce que je n'ai pas compris dans la
combinaison de Val et CDbl ?

Le code :
Sub fleches()
Dim p As Point, etiq As String, vetiq As Double
Sheets("graph1").Select
For Each p In ActiveChart.SeriesCollection(1).Points
p.HasDataLabel = True
'********************************************
'C'est la qu'est le problème
'********************************************
etiq = Application.WorksheetFunction.Substitute _
(p.DataLabel.Text, ",", ".")
vetiq = Val(etiq)
'********************************************
'Fin du problème
'*********************************************
If vetiq >= 0 Then
p.Fill.UserPicture PictureFile:="C:Mes documentsmpfehaut.emf", _
PictureFormat:=xlStretch, PicturePlacement:=xlAllFaces
Else
p.Fill.UserPicture PictureFile:="C:Mes documentsmpfebas.emf", _
PictureFormat:=xlStretch, PicturePlacement:=xlAllFaces

p.HasDataLabel = False
End If
Next p

End Sub


D'avance Merci

--
François L
Avatar
michdenis
Bonjour François,

Je suppose que lorsque ton application est ouverte par un usager
qui utilise un séparateur décimale autre que celui que tu utilisais
lorsque tu as créé tes étiquettes, le séparateur décimale des étiquettes
ne se mettent pas à jour comme le font les données des cellules
de la feuille de calcul.

Si tes étiquettes sont des contrôles émanant de la barre d'outils "Formulaire",
le contenu de ces dernières ne réagit pas au changement du séparateur
décimale d'une usager à l'autre lorsque l'application s'ouvre...comme le
fait le contenu des cellules... c'est ce qui rend nécessaire la substitution
quand tu utilises la fonction CDBL().

Par contre, si tu utilisais toujours le point dans tes étiquettes nonobstant
le séparateur décimale en usage, la fonction "VAL" ne devrait pas demander
une substitution.


Salutations!



"Francois" a écrit dans le message de news:
Bonjour JB,

| Il semblerait que Cdbl ne fonctionne pas avec . comme séparateur.

Les fonctions de conversion utilise le séparateur décimale définit
dans le panneau de configuration de Windows.




Bonsoir michdenis,

Avec ton explication, j'ai compris ou était mon erreur !

Merci

--
François L

Avatar
Francois
Bonjour François,

Je suppose que lorsque ton application est ouverte par un usager
qui utilise un séparateur décimale autre que celui que tu utilisais
lorsque tu as créé tes étiquettes, le séparateur décimale des étiquettes
ne se mettent pas à jour comme le font les données des cellules
de la feuille de calcul.

Si tes étiquettes sont des contrôles émanant de la barre d'outils "Formulaire",
le contenu de ces dernières ne réagit pas au changement du séparateur
décimale d'une usager à l'autre lorsque l'application s'ouvre...comme le
fait le contenu des cellules... c'est ce qui rend nécessaire la substitution
quand tu utilises la fonction CDBL().

Par contre, si tu utilisais toujours le point dans tes étiquettes nonobstant
le séparateur décimale en usage, la fonction "VAL" ne devrait pas demander
une substitution.
(...)


Bonjour michdenis,

En fait, j'ai un ensemble de graphiques en histogramme à transformer en
remplaçant les barres des histogrammes par des flèches orientées vers le
bas ou vers le haut suivant que la valeur du point de données (ici des
pourcentages annuels d'évolution) est positive ou négative. Les
graphique n'ont par convention pas d'étiquettes de valeur dans le cas
présent. Comme je l'ai expliqué, je ne peux pas utiliser la valeur de la
cellule source de chaque point du graphique car les feuilles sources
sont organisées de manière assez aléatoires ! La solution est donc de
récupérer la valeur de chaque point en utilisant son DataLabel. Je
voulais utiliser Val pour le cas où l'étiquette se présentait sous la
forme "0,01%" mais ça pose problème avec la virgule. Donc la solution
que j'ai trouvé c'est :
1 je crée pour chaque point un DataLabel que je formate en numérique
standard,
2 j'utilise Cdbl pour transformer la chaîne en valeur numérique, ça
marche quel que soit le séparateur décimal,
3 je choisis le dessin pour la barre considérée selon la valeur testée
4 j'efface le DataLabel

Merci de ton aide, j'ai compris comment fonctionne CDbl

--
François L

Avatar
JB
La fonction personnalisée valeurNum(chaine) convertit en valeur
numérique les chaînes avec . ou , comme séparateur de décimales et
divise par 100 si le signe % est présent dans la chaine. Il n'y a pas
besoin de formater les labels en standards.

Function valeurNum(chaine)
Dim temp As Double
temp = Val(Application.Substitute(Application.Substitute(chaine, "%",
""), ",", "."))
valeurNum = IIf(InStr(chaine, "%") > 0, temp / 100, temp)
End Function

vetiq = valeurNum(p.DataLabel.Text)

JB
Avatar
Francois
La fonction personnalisée valeurNum(chaine) convertit en valeur
numérique les chaînes avec . ou , comme séparateur de décimales et
divise par 100 si le signe % est présent dans la chaine. Il n'y a pas
besoin de formater les labels en standards.

Function valeurNum(chaine)
Dim temp As Double
temp = Val(Application.Substitute(Application.Substitute(chaine, "%",
""), ",", "."))
valeurNum = IIf(InStr(chaine, "%") > 0, temp / 100, temp)
End Function


Bonjour JB,

Merci, c'est effectivement une solution mais vu les classeurs dont je
pars, je vais garder la solution de formater le datalabel car je peux
avoir dans les feuilles sources des mises en forme que je n'ai pas
prévues et je n'ai pas envie de prévoir tous les cas de figures.

Après tout, maintenant que je sais que CDbl tient compte du paramètre
local de séparateur, pas de soucis.

--
François L

Avatar
Francois
Bonjour,

Suite aux posts de michdenis et JB, je reprend le problème qui porte en
fait sur la fonction CDbl et n'est pas sans rapport avec la question en
cours sur CDate.

J'ai fait mes tests sur XL2000.

En fait le fonctionnement de CDbl est assez surprenant :

Si je met le . (point) comme séparateur décimal dans les paramètres
régionaux,
Sub test()
tempa = "0.01"
tempb = "0,01"
resa = CDbl(tempa)
resb = CDbl(tempb)
MsgBox resa & Chr(160) & resb
End Sub
fonctionne sans problème, CDbl a accepté le point comme la virgule dans
la chaîne de caractères.

En revanche, si je met la , (virgule) comme séparateur décimal,
La sub test plantera sur la ligne resa et fonctionnera sur resb = !

--
François L
1 2