和風スパゲティのレシピ

日本語でコーディングするExcelVBA

値を通貨型(Currency型)に変換する - CCur関数

値を通貨型の小数値(Currency型)に変換する、CCur関数を解説します。

通貨型(Currency型)とは

通貨型(Currency型)はLong型やDouble型と同じ数値を扱うデータ型で、

-922,337,203,685,477.5808 ~ 922,337,203,685,477.5807

の間の値を扱うことがでるデータ型です。


整数部分が15桁、小数部分が4桁と桁数に制限がある代わりに、
範囲内の小数であれば近似値ではなく正確な値で扱えます。
 

Dim Double変数1 As Double: Double変数1 = 0.1
Dim Double変数2 As Double: Double変数1 = 0.2

Dim Currency変数1 As Currency: Currency変数1 = 0.1
Dim Currency変数2 As Currency: Currency変数2 = 0.2

Debug.Print Double変数1 + Double変数2 = 0.3 ' False (浮動小数点の近似誤差が発生)
Debug.Print Currency変数1 + Currency変数2 = 0.3 ' True (Currencyなら大丈夫)

 
小数部が4桁しかないため計算誤差はDouble型より大きくなりますが、
0.1を完全な0.1として保持できるため、
0.1+0.2といった割り切れる小数の計算はCurrency型の方が正確になります。

  • 割り算や数学関数で出てくる小数はDouble型が正確
  • 手入力した小数を足し引きするならCurrency型が正確

こんなイメージで状況に応じて使い分けてください。


CCur関数は渡したデータをこのCurrency型に変換する関数です。

基本形

CCur(変換したい値)

実行例

CCur(123) ' = 123
CCur(123.4) ' = 123.4
CCur(123.45678) ' = 123.4568

CDbl(1 / 3) ' = 0.333333333333333
CCur(1 / 3) ' = 0.3333
CCur(1 / 3) * 3 ' = 0.9999 ← これが弱点

0.1 + 0.2 = 0.3 ' False
CCur(0.1 + 0.2) = 0.3 ' True ← これが長所

CCur("あいう") ' 型が一致しませんエラー
CCur("2025/4/1") ' 型が一致しませんエラー
CCur(#4/1/2025 4:00:00 PM#)  '  45748.625
CDate(CCur(#4/1/2025 4:00:00 PM#))  ' 2025/04/01 16:00:03

解説

CCur関数は渡された値を通貨型の小数値に変換する関数です。

小数部4桁の固定小数点型に変換すると捉えてもOKです。


小数点以下4桁しか持てないため、

CDbl(1 / 3) * 3 ' = 1
CCur(1 / 3) * 3 ' = 0.9999

このように割り算などの計算誤差はDouble型より大きくなりますが、

0.1を近似値ではない完全な0.1として保持できるため、

0.1 + 0.2 = 0.3 ' False
CCur(0.1 + 0.2) = 0.3 ' True

このように10進数で割り切れる小数を扱うのはDouble型より得意です。


この例のように、「0.1や0.01を足したり引いたりする」際に、
浮動小数点誤差に悩まされたらCCur関数を使用して調整してください。


といってもVBAは暗黙の型変換を行ってくれる言語ですので、

Dim cur型の変数 As Currency
cur型の変数 = 0.1

Debug.Print cur型の変数 + 0.2 = 0.3 ' True

このようにCurrency型の変数を用意すれば、
代入・計算される小数はCurrency型に自動で変換されて処理されます。


CCur関数を使用するのはちょっとした判定の調整などに限定し、
マクロ全体で扱う小数などはしっかりCurrency型の変数を用意して対応しましょう。