値を通貨型の小数値(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型の変数を用意して対応しましょう。