una resultado redondear quitar numeros miles mas funcion enteros entero decimales condicion con como cercano vba rounding

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.