質問

499、73433、2348のような番号を指定すると、最も近い5または10に丸めるためにどのVBAを使用できますか?または任意の数ですか?

5時まで:

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

10時まで:

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

etc。

役に立ちましたか?

解決 2

統合された回答

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

整数から1234.564から1235への浮動小数点の場合(これはVB固有であり、他のほとんどの言語は単に切り捨てられます):

int(1234.564)   'result is 1235

注意: VBは、バンカーの丸めを使用して、最も近い偶数に、知らない場合は驚くかもしれません:

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

ありがとうございます。

他のヒント

これは単純な数学です。数値Xと丸め係数Nを指定すると、式は次のようになります。

round(X / N)* N

最も近いXに丸める(VBA固有ではない)

N = X * int(N / X + 0.5)

int(...)は次に小さい整数を返します。

使用可能な丸め関数が既に最近値の整数に丸められている場合は、0.5の追加を省略します

VBでは、math.roundには、小数点以下の桁数と丸め方法を指定する追加の引数があります。 Math.Round(10.665、2、MidpointRounding.AwayFromZero)は10.67を返します。数値が10進数または単一データ型の場合、math.roundは10進数データ型を返します。 doubleの場合、doubleデータ型を返します。オプションstrictがオンの場合、これは重要かもしれません。

(10.665).ToString(" n2")の結果はゼロから四捨五入して「10.67」になります。追加の引数がないと、math.roundは10.66を返します。これにより、不一致が生じる可能性があります。

'例:499を最も近い5に丸めます。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)

厳密なVisual Basicのアプローチでは、浮動小数点値を整数に変換して、その整数に丸めることができます。 VBは、型変換を行うまれな言語の1つです(他のほとんどは単に切り捨てられます)。

5またはxの倍数は、単純にラウンドの前に分割し、ラウンド後に乗算することで実行できます。

小数位を丸めて保持する場合、Math.round(n、d)が機能します。

ソリューションは次のとおりです。

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

使用法:

dim decTotal as Decimal = GetRoundedNumber(CDec(499), CDec(0.05), RoundingDirection.Up)

単純にROUND(x / 5)* 5が仕事をするはずです。

コメントを追加できないため、これを使用します

vbsでそれを実行し、2の結果が2になる理由を理解して楽しんでください

ラウンドを信頼することはできません

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

そのようなものですか?

'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

この関数を試してください

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

「コミュニティWiki」が提供する機能を少し更新しました。 (最良の答え)、最も近い5(または好きなもの)に丸めますが、この例外を除きます:丸められた数値は元の数値よりも決して優れていません

これは、&quot;会社が47年間存続していると言う必要がある場合&quot; :Webページに&quot; is alive than 45年&quot; &quot; 50年以上生きている&quot; と嘘をつくことを避けます。

したがって、この関数に47を指定すると、50は返されませんが、代わりに45が返されます。

'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

Excelでラウンド関数が機能する方法をVisual Basicで模倣するには、使用する必要があります。 WorksheetFunction.Round(number、decimals)

この方法では、銀行または会計の丸めは丸めを行いません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top