2020/02/01  2020/02/12改訂

様々な数値の丸め方




1.数値を丸める関数などの一覧

ざっと調べてみたところ、Excelには多種類の数値を丸めるための関数がありそうです。
下図は、最上行の数値を様々な関数で計算した結果です。
図1-1

なお「VBA関数」の行は、下記コードを使ってセル計算させています(23~28番目)。通常ではマクロ内でワークシート関数を使う(Application.WorksheetFunction.〇〇)のですが、多くのワークシート関数と比較させる為に今回はこのようにしました。
  1. Function vba_int(std) As Integer  '←23番目
  2.  vba_int = Int(std)
  3. End Function
  4. Function vba_fix(std) As Integer  '←24番目
  5.  vba_fix = Fix(std)
  6. End Function
  7. Function vba_round(std) As Integer  '←25番目
  8.  vba_round = Round(std)
  9. End Function
  10. Function vba_format(std) As Integer  '←26番目
  11.  vba_format = Format(std, "0")
  12. End Function
  13. Function vba_1(std) As Integer  '←27番目
  14.  vba_1 = Int(std + 1)
  15. End Function
  16. Function vba_05(std) As Integer  '←28番目
  17.  vba_05 = Int(std + 0.5)
  18. End Function
図1-2

2.各関数を使用するに当たっての注意

図1-1では、セル表示形式での数値丸めを含め、全28種の関数などで計算をさせています。通常、数値を丸める関数の分類は「四捨五入」「切り上げ」「切り捨て」と3種に分かれると思いますが、それは「正の数値」での仕分けであると思います。
「負の数値」をどちらの方向に丸めるか(ー∞の方向 or ゼロに近い方向)は使う場面によって異なります。その「負の数値」までを含めてみて今回の関数を分類してみると全部で5種類(右端の方の①②・・・という列)になりそうです。(なお、EVEN関数・ODD関数は少し特殊なので分類していません。)

また「VBA関数のRound(図1-1の25番目)」で、11.5の結果と12.5の結果に注目して下さい。どちらも12に丸められています。四捨五入のはずですので12.5の方の結果は13になって良いはずですが、「VBA関数のRoundには、丁度.5を処理する際は偶数側になる」というルールのようです(銀行丸め と呼ばれていて、JIS Z 8401にも記載されている方法のようです)。これはマイナス側の数値についても同様となります。良く使う関数と思いますが充分注意が必要です。
今回は種類①に分類しましたが、この部分だけを見ると異なる種類の関数と見る方が正確かもしれません。
ちなみに、このようなロジックになっている理由ですが、小数点が .0 か .5 しか持たない数字が複数存在する場合(例:1.0 1.5 2.0 2.5 3.0 3.5 ・・・)、「そのままの値」「VBA関数のRoundで処理した値」「通常の四捨五入で処理した値」をそれぞれ合計してみると、VBA関数のRound値が誤差が少ない事が分かります。銀行とどう繋がりがあるのかまでは分かりませんでしたが、現在では特殊なロジックのようです。(2020/02/12追記。図1-1差替を含む)

色々な場面を想定してExcelの関数も増えてきています。皆さんもマクロの中、及びワークシートの中で関数を多く使われると思いますが、正の数値に注目するだけでなく「もし負の値が来たら・・」も考慮して関数の選択をし、処理をするようにしましょう。

なお、7~8番目の「FIXED関数・TEXT関数」の戻り値は文字列となりますので処理時に注意が必要です。例えば、セル上でSUM関数などを使用して計算させようとすると、FIXED関数・TEXT関数の部分は無視(=ゼロ扱い)されます。
文字列ですので「表示位置が左詰めになるので、そんなヘマしない」と思われるかもしれませんが、書式で右詰めにする事も出来てしまいますので「見かけだけで判断すると痛い目に会う」と思った方が良いと思います。
(私の経験ですが、Excelで数字を入力する時は必ず先頭にアポストロフィ(')を入れる人がいました。)

また1番目のデータは「セルの書式設定」で表示形式を「標準 → 数値」にしていますが、その様に設定すると、数値の右側に半角1文字の隙間が発生します。他の行の数字と見比べると少し違和感がありますが、これには理由があります。
書式設定を変更したい範囲を選択し、右クリックから「セルの書式設定」→「表示形式」→「数値」を選び「小数点以下の桁数」をゼロにする事で、図1-1の1番目のデータは作っているのですが、その時に「ユーザー定義」をクリックしてみると、種類のところに「 0_ 」が選ばれている事が分かります。
図2-1

この「 0_ 」の意味は「数字の後ろに、1文字分のスペースを空ける」ことを表しています。ですから数字が完全に右詰めにならず1文字だけスペースが空いてしまう事になります。
でも「空ける意味」が分かりませんよね。今回の図1-1は、セルの書式のところの「負の数の表示形式」で「-1234」を選んでいました。これを「(1234)」を選んでみたのが下図(図2-2)です。


図2-2

G列には「負の数の表示形式を(1234)にする」設定をしたところ、負の数(G2セル、G4セル)にはカッコが付きました。種類の欄には「0_ );(0)」とあります。セミコロン「;」の左側が正の値の表示形式、右側が負の値の表示形式になります。
負の値は表示形式に従ってカッコで囲まれているのが分かります。正の値は数字を表す「ゼロ」の右側に「_ )」が付いていますので、「 )の幅だけスペースを空ける」事を表しています。単に「_ (空欄を1つ空ける)」としなかったのは、フォントによっては1文字の幅が異なることがあるので「マイナスの時につけるカッコと同じ幅を空ける」と細かい配慮をした様です。
つまり、図2-2のように正の値と負の値を並べて記載するときに「桁が揃っていて見やすくなる」ことを目的に、数値の表示をこのような書式にしているのです。
もちろん嫌な人は、その「_ 」を削除した「ユーザー定義」の書式を使用すれば、右端のスペースは無くなります。

数値の丸め方の色々(it-016.xlsm)

セキュリティ向上を目的として「インターネット経由でダウンロードしたOfficeファイル(Excel等)のマクロは、既定でブロック」されるようにOfficeアプリケーションの既定動作が変更になりました。(2022年4月より切替開始)
解除の方法については「ダウンロードファイルのブロック解除方法」を参照下さい。