2008-11-28 62 views
54

Dados los números como 499, 73433, 2348 ¿qué VBA puedo usar para redondear al 5 o 10 más cercano? o un número abitrario?¿Cómo redondear un número en VBA al 5 más cercano? (o 10 o X)

Por 5:

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

Por 10:

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

etc.

+0

Gracias a todos por todas sus respuestas. Soy el más listo para eso. Lo siento, solo puedo marcar una sola respuesta como correcta, ya que la verdadera "respuesta" estaba dispersa en varios mensajes. –

+0

Esto funciona para mí http://www.tek-tips.com/faqs.cfm?fid=5031 – Ferroao

Respuesta

29

Integrado respuesta

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

Para coma flotante a un entero, 1234.564 a 1235, (esto es VB específicos, la mayoría de los otros idiomas, simplemente truncar) hacen:

int(1234.564) 'result is 1235 

cuidado: VB utiliza Bankers Rounding, al número par más cercano, que puede ser sorprendente si usted no es consciente de es:

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

Gracias a todos.

83

Es pura matemática. Dado un número X y un factor de redondeo N, la fórmula sería:

ronda (X/N) * N

10

Para redondear a la X más cercana (sin ser VBA específico)

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

Donde int (...) devuelve el siguiente número entero más bajo.

Si su función de redondeo ya disponibles redondea al número entero másmás cercana a continuación, omitir la adición de 0,5

+0

Solo para aclarar: 'int (N + 0.5)' es lo mismo que 'round (N)' –

+0

yes - Estaba agregando eso al mismo tiempo que ha comentado :) – Alnitak

+0

+1: Gracias por esto. –

0

algo por el estilo?

'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

Simplemente round (x/5) * 5 debe hacer el trabajo.

0

No puedo añadir comentario así que voy a utilizar este

en un VBS funcionar eso y divertirse averiguar por qué el 2 hacerle un resultado de 2

no se puede confiar ronda

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

Diría que tiene algo que ver con la forma en que se almacenan los números flotantes o la implementación correcta del algoritmo de redondeo normalizado internacionalmente. No sé su nombre, pero fue para que todos los demás .5 se redondearan, y el resto para arriba. –

+0

Redondeando rondas [sic] al número par más cercano. Incluso hay una explicación aquí en SO. –

+0

Vilx, su sugerencia es buena, pero no para VBA round (465/10) * 10 devolverá 460 – Fredou

1

Para un enfoque estricto de Visual Basic, puede convertir el valor de punto flotante en un entero para redondear a dicho entero. VB es uno de los idiomas raros que redondea la conversión de tipo (la mayoría de los otros simplemente truncan).

Los múltiplos de 5 o x se pueden hacer simplemente dividiendo antes y multiplicando después de la ronda.

Si desea redondear y mantener decimales, Math.round (n, d) funcionaría.

9

En VB, math.round tiene argumentos adicionales para especificar el número de lugares decimales y el método de redondeo. Math.Round (10.665, 2, MidpointRounding.AwayFromZero) devolverá 10.67. Si el número es un tipo de datos decimal o único, math.round devuelve un tipo de datos decimal. Si es doble, devuelve el tipo de datos doble. Eso podría ser importante si la opción strict está activada.

El resultado de (10.665) .ToString ("n2") redondea la distancia desde cero para dar "10.67". sin argumentos adicionales math.round devuelve 10.66, lo que podría generar discrepancias no deseadas.

0

Pruebe esta función

-------------- ---------------- comenzar

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

'Ejemplo: redondee 499 a 5 más cercano. Utilizaría la FUNCIÓN 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

Para imitar en Visual Basic la forma en que la función de ronda trabaja en Excel, sólo hay que utilizar: WorksheetFunction.Round (número, decimales)

De esta manera los bancarios o contables redondeo no lo hacen hacer el redondeo.

+0

Esto no será alrededor de 2348 a 2350 como se solicita en la pregunta (segundo ejemplo). – mins

1

Aquí es nuestra solución:

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 

Uso:

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

Creo que esto es VB.NET no VBA? ¡La lógica es útil sin embargo! – tomRedox

Cuestiones relacionadas