OVH Cloud OVH Cloud

(VBA Rappel) fonction round

5 réponses
Avatar
Greffier
Bonjour,

J'ai été surpris par la function round en VBA Excel 97 :
1 - à chaque exécution, elle est définie comme une fonction n'existant pas.
2 - j'ai donc recherché dans les faq dans les moteurs, l'explication.
Plusieurs intervenants ont proposé la fonction round suivante :

Public Function Round(chiffre As Double, décimal As Integer) As Double
chiffre = chiffre * (10 ^ décimal)
If Int(chiffre) <> chiffre Then
Round = Int(IIf(Int(Mid(chiffre, InStr(1, Str(chiffre), "."), 1)) >=
5, chiffre + 1, chiffre))
Else
Round = chiffre
End If
Round = Round / (10 ^ décimal)
End Function

cette fonction marche bien dans quelques cas comme celui-ci (calcul de
l'indicateur de masse corporelle), qui édite correctement la valeur dans le
formulaire de calcul :

Private Sub CmdCalcul_Click()
Dim vIMC

vIMC = Round((Val(TxtPoids) / Val(TxtTaille) ^ 2 * 10000), 1)
LblIMC.Caption = "IMC = " & vIMC
FrmIMC.Width = 250


Public Function Round(chiffre As Double, décimal As Integer) As Double
chiffre = chiffre * (10 ^ décimal)
If Int(chiffre) <> chiffre Then
Round = Int(IIf(Int(Mid(chiffre, InStr(1, Str(chiffre), "."), 1)) >=
5, chiffre + 1, chiffre))
Else
Round = chiffre
End If
Round = Round / (10 ^ décimal)
End Function

dans un autre formulaire, de calcul cette valeur est nulle :

Private Sub CmdOK_Click()
Dim vMessage, vErreur, vIMC, vPoidsMin, vPoidsMax
Dim vPrénom, vSexe, vTaille, vPoids, vPerdre
Dim vValMin, vValMax
vPrénom = TxtPrénom
vSexe = CmbSexe
vPoids = TxtPoids
vTaille = TxtTaille


vIMC = Round((Val(TxtPoids) / Val(TxtTaille) ^ 2 * 10000), 1)
vPoidsMin = Round((18.5 * Val(vTaille) ^ 2 / 10000), 1)
vPoidsMax = Round((24.9 * Val(vTaille) ^ 2 / 10000), 1)
vPerdre = Round((vPoids - vPoidsMax), 1)
MsgBox vIMC, vbOKOnly, "IMC"
MsgBox vPoidsMin, vbOKOnly, "Poids min"
MsgBox vPoidsMax, vbOKOnly, "Poids max"
MsgBox vPerdre, vbOKOnly, "Perdre"
vIMC = ((Val(vPoids) / Val(vTaille) ^ 2 * 10000))
vPoidsMin = ((18.5 * vTaille ^ 2 / 10000))
vPoidsMax = ((24.9 * vTaille ^ 2 / 10000))

If Val(vPoids) > vPoidsMax Then
vMessage = vPrénom & "," & vbCr & _
"ton indice de masse corporelle est de " & vIMC & vbCr & _
"tu dois perdre " & Round((vPoids - vPoidsMax), 1) & _
" kilo" & IIf(Round((vPoids - vPoidsMax), 1) >= 2, "s " & vbCr &
"Courage !", "")
End If

MsgBox vMessage, vbOKOnly, "Premier bilan"
End Sub

Public Function Round(chiffre As Double, décimal As Integer) As Double
chiffre = chiffre * (10 ^ décimal)
If Int(chiffre) <> chiffre Then
Round = Int(IIf(Int(Mid(chiffre, InStr(1, Str(chiffre), "."), 1)) >=
5, chiffre + 1, chiffre))
Else
Round = chiffre
End If
Round = Round / (10 ^ décimal)
End Function

3 - enfin, si j'élimine la fonction round, j'obtiens un résultat avec au 8
chiffres, pourquoi.

If Val(vPoids) > vPoidsMax Then
vMessage = vPrénom & "," & vbCr & _
"ton indice de masse corporelle est de " & vIMC & vbCr & _
"tu dois perdre " & (vPoids - vPoidsMax) & _
" kilo" & IIf((vPoids - vPoidsMax) >= 2, "s " & vbCr & "Courage !", "")
End If

Vous l'avez compris je ne suis pas spécialement un programmeur, mais
j'aimerais comprendre si j'ai oublié un élément quelconque ou si la fonction
est mal située ou s'il faut un calcul intermédiaire....



Je suis prêt à expédier à quiconque le source de ce programme qui a été
lui-même récupéré sur une faq de santé, ou entrer en contact.

Merci de toutes vos suggestions.


Greffier

5 réponses

Avatar
AV
J'ai été surpris par la function round en VBA Excel 97 :


Utilise la fonction de feuille de calcul (avec la méthode Evaluate) plutôt que
la fonction vba

exemples :
MsgBox [round(15.2589,2)]

Avec des variables :
y = 15.2589: z = 2
MsgBox Evaluate("round(" & y & "," & z & ")")

AV

Avatar
Greffier
Bonjour av,

Je veux bien utiliser la méthode évaluate, mais comment connaître déjà le
résultat . Et puis la fonction évaluate, je ne sais pas où la trouver.

greffier.





"AV" a écrit dans le message de
news:
J'ai été surpris par la function round en VBA Excel 97 :


Utilise la fonction de feuille de calcul (avec la méthode Evaluate) plutôt
que

la fonction vba

exemples :
MsgBox [round(15.2589,2)]

Avec des variables :
y = 15.2589: z = 2
MsgBox Evaluate("round(" & y & "," & z & ")")

AV






Avatar
ClémentMarcotte
Bonjour,

Il n'y a pas de fonction native Round() en VBA Office 97, et de toutes
façons celle de VBA pour Office 2000 et + ne vaut qu'un demi-clou rouillé
cassé.

Val ne vaut rien quand le séparateur décimal est la virgule. Utiliser Csng()
ou CDbl() à la place.

Tes Instr() cherchent le point comme séparateur décimal.


"Greffier" a écrit dans le message de
news:e$
Bonjour,

J'ai été surpris par la function round en VBA Excel 97 :
1 - à chaque exécution, elle est définie comme une fonction n'existant
pas.

2 - j'ai donc recherché dans les faq dans les moteurs, l'explication.
Plusieurs intervenants ont proposé la fonction round suivante :

Public Function Round(chiffre As Double, décimal As Integer) As Double
chiffre = chiffre * (10 ^ décimal)
If Int(chiffre) <> chiffre Then
Round = Int(IIf(Int(Mid(chiffre, InStr(1, Str(chiffre), "."), 1))
5, chiffre + 1, chiffre))
Else

Round = chiffre
End If
Round = Round / (10 ^ décimal)
End Function

cette fonction marche bien dans quelques cas comme celui-ci (calcul de
l'indicateur de masse corporelle), qui édite correctement la valeur dans
le

formulaire de calcul :

Private Sub CmdCalcul_Click()
Dim vIMC

vIMC = Round((Val(TxtPoids) / Val(TxtTaille) ^ 2 * 10000), 1)
LblIMC.Caption = "IMC = " & vIMC
FrmIMC.Width = 250


Public Function Round(chiffre As Double, décimal As Integer) As Double
chiffre = chiffre * (10 ^ décimal)
If Int(chiffre) <> chiffre Then
Round = Int(IIf(Int(Mid(chiffre, InStr(1, Str(chiffre), "."), 1))
5, chiffre + 1, chiffre))
Else

Round = chiffre
End If
Round = Round / (10 ^ décimal)
End Function

dans un autre formulaire, de calcul cette valeur est nulle :

Private Sub CmdOK_Click()
Dim vMessage, vErreur, vIMC, vPoidsMin, vPoidsMax
Dim vPrénom, vSexe, vTaille, vPoids, vPerdre
Dim vValMin, vValMax
vPrénom = TxtPrénom
vSexe = CmbSexe
vPoids = TxtPoids
vTaille = TxtTaille


vIMC = Round((Val(TxtPoids) / Val(TxtTaille) ^ 2 * 10000), 1)
vPoidsMin = Round((18.5 * Val(vTaille) ^ 2 / 10000), 1)
vPoidsMax = Round((24.9 * Val(vTaille) ^ 2 / 10000), 1)
vPerdre = Round((vPoids - vPoidsMax), 1)
MsgBox vIMC, vbOKOnly, "IMC"
MsgBox vPoidsMin, vbOKOnly, "Poids min"
MsgBox vPoidsMax, vbOKOnly, "Poids max"
MsgBox vPerdre, vbOKOnly, "Perdre"
vIMC = ((Val(vPoids) / Val(vTaille) ^ 2 * 10000))
vPoidsMin = ((18.5 * vTaille ^ 2 / 10000))
vPoidsMax = ((24.9 * vTaille ^ 2 / 10000))

If Val(vPoids) > vPoidsMax Then
vMessage = vPrénom & "," & vbCr & _
"ton indice de masse corporelle est de " & vIMC & vbCr & _
"tu dois perdre " & Round((vPoids - vPoidsMax), 1) & _
" kilo" & IIf(Round((vPoids - vPoidsMax), 1) >= 2, "s " & vbCr &
"Courage !", "")
End If

MsgBox vMessage, vbOKOnly, "Premier bilan"
End Sub

Public Function Round(chiffre As Double, décimal As Integer) As Double
chiffre = chiffre * (10 ^ décimal)
If Int(chiffre) <> chiffre Then
Round = Int(IIf(Int(Mid(chiffre, InStr(1, Str(chiffre), "."), 1))
5, chiffre + 1, chiffre))
Else

Round = chiffre
End If
Round = Round / (10 ^ décimal)
End Function

3 - enfin, si j'élimine la fonction round, j'obtiens un résultat avec au 8
chiffres, pourquoi.

If Val(vPoids) > vPoidsMax Then
vMessage = vPrénom & "," & vbCr & _
"ton indice de masse corporelle est de " & vIMC & vbCr & _
"tu dois perdre " & (vPoids - vPoidsMax) & _
" kilo" & IIf((vPoids - vPoidsMax) >= 2, "s " & vbCr & "Courage !", "")
End If

Vous l'avez compris je ne suis pas spécialement un programmeur,
mais

j'aimerais comprendre si j'ai oublié un élément quelconque ou si la
fonction

est mal située ou s'il faut un calcul intermédiaire....



Je suis prêt à expédier à quiconque le source de ce programme qui a été
lui-même récupéré sur une faq de santé, ou entrer en contact.

Merci de toutes vos suggestions.


Greffier





Avatar
Greffier
Bonjour Marcotte,

Alors, que faudrait-il faire ou changer dans les calculs.
merci, quand même pour vos remarques que j'ignorai totalement.

greffier.



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

Il n'y a pas de fonction native Round() en VBA Office 97, et de toutes
façons celle de VBA pour Office 2000 et + ne vaut qu'un demi-clou rouillé
cassé.

Val ne vaut rien quand le séparateur décimal est la virgule. Utiliser
Csng()

ou CDbl() à la place.

Tes Instr() cherchent le point comme séparateur décimal.


"Greffier" a écrit dans le message de
news:e$
Bonjour,

J'ai été surpris par la function round en VBA Excel 97 :
1 - à chaque exécution, elle est définie comme une fonction n'existant
pas.

2 - j'ai donc recherché dans les faq dans les moteurs, l'explication.
Plusieurs intervenants ont proposé la fonction round suivante :

Public Function Round(chiffre As Double, décimal As Integer) As Double
chiffre = chiffre * (10 ^ décimal)
If Int(chiffre) <> chiffre Then
Round = Int(IIf(Int(Mid(chiffre, InStr(1, Str(chiffre), "."),
1))


5, chiffre + 1, chiffre))
Else


Round = chiffre
End If
Round = Round / (10 ^ décimal)
End Function

cette fonction marche bien dans quelques cas comme celui-ci (calcul de
l'indicateur de masse corporelle), qui édite correctement la valeur dans
le

formulaire de calcul :

Private Sub CmdCalcul_Click()
Dim vIMC

vIMC = Round((Val(TxtPoids) / Val(TxtTaille) ^ 2 * 10000), 1)
LblIMC.Caption = "IMC = " & vIMC
FrmIMC.Width = 250


Public Function Round(chiffre As Double, décimal As Integer) As Double
chiffre = chiffre * (10 ^ décimal)
If Int(chiffre) <> chiffre Then
Round = Int(IIf(Int(Mid(chiffre, InStr(1, Str(chiffre), "."),
1))


5, chiffre + 1, chiffre))
Else


Round = chiffre
End If
Round = Round / (10 ^ décimal)
End Function

dans un autre formulaire, de calcul cette valeur est nulle :

Private Sub CmdOK_Click()
Dim vMessage, vErreur, vIMC, vPoidsMin, vPoidsMax
Dim vPrénom, vSexe, vTaille, vPoids, vPerdre
Dim vValMin, vValMax
vPrénom = TxtPrénom
vSexe = CmbSexe
vPoids = TxtPoids
vTaille = TxtTaille


vIMC = Round((Val(TxtPoids) / Val(TxtTaille) ^ 2 * 10000), 1)
vPoidsMin = Round((18.5 * Val(vTaille) ^ 2 / 10000), 1)
vPoidsMax = Round((24.9 * Val(vTaille) ^ 2 / 10000), 1)
vPerdre = Round((vPoids - vPoidsMax), 1)
MsgBox vIMC, vbOKOnly, "IMC"
MsgBox vPoidsMin, vbOKOnly, "Poids min"
MsgBox vPoidsMax, vbOKOnly, "Poids max"
MsgBox vPerdre, vbOKOnly, "Perdre"
vIMC = ((Val(vPoids) / Val(vTaille) ^ 2 * 10000))
vPoidsMin = ((18.5 * vTaille ^ 2 / 10000))
vPoidsMax = ((24.9 * vTaille ^ 2 / 10000))

If Val(vPoids) > vPoidsMax Then
vMessage = vPrénom & "," & vbCr & _
"ton indice de masse corporelle est de " & vIMC & vbCr & _
"tu dois perdre " & Round((vPoids - vPoidsMax), 1) & _
" kilo" & IIf(Round((vPoids - vPoidsMax), 1) >= 2, "s " & vbCr &
"Courage !", "")
End If

MsgBox vMessage, vbOKOnly, "Premier bilan"
End Sub

Public Function Round(chiffre As Double, décimal As Integer) As Double
chiffre = chiffre * (10 ^ décimal)
If Int(chiffre) <> chiffre Then
Round = Int(IIf(Int(Mid(chiffre, InStr(1, Str(chiffre), "."),
1))


5, chiffre + 1, chiffre))
Else


Round = chiffre
End If
Round = Round / (10 ^ décimal)
End Function

3 - enfin, si j'élimine la fonction round, j'obtiens un résultat avec au
8


chiffres, pourquoi.

If Val(vPoids) > vPoidsMax Then
vMessage = vPrénom & "," & vbCr & _
"ton indice de masse corporelle est de " & vIMC & vbCr & _
"tu dois perdre " & (vPoids - vPoidsMax) & _
" kilo" & IIf((vPoids - vPoidsMax) >= 2, "s " & vbCr & "Courage !",
"")


End If

Vous l'avez compris je ne suis pas spécialement un programmeur,
mais

j'aimerais comprendre si j'ai oublié un élément quelconque ou si la
fonction

est mal située ou s'il faut un calcul intermédiaire....



Je suis prêt à expédier à quiconque le source de ce programme qui a été
lui-même récupéré sur une faq de santé, ou entrer en contact.

Merci de toutes vos suggestions.


Greffier










Avatar
ClémentMarcotte
Je n'ai pas envie de refaire tes classeurs pour tester.

Commence par ré-essayer avec:

1) Le point comme séparateur décimal dans tes paramètres régionaux

ou

2) remplacer les val par cdbl

(Si ce qui marchait devient ce qui ne marche pas et l'inverse, va falloir
que tu te choisisses un séparateur décimal unique et que tu ajustes tes
programmes en conséquence.)



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

Alors, que faudrait-il faire ou changer dans les calculs.
merci, quand même pour vos remarques que j'ignorai totalement.

greffier.



"ClémentMarcotte" a écrit dans le message
de

news:
Bonjour,

Il n'y a pas de fonction native Round() en VBA Office 97, et de toutes
façons celle de VBA pour Office 2000 et + ne vaut qu'un demi-clou
rouillé


cassé.

Val ne vaut rien quand le séparateur décimal est la virgule. Utiliser
Csng()

ou CDbl() à la place.

Tes Instr() cherchent le point comme séparateur décimal.


"Greffier" a écrit dans le message de
news:e$
Bonjour,

J'ai été surpris par la function round en VBA Excel 97 :
1 - à chaque exécution, elle est définie comme une fonction n'existant
pas.

2 - j'ai donc recherché dans les faq dans les moteurs, l'explication.
Plusieurs intervenants ont proposé la fonction round suivante :

Public Function Round(chiffre As Double, décimal As Integer) As Double
chiffre = chiffre * (10 ^ décimal)
If Int(chiffre) <> chiffre Then
Round = Int(IIf(Int(Mid(chiffre, InStr(1, Str(chiffre), "."),
1))


5, chiffre + 1, chiffre))
Else



Round = chiffre
End If
Round = Round / (10 ^ décimal)
End Function

cette fonction marche bien dans quelques cas comme celui-ci (calcul de
l'indicateur de masse corporelle), qui édite correctement la valeur
dans



le
formulaire de calcul :

Private Sub CmdCalcul_Click()
Dim vIMC

vIMC = Round((Val(TxtPoids) / Val(TxtTaille) ^ 2 * 10000), 1)
LblIMC.Caption = "IMC = " & vIMC
FrmIMC.Width = 250


Public Function Round(chiffre As Double, décimal As Integer) As Double
chiffre = chiffre * (10 ^ décimal)
If Int(chiffre) <> chiffre Then
Round = Int(IIf(Int(Mid(chiffre, InStr(1, Str(chiffre), "."),
1))


5, chiffre + 1, chiffre))
Else



Round = chiffre
End If
Round = Round / (10 ^ décimal)
End Function

dans un autre formulaire, de calcul cette valeur est nulle :

Private Sub CmdOK_Click()
Dim vMessage, vErreur, vIMC, vPoidsMin, vPoidsMax
Dim vPrénom, vSexe, vTaille, vPoids, vPerdre
Dim vValMin, vValMax
vPrénom = TxtPrénom
vSexe = CmbSexe
vPoids = TxtPoids
vTaille = TxtTaille


vIMC = Round((Val(TxtPoids) / Val(TxtTaille) ^ 2 * 10000), 1)
vPoidsMin = Round((18.5 * Val(vTaille) ^ 2 / 10000), 1)
vPoidsMax = Round((24.9 * Val(vTaille) ^ 2 / 10000), 1)
vPerdre = Round((vPoids - vPoidsMax), 1)
MsgBox vIMC, vbOKOnly, "IMC"
MsgBox vPoidsMin, vbOKOnly, "Poids min"
MsgBox vPoidsMax, vbOKOnly, "Poids max"
MsgBox vPerdre, vbOKOnly, "Perdre"
vIMC = ((Val(vPoids) / Val(vTaille) ^ 2 * 10000))
vPoidsMin = ((18.5 * vTaille ^ 2 / 10000))
vPoidsMax = ((24.9 * vTaille ^ 2 / 10000))

If Val(vPoids) > vPoidsMax Then
vMessage = vPrénom & "," & vbCr & _
"ton indice de masse corporelle est de " & vIMC & vbCr & _
"tu dois perdre " & Round((vPoids - vPoidsMax), 1) & _
" kilo" & IIf(Round((vPoids - vPoidsMax), 1) >= 2, "s " & vbCr &
"Courage !", "")
End If

MsgBox vMessage, vbOKOnly, "Premier bilan"
End Sub

Public Function Round(chiffre As Double, décimal As Integer) As Double
chiffre = chiffre * (10 ^ décimal)
If Int(chiffre) <> chiffre Then
Round = Int(IIf(Int(Mid(chiffre, InStr(1, Str(chiffre), "."),
1))


5, chiffre + 1, chiffre))
Else



Round = chiffre
End If
Round = Round / (10 ^ décimal)
End Function

3 - enfin, si j'élimine la fonction round, j'obtiens un résultat avec
au



8
chiffres, pourquoi.

If Val(vPoids) > vPoidsMax Then
vMessage = vPrénom & "," & vbCr & _
"ton indice de masse corporelle est de " & vIMC & vbCr & _
"tu dois perdre " & (vPoids - vPoidsMax) & _
" kilo" & IIf((vPoids - vPoidsMax) >= 2, "s " & vbCr & "Courage !",
"")


End If

Vous l'avez compris je ne suis pas spécialement un
programmeur,



mais
j'aimerais comprendre si j'ai oublié un élément quelconque ou si la
fonction

est mal située ou s'il faut un calcul intermédiaire....



Je suis prêt à expédier à quiconque le source de ce programme qui a
été



lui-même récupéré sur une faq de santé, ou entrer en contact.

Merci de toutes vos suggestions.


Greffier