総額から計算しないとずれる
10%になると10%を乗じるのは簡単だが、税込み価格から税抜き価格を出すと端数とのかい離が大きく、さらに出た価格に10%をかけるとまたずれてしまう。
このため、今後総額(税込み)で計算し、最後に消費税を計算する方法が主流になると考えられる。
そこで少なくとも内部では税抜きと税額を同時に計算するほうが良いようだ。
また消費税は円未満切り捨てが実務上認められているため、FIXを用いて問題がないと判断した。
これは日本円の場合
ドルを円換算ではなくドル建てのままこの関数を使うことはできない。
整数未満が切り捨てられてしまう。
Ccurは設定された(ロケール)国の通貨に従うため、違う外貨を混在させると適していない。
CCur 関数
ほかのデータ型から通貨型の内部処理形式に変換するときは、ロケールをもとに変換を行う CCur 関数を使います。システムのロケールの設定に従って、その国で使われている小数点記号や桁区切り記号が正しく処理されます。
コード
CurrencyとDecimalというデータ型
Currncy というデータ型
number with 15 digits to the left of the decimal point and 4 digits to the right. This representation provides a range of -922,337,203,685,477.5808 to 922,337,203,685,477.5807
整数部15桁 小数点以下4桁
プラスマイナス92億まで計算できる
DecimalはVBAではCDecでしか扱えずデータ型として定義できない。
そこで、内部ではCDecで計算し、最後にCurrencyにする。
CDecをCcurに変えるとき小数第4位で丸めが生じるが、それ以前にFIXで0にされるため問題がない。
受け入れる数をVARIANTにしているため、できるだけ広く数字を扱えるようにしている。
Decimal Currencyはやや遅くなるが、正確性を重視している。
Fix関数
マイナスに対応するにはINTを使ってはいけないのでFIXを使う
InTは符号を外して絶対値で計算する
Int、Fix 関数
Fix(number) は次の式と同等です。
Sgn(number) * Int(Abs(number))
Fix関数 - officetanaka
FIXはExcelにもあるので、Excel 、 Accessどちらでも使える
''''''''''''''''''''
''''' For VBA ''''''
''''''''''''''''''''
'''' 8 % ---------------------------------------
''' 税込み価格から本体価格、税額を求める
'8%税込み価格から本体価格(税抜き価格)を求める
Public Function Extax08hontai(zeikomi As Variant) As Currency '8%小数点切り捨て本体価格
'Extax08hontai(108) = 100
Dim PreTax As Variant
Extax08hontai = CDec(Fix(zeikomi / CDec(1.08)))
'Debug.Print zeikomi
'Debug.Print Extax08
End Function
'8%税込み価格から税額を求める
Public Function Extax08(zeikomi As Variant) As Currency '8%小数点切り捨て税額
'Example Extax08(108) = 8
Dim PreTax As Variant
PreTax = CDec(Fix(zeikomi / CDec(1.08)))
Extax08 = CCur(Fix(CDec(zeikomi - PreTax)))
'Debug.Print zeikomi
'Debug.Print Extax08
End Function
'本体価格から8%時の税込み価格(総額)を求める
Public Function Intax08zeikomiTotal(hontai As Variant) As Currency '8%本体価格から税込み価格を求める(円未満切り捨て)
'Example Intax08zeikomiTotal(100) = 108
Dim PreTax As Variant
Intax08zeikomiTotal = CDec(Fix(hontai * CDec(1.08)))
End Function
''' 本体価格から税込み価格、税額を求める
'本体価格から8%時の税込み価格(総額)を求める
Public Function Intax08zeikomiTax(hontai As Variant) As Currency '8%本体価格から税額を求める(円未満切り捨て)
'Example Intax08zeikomiTax(100) = 8
Dim InTaxTotal As Variant
InTaxTotal = CDec(Fix(hontai * CDec(1.08)))
Intax08zeikomiTax = InTaxTotal - hontai
End Function
Public Function Intax08zeikomiTax(hontai As Currency) As Currency '8%本体価格から税額を求める(円未満切り捨て)
' 一度税込み価格を求めて、そこから本体価格を控除する形で求める
' 本体価格は通貨型とする
'Example Intax08zeikomitax(100) = 8
Dim InTaxTotal As Variant
InTaxTotal = CDec(Fix(hontai * CDec(1.08)))
Intax08zeikomiTax = InTaxTotal - hontai
End Function
'--------------------------------------------
'''' 10 % ---------------------------------------
''' 税込み価格から本体価格、税額を求める
' 10 %時の税込み価格から税額を求める関数 ----
Public Function Extax10(zeikomi As Variant) As Currency '10%小数点切り捨て税額
'例 Extax10 (110) = 10
Dim pretax As Variant
pretax = CDec(Fix(zeikomi / CDec(1.1)))
Extax10 = CCur(CDec(Fix(zeikomi - pretax)))
'Debug.Print "Extax10:税込み:", hontai
'Debug.Print "Extax10:本体:", hontai - Int(Cdec(zeikomi - CDec(pretax)))
'Debug.Print "Extax10:税:", Int(CDec(zeikomi - CDec(pretax)))
End Function
' 10 %時の税込み価格から本体価格を求める関数 ----
Public Function Extax10hontai(zeikomi As Currency) As Currency '10%本体価格(小数以下端数切り捨て)
'Currency型(通貨型)の範囲 -922,337,203,685,477.5808 ~ 922,337,203,685,477.5807 整数部15桁、小数点4桁固定 これ以下の小数点は無視される
' Example Extax10hontai(110) = 100
Dim ExTax As Variant
ExTax = CDec(Fix(zeikomi / CDec(1.1)))
Extax10hontai = CCur(ExTax)
'Debug.Print "Pretax10:税込み:", hontai
'Debug.Print "Pretax10:本体:", temp
'Debug.Print "Pretax10:税額:", Extax10(zeikomi)
'Debug.Print "Pretax10検証;", temp + Extax10(zeikomi)
End Function
Public Function Intax10zeikomiTotal(hontai As Currency) As Currency '10%税込み価格を求める関数 消費税は円未満切り捨て
' 10 %時の本体価格から税込み価格を求める関数 ----
' 本体価格は通貨型とする
'例 Intax10zeikomiTotal(100) = 110
Dim pretax As Variant
Intax10zeikomiTotal = CCur(Fix(hontai * CDec(1.1)))
End Function
' 10 %時の本体価格から税込み価格の税額を求める関数 ----
' 一度税込み価格を求めて、そこから本体価格を控除する形で求める
' 本体価格は通貨型とする
Public Function Intax10zeikomizeigaku(hontai As Currency) As Currency '10%税込み価格を求める関数 消費税は円未満切り捨て
'例 Intax10zeikomizeigaku(100) = 10
Dim InTaxTotal As Variant
InTaxTotal = CDec(Fix(hontai * CDec(1.1)))
Intax10zeikomizeigaku = CCur(CDec(Fix(InTaxTotal - hontai)))
End Function