Question

Étant donné les nombres comme 499, 73433, 2348, quel VBA puis-je utiliser pour arrondir au 5 ou au 10 le plus proche? ou un nombre arbitraire?

Par 5:

 499 ->  500
2348 -> 2350
7343 -> 7345

Par 10:

 499 ->  500
2348 -> 2350
7343 -> 7340

etc.

Était-ce utile?

La solution 2

Réponse intégrée

X = 1234 'number to round
N = 5    'rounding factor
round(X/N)*N   'result is 1235

Pour les nombres à virgule flottante allant de 1234.564 à 1235 (ceci est spécifique à VB, la plupart des autres langues sont simplement tronquées), faites:

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 savez pas:

msgbox round(1.5) 'result to 2
msgbox round(2.5) 'yes, result to 2 too

Merci à tous.

Autres conseils

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") arrondit à 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 rang. Vous utiliseriez 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)

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 ne font que tronquer.)

Des multiples de 5 ou x peuvent être obtenus simplement en les divisant avant et en les multipliant après le tour.

Si vous souhaitez arrondir et conserver les décimales, Math.round (n, d) fonctionnerait.

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

Utilisation:

dim decTotal as Decimal = GetRoundedNumber(CDec(499), CDec(0.05), RoundingDirection.Up)

Simply ROUND (x / 5) * 5 devrait suffire.

Je ne peux pas ajouter de commentaire, je vais donc utiliser ce

dans un vbs exécuter cela et amusez-vous à comprendre pourquoi les 2 donnent un résultat de 2

vous ne pouvez pas faire confiance autour de

 msgbox round(1.5) 'result to 2
 msgbox round(2.5) 'yes, result to 2 too

quelque chose comme ça?

'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

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 ------------

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 initial .

C’est utile dans les cas où il est nécessaire de dire "une entreprise est en vie depuis 47 ans" : je souhaite que la page Web affiche "en vie pendant plus de 45 ans ", tout en évitant de mentir en affirmant que " est en vie depuis plus de 50 ans ".

Ainsi, lorsque vous alimentez cette fonction avec 47, elle n'en retournera pas 50, mais plutôt 45.

'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

Pour imiter dans Visual Basic le fonctionnement de la fonction round dans Excel, il vous suffit d'utiliser: WorksheetFunction.Round (nombre, décimales)

De cette manière, l'arrondissement bancaire ou comptable ne l'arrondit pas.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top