Avec des nombres comme 499, 73433, 2348, quelle VBA puis-je utiliser pour arrondir à 5 ou 10 près? ou un nombre arbitraire?
Par 5:
499 -> 500
2348 -> 2350
7343 -> 7345
Par 10:
499 -> 500
2348 -> 2350
7343 -> 7340
etc.
Réponse intégrée
X = 1234 'number to round
N = 5 'rounding factor
round(X/N)*N 'result is 1235
Pour un nombre à virgule flottante compris entre 1234.564 et 1235 (ceci est spécifique à VB, la plupart des autres langues sont simplement tronquées), procédez comme suit:
int(1234.564) 'result is 1235
Attention: VB utilise Arrondi de banquiers , au nombre pair le plus proche, ce qui peut surprendre si vous ne le connaissez pas. :
msgbox round(1.5) 'result to 2
msgbox round(2.5) 'yes, result to 2 too
Merci à tous.
C'est des maths simples. Étant donné un nombre X et un facteur d'arrondissement N, la formule serait la suivante:
rond (X/N) * N
Arrondir au X le plus proche (sans être spécifique à VBA)
N = X * int (N/X + 0,5)
Où int (...) renvoie le prochain nombre entier le plus bas.
Si votre fonction d'arrondi disponible arrondit déjà au nombre entier le plus proche, omettez l'ajout de 0,5
En VB, math.round a des arguments supplémentaires pour spécifier le nombre de décimales et la méthode d'arrondi. Math.Round (10.665, 2, MidpointRounding.AwayFromZero) renverra 10,67. Si le nombre est un type de données décimal ou unique, math.round renvoie un type de données décimal. S'il est double, il renvoie un type de données double. Cela pourrait être important si l'option strict est activée.
Le résultat de (10.665) .ToString ("n2") est arrondi à zéro pour donner "10.67". sans arguments supplémentaires, math.round renvoie 10.66, ce qui peut entraîner des divergences non souhaitées.
'Exemple: Arrondissez 499 au 5ème le plus proche. Utilisez la fonction ROUND ().
a = inputbox("number to be rounded")
b = inputbox("Round to nearest _______ ")
strc = Round(A/B)
strd = strc*B
msgbox( a & ", Rounded to the nearest " & b & ", is" & vbnewline & strd)
Voici notre solution:
Public Enum RoundingDirection
Nearest
Up
Down
End Enum
Public Shared Function GetRoundedNumber(ByVal number As Decimal, ByVal multiplier As Decimal, ByVal direction As RoundingDirection) As Decimal
Dim nearestValue As Decimal = (CInt(number / multiplier) * multiplier)
Select Case direction
Case RoundingDirection.Nearest
Return nearestValue
Case RoundingDirection.Up
If nearestValue >= number Then
Return nearestValue
Else
Return nearestValue + multiplier
End If
Case RoundingDirection.Down
If nearestValue <= number Then
Return nearestValue
Else
Return nearestValue - multiplier
End If
End Select
End Function
Usage:
dim decTotal as Decimal = GetRoundedNumber(CDec(499), CDec(0.05), RoundingDirection.Up)
Pour une approche Visual Basic stricte, vous pouvez convertir la valeur à virgule flottante en entier pour arrondir cet entier. VB est l’une des rares langues qui arrondit la conversion de type (la plupart des autres sont simplement tronquées.)
Les multiples de 5 ou x peuvent être faits simplement en les divisant avant et en les multipliant après le tour.
Si vous voulez arrondir et conserver les décimales, Math.round (n, d) fonctionnerait.
J'ai légèrement mis à jour la fonction fournie par le "wiki de la communauté" (la meilleure réponse), juste pour arrondir au 5 le plus proche (ou tout ce que vous voulez), à cette exception près: le nombre arrondi ne sera jamais supérieur au nombre d'origine .
Ceci est utile dans les cas où il est nécessaire de dire que "une entreprise est en vie depuis 47 ans" : je souhaite que la page Web affiche "est en vie depuis plus de 45 ans" , tant que éviter de mentir en déclarant "est en vie depuis plus de 50 ans" .
Ainsi, lorsque vous alimentez cette fonction avec 47, elle ne retournera pas 50, mais retournera 45 à la place.
'Rounds a number to the nearest unit, never exceeding the actual value
function RoundToNearestOrBelow(num, r)
'@param num Long/Integer/Double The number to be rounded
'@param r Long The rounding value
'@return OUT Long The rounded value
'Example usage :
' Round 47 to the nearest 5 : it will return 45
' Response.Write RoundToNearestBelow(47, 5)
Dim OUT : OUT = num
Dim rounded : rounded = Round((((num)) / r), 0) * r
if (rounded =< num) then
OUT = rounded
else
OUT = rounded - r
end if
'Return
RoundToNearestOrBelow = OUT
end function 'RoundToNearestOrBelow
Essayez cette fonction
--------------début----------------
Function Round_Up(ByVal d As Double) As Integer
Dim result As Integer
result = Math.Round(d)
If result >= d Then
Round_Up = result
Else
Round_Up = result + 1
End If
End Function
-------------fin ------------
quelque chose comme ca?
'nearest
n = 5
'n = 10
'value
v = 496
'v = 499
'v = 2348
'v = 7343
'mod
m = (v \ n) * n
'diff between mod and the val
i = v-m
if i >= (n/2) then
msgbox m+n
else
msgbox m
end if
Simplement ROUND (x/5) * 5 devrait suffire.
Je ne peux pas ajouter de commentaire, je vais donc l'utiliser
dans un vbs courir cela et amusez-vous à comprendre pourquoi les 2 donnent un résultat de 2
vous ne pouvez pas faire confiance
msgbox round(1.5) 'result to 2
msgbox round(2.5) 'yes, result to 2 too