2

この質問は C++ 言語について既に尋ねられていますが、VBA の関数が必要です。C++ 関数を VBA に変換しようとしましたが、正しい値が返されません。

次のことを行う関数が必要です。

RoundUp(23.90, 5)
'return 25

RoundUp(23.90, 10)
'return 30

RoundUp(23.90, 20)
'return 40

RoundUp(23.90, 50)
'return 50

RoundUp(102.50, 5)
'return 105

RoundUp(102.50, 20)
'return 120

これが私がこれまでに持っているものです。ほとんどの場合は機能しますが、倍数より 0.5 未満の数値に対しては正しくない値を返します。したがって、問題は、剰余値の計算方法に関する丸めの問題のようです。

Public Function RoundUp(dblNumToRound As Double, lMultiple As Long) As Double
    Dim rmndr As Long
    rmndr = dblNumToRound Mod lMultiple
    If rmndr = 0 Then
        RoundUp = dblNumToRound
    Else
        RoundUp = Round(dblNumToRound) + lMultiple - rmndr
    End If
End Function

例えば:

RoundUp(49.50, 50)
'Returns 49.50 because rmndr = 0
4

2 に答える 2

5

で割りlMultiple、切り上げて、もう一度掛けるだけです。

実際に常に切り上げたいと仮定します(負の数の場合も):

Public Function RoundUp(dblNumToRound As Double, lMultiple As Long) As Double
    Dim asDec   as Variant
    Dim rounded as Variant

    asDec = CDec(dblNumToRound)/lMultiple
    rounded = Int(asDec)

    If rounded <> asDec Then
       rounded = rounded + 1
    End If
    RoundUp = rounded * lMultiple
End Function

私は実際には VBA プログラマーではないので、コンマを 1 つか 2 つ調整する必要があるかもしれません。ただし、重要なことは次のとおりです。

  • 精度には Decimal (バリアント サブタイプ) を使用します
  • VB に計算を任せる
于 2013-09-07T21:48:17.147 に答える
-1

はるかに簡単な解決策は、丸めの前に数値に .5 を追加することです。

1.1 -> Round(1.1+.5, 0) -> 2
于 2016-05-26T13:38:58.627 に答える