2008-11-28 9 views
54

Étant donné des nombres comme 499, 73433, 2348, que VBA puis-je utiliser pour arrondir au 5 ou 10 le plus proche? ou un nombre abitrary?Comment arrondir un nombre dans VBA au 5 le plus proche? (ou 10 ou X)

Par 5:

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

Par 10:

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

etc.

+0

Merci à tous pour toutes vos réponses. Je suis le plus intelligent pour ça. Désolé, je ne peux marquer qu'une seule réponse comme correcte, car la vraie "réponse" a été dispersée dans plusieurs messages. –

+0

Cela fonctionne pour moi http://www.tek-tips.com/faqs.cfm?fid=5031 – Ferroao

Répondre

29

intégré Réponse

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

Pour virgule flottante en entier, 1234.564-1235, (ce qui est VB spécifique, la plupart des autres langues tronquer simplement) font:

int(1234.564) 'result is 1235 

Attention: VB utilise Bankers Rounding, au plus proche nombre pair, ce qui peut surprendre si vous n'êtes pas au courant il:

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

Merci à tous.

83

Il est simple de math. Étant donné un nombre X et un facteur d'arrondi N, la formule serait la suivante:

ronde (X/N) * N

10

Pour arrondir au plus proche X (sans VBA spécifique)

N = X * int (N/X + 0.5)

Où int (...) renvoie le nombre entier inférieur le plus proche.

Si votre fonction d'arrondi disponible arrondit déjà au nombre entierle plus proche, puis omettre l'ajout de 0,5

+0

Juste pour clarifier: 'int (N + 0.5)' est le même que 'round (N)' –

+0

oui - J'ajoutais cela en même temps que vous avez commenté :) – Alnitak

+0

+1: Merci pour cela. –

0

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 
0

Simplement ROUND (x/5) * 5 devrait faire le travail.

0

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

dans un vbs courir ça et amusez-vous à comprendre pourquoi 2 donnent un résultat de 2

vous ne pouvez pas faire confiance à tour

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

Je dirais que cela a quelque chose à voir avec la façon dont les nombres à virgule flottante sont stockés, ou une implémentation correcte de l'algorithme d'arrondi internationalement standartized. Je ne sais pas quel est son nom, mais c'était pour que tous les autres .5 soient arrondis, et le reste vers le haut. –

+0

Arrondir arrondit [sic] au nombre pair le plus proche. Il y a même une explication ici dans SO. –

+0

Vilx, votre suggestion est bonne, mais pas pour VBA tour (465/10) * 10 reviendra 460 – Fredou

1

Pour une approche Visual Basic stricte, vous pouvez convertir la valeur à virgule flottante en nombre entier pour arrondir à cet entier. VB est l'un des rares langages qui arrondit sur la conversion de type (la plupart des autres sont simplement tronqués.)

Les multiples de 5 ou x peuvent être simplement divisés avant et après le cycle.

Si vous voulez arrondir et conserver des décimales, Math.round (n, d) fonctionnera.

9

En VB, math.round possède 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 le type de données double. Cela pourrait être important si l'option strict est activée.

Le résultat de (10.665) .ToString ("n2") s'éloigne de zéro pour donner "10.67". sans arguments supplémentaires math.round renvoie 10.66, ce qui pourrait conduire à des divergences non désirées.

0

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

2

'Exemple: Round 499 à 5. Vous utiliserez 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) 
-1

Pour imiter dans Visual Basic la façon dont la fonction tour fonctionne dans Excel, il vous suffit d'utiliser: WorksheetFunction.Round (nombre, décimales)

De cette façon, l'arrondissement bancaires ou comptables ne le font pas fais l'arrondi.

+0

Ceci ne sera pas arrondi de 2348 à 2350 comme demandé dans la question (deuxième exemple). – mins

1

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) 
+0

Je pense que c'est VB.NET pas VBA? La logique est utile cependant! – tomRedox

Questions connexes