本日は、チョイねたです。四捨五入をプログラムで実装するとどのようになるか、皆さんご存知でしょうか? 1度でも開発した経験があれば、そんなに難しくないのですが、意外と、経験がないとすぐに思いつかないのではないでしょうか?ちなみに標準では、エクセルのシート上から呼び出せる、ROUND、ROUNDUP、ROUNDDOWN関数などが用意されているようですが、アルゴリズムの勉強ということで、今回は、自分で作成してみましょう。
例えば、1.463という値を、少数点第2位で四捨五入するとする。
次に、1.463を、少数点第3位で四捨五入するとする。
というわけで、上記の処理を関数に実装し、以下にソースを公開してみましたので、参考にしてみてください。
また、エクセルのシート上から呼び出し可能な、ROUND関数をVBAのプログラムから使用するサンプルも以下に公開しているので、そちらも参考にしてみてください。
ソースコードは、Microsoft社の製品 エクセル向けに書いたものなので、利用するには、ご使用のコンピュータに、エクセルがインストールされていることが、必須条件です。
Public Function RoundOff(ByVal v As Variant, ByVal digit As Long) As Variant
戻り値 : 四捨五入された値が返却される。
引数v : 四捨五入される数値。
引数digit : 四捨五入の位置。1は1の位、2は10の位、-1は少数点第1位、-2は第2位、…
以下が、今回作成した四捨五入関数です。ちょっとしたプログラムなので、関数のコードのみ公開しています。
'四捨五入
Public Function RoundOff(ByVal v As Variant, ByVal digit As Long) As Variant
Dim mlt_v10 As Variant
'digit = 0 の場合は、何もせず、指定された値をそのまま返却
If digit = 0 Then
RoundOff = v
Exit Function
'整数部分
'digit : 整数部の、digitの位で、四捨五入。
ElseIf digit > 0 Then
mlt_v10 = 10 ^ digit
v = v / mlt_v10
v = v + 0.5
v = Int(v)
v = v * mlt_v10
'少数点以下
'digit : 少数点第digit位で四捨五入
Else
mlt_v10 = 10 ^ (-digit - 1)
v = v * mlt_v10
v = v + 0.5
v = Int(v)
v = v / mlt_v10
End If
RoundOff = v
End Function
以下は、エクセルシート上から呼び出せる標準のRound関数をVBAのプログラムから呼び出したサンプルコードです。私が、作成したオリジナルの関数とは仕様が少し違っているので、ご注意を。
'*** マクロで実行するテスト関数 ***
'Excel標準のRound関数は、
'第一引数 : 数値、
'第二引数 : 四捨五入の位置、1を指定すると、少数点第2位での四捨五入
Public Sub TestFunction()
Dim v As Double
'テストデータ
v = 0.98473
'*****************************************************************
' シートから呼び出せるExcel標準の関数は、
' WorksheetFunctionオブジェクトの
' 静的(Static)な関数となっているようです。
' 静的な関数は、オブジェクト名.関数名で呼び出せます。
' また、四捨五入の結果をイミディエイト・ウインドウに出力します。
'*****************************************************************
Debug.Print WorksheetFunction.Round(v, 0) '少数点第1位で四捨五入
Debug.Print WorksheetFunction.Round(v, 1) '少数点第2位で四捨五入
Debug.Print WorksheetFunction.Round(v, 2) '少数点第3位で四捨五入
Debug.Print WorksheetFunction.Round(v, 3) '少数点第4位で四捨五入
Debug.Print WorksheetFunction.Round(v, 4) '少数点第5位で四捨五入
End Sub
※静的な関数とは、通常オブジェクトを動的に確保すると、オブジェクトの持っている関数(メソッド)もそのオブジェクトとともに、確保されプログラムコードに配置されます。しかし、静的な関数であることを明示しておけば、動的にオブジェクトを確保しても、一意のアドレスにその関数は配置されます。従って、複数オブジェクトを生成しても、静的(Static)であれば、その関数はメモリ上に一つしか配置されません。
作者は、本ソフトウェアの使用または使用不能から生じるコンピュータの故障、情報の消失、その他あらゆる直接的及び間接的被害に関して一切の責任を負いません。
ご使用にあたり、改善の要望、不具合の発生等ありましたら、画面下のアドレスまで、ご連絡頂きますよう、宜しくお願いいたします。ご面倒、ご不便をお掛けしますが、宜しくお願いいたします。