vba - resultado - redondear en excel a miles
Redondeando un número al 5 o 10 más cercano o X (12)
¿algo como eso?
''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
Dados los números 499, 73433, 2348 ¿qué VBA puedo usar para redondear al 5 o 10 más cercano? o un número arbitrario?
Por 5:
499 -> 500
2348 -> 2350
7343 -> 7345
Por 10:
499 -> 500
2348 -> 2350
7343 -> 7340
etc.
''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)
Aquí está 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)
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 desde cero para dar "10.67". sin argumentos adicionales math.round devuelve 10.66, lo que podría generar discrepancias no deseadas.
Es simple matemática. Dado un número X y un factor de redondeo N, la fórmula sería:
redondo (X / N) * N
No puedo agregar un comentario así que usaré esto
en un vbs ejecutar eso y divertirse averiguar por qué los 2 dan un resultado de 2
no puedes confiar en redondo
msgbox round(1.5) ''result to 2
msgbox round(2.5) ''yes, result to 2 too
Para imitar en Visual Basic la forma en que funciona la función redonda en Excel, solo tiene que usar: WorksheetFunction.Round (number, decimales)
De esta forma, el redondeo bancario o contable no redondea.
Para redondear a la X más cercana (sin ser específica de VBA)
N = X * int (N / X + 0.5)
Donde int (...) devuelve el siguiente número entero más bajo.
Si su función de redondeo disponible ya redondea al número entero más cercano, entonces omita la suma de 0.5
Para un enfoque estricto de Visual Basic, puede convertir el valor de coma 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 quiere redondear y mantener decimales, Math.round (n, d) funcionaría.
Prueba esta función
--------------comienzo----------------
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 ------------
Simplemente REDONDEADO (x / 5) * 5 debería hacer el trabajo.
Respuesta integrada
X = 1234 ''number to round
N = 5 ''rounding factor
round(X/N)*N ''result is 1235
Para coma flotante a entero, 1234.564 a 1235 (esto es VB específico, la mayoría de los otros idiomas simplemente truncan) do:
int(1234.564) ''result is 1235
Cuidado: VB usa el redondeo de bancos , al número par más cercano, lo que puede sorprender si no está enterado:
msgbox round(1.5) ''result to 2
msgbox round(2.5) ''yes, result to 2 too
Gracias a todos.