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?
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)
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----------------
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)
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
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))
Essayez la fonction RoundUp:
Dim i As Double
i = Application.WorksheetFunction.RoundUp(Cells(1, 1).Value * Cells(1, 2).Value, 2)
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.
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.
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
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
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