web-dev-qa-db-fra.com

Comment arrondir avec Excel VBA round ()?

J'ai les données suivantes:

cell(1,1) = 2878.75
cell(1,2) = $31.10
cell(2,1) = $89,529.13

Cependant, lorsque j'ai essayé d'utiliser round(cells(1,1).value*cells(1,2).value),2), le résultat ne correspond pas à cell(2,1). Je pensais que cela avait un rapport avec l'arrondi, mais je me demandais s'il était possible d'obtenir que round() agisse normalement. C'est-à-dire, pour value > 0.5, arrondissez. Et pour value < 0.5, arrondissez?

9
Ting Ping

La VBA utilise les banquiers arrondissant pour tenter de compenser le biais consistant à arrondir toujours à la hausse ou à la baisse sur 0,5; vous pouvez plutôt

WorksheetFunction.Round(cells(1,1).value * cells(1,2).value, 2)
14
Alex K.



Essayez cette fonction, vous pouvez arrondir un double

'---------------Start -------------
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
'-----------------End----------------
8
ana

Si vous voulez arrondir, utilisez le réglage moitié. Ajoutez 0,5 au nombre à arrondir et utilisez la fonction INT ().

réponse = INT (x + 0,5)

5
Steven Alpha

J'introduis deux fonctions de bibliothèque personnalisées à utiliser dans vba, qui serviront à arrondir la double valeur au lieu d'utiliser WorkSheetFunction.RoundDown et WorkSheetFunction.RoundUp.

Function RDown(Amount As Double, digits As Integer) As Double
    RDown = Int((Amount + (1 / (10 ^ (digits + 1)))) * (10 ^ digits)) / (10 ^ digits)
End Function

Function RUp(Amount As Double, digits As Integer) As Double
    RUp = RDown(Amount + (5 / (10 ^ (digits + 1))), digits)
End Function

Ainsi, la fonction Rdown (2878.75 * 31.1,2) renverra 899529.12 Et la fonction RUp (2878.75 * 31.1,2) renverra 899529.13 Alors que La fonction Rdown (2878.75 * 31.1, -3) renverra 89000 et la fonction RUp (2878.75 * 31.1, -3) retournera 90000

2
ShamBhagwat

J'ai eu un problème où je devais arrondir uniquement et où ces réponses ne fonctionnaient pas car je devais exécuter mon code et j'ai donc utilisé une méthode différente . à -5) Par conséquent, j'ai changé ma fonction en négative, j'ai appliqué la fonction INT, puis je l'ai rendue positive en la multipliant simplement par -1 avant et après

Count = -1 * (int(-1 * x))
1
Granticus

Essayez la fonction RoundUp:

Dim i As Double

i = Application.WorksheetFunction.RoundUp(Cells(1, 1).Value * Cells(1, 2).Value, 2)
1
sous2817

Ceci est un exemple j est la valeur que vous voulez arrondir. 

Dim i As Integer
Dim ii, j As Double

j = 27.11
i = (j) ' i is an integer and truncates the decimal

ii = (j) ' ii retains the decimal

If ii - i > 0 Then i = i + 1 

Si le reste est supérieur à 0, il l'arrondit, c'est simple. À 1,5, il arrondit automatiquement à 2, donc il sera inférieur à 0.

0
tango_golfaus

Math.Round utilise les arrondis de Bankers et arrondira au nombre pair le plus proche si le nombre à arrondir se situe exactement au centre.

Solution facile, utilisez Worksheetfunction.Round (). Cela va arrondir si c'est sur le bord.

0
Greg

Cela a fonctionné pour moi 

Function round_Up_To_Int(n As Double)
    If Math.Round(n) = n Or Math.Round(n) = 0 Then
        round_Up_To_Int = Math.Round(n)
    Else: round_Up_To_Int = Math.Round(n + 0.5)
    End If
End Function
0
Stephen Walsh

Utilisé la fonction "RDown" et "RUp" de ShamBhagwat et créé une autre fonction qui retournera la partie ronde (sans avoir besoin de donner des "chiffres" pour l'entrée) 

Function RoundDown(a As Double, digits As Integer) As Double
    RoundDown = Int((a + (1 / (10 ^ (digits + 1)))) * (10 ^ digits)) / (10 ^ digits)
End Function

Function RoundUp(a As Double, digits As Integer) As Double
    RoundUp = RoundDown(a + (5 / (10 ^ (digits + 1))), digits)
End Function

Function RDownAuto(a As Double) As Double
    Dim i As Integer
    For i = 0 To 17
        If Abs(a * 10) > WorksheetFunction.Power(10, -(i - 1)) Then
            If a > 0 Then
                RDownAuto = RoundDown(a, i)
            Else
                RDownAuto = RoundUp(a, i)
            End If
        Exit Function
        End If
    Next
End Function

la sortie sera:

RDownAuto(458.067)=458
RDownAuto(10.11)=10
RDownAuto(0.85)=0.8
RDownAuto(0.0052)=0.005
RDownAuto(-458.067)=-458
RDownAuto(-10.11)=-10
RDownAuto(-0.85)=-0.8
RDownAuto(-0.0052)=-0.005
0
baziili

En voici une que j'ai faite. Il n'utilise pas une seconde variable, ce que j'aime bien.

        Points = Len(Cells(1, i)) * 1.2
        If Round(Points) >= Points Then
            Points = Round(Points)
        Else: Points = Round(Points) + 1
        End If
0
girhen