Pregunta

Dados números como 499, 73433, 2348, ¿qué VBA puedo usar para redondear a los 5 o 10 más cercanos? o un número arbitrario?

Por 5:

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

A las 10:

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

etc.

¿Fue útil?

Solución 2

Respuesta integrada

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

Para punto flotante a entero, 1234.564 a 1235, (esto es específico de VB, la mayoría de los otros lenguajes simplemente se truncan):

int(1234.564)   'result is 1235

Cuidado: VB utiliza Redondeo de banqueros , al número par más cercano , lo que puede ser sorprendente si no lo sabes:

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

Gracias a todos.

Otros consejos

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

redondo (X / N) * N

Para redondear a la X más cercana (sin ser específico 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 se redondea al número entero más cercano , omita la adición de 0.5

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 estricta está activada.

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

'Ejemplo: Redondea 499 a la más cercana 5. Usarías 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)

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 se redondea en la conversión de tipos (la mayoría de los demás simplemente se truncan).

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

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

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)

Simplemente REDONDO (x / 5) * 5 debería hacer el trabajo.

No puedo agregar comentarios, así que usaré esto

en un vbs ejecuta eso y diviértete descubriendo por qué los 2 dan un resultado de 2

no puedes confiar en todo

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

algo así?

'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

Pruebe esta función

-------------- inicio ----------------

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

Actualicé un poco la función proporcionada por la wiki comunitaria " (la mejor respuesta), solo para redondear a los 5 más cercanos (o cualquier cosa que desee), con esta excepción: el número redondeado NUNCA será superior al número original .

Esto es útil en los casos en que es necesario decir que " una empresa está viva durante 47 años " : Quiero que la página web muestre " está viva durante más de 45 años " , evitando mentir diciendo que " está vivo por más de 50 años " .

Entonces, cuando alimentas esta función con 47, no devolverá 50, sino que devolverá 45 en su lugar.

'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

Para imitar en Visual Basic la forma en que funciona la función redonda en Excel, solo tiene que usar: WorksheetFunction.Round (número, decimales)

De esta forma, el redondeo bancario o contable no hace el redondeo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top