税込商品代をリバースして税別金額にします。
小数点以下計算ルールもあるので、注意してください。
Round、Roundup、Rounddown関数の計算結果に注目です。
こんにちは、じゅんぱ店長(@junpa33)です。
エクセルVBAソフト インボイス見積納品請求伝票日付版を作成しています。
今回の作業は、税込金額を税別金額に再計算して全てを税別金額に揃えるプログラムを考えます。
適格請求書の作成規定では、1伝票の中での消費税額の計算は消費税額毎に1度しか行うことが出来ません。
なので、
税込金額で商品代をすでに計算している場合は「税額計算は1度だけ」のルールで、その商品1つだけの請求書発行ということになります。税込金額では、商品2つであれば請求書は2通必要ということになります。
このため、1通の適格請求書を作成するためには、
税込金額を税別金額に再計算し直して、税別金額の商品代合計を行い1度だけの消費税額を計算することになります。(もちろん消費税率別に)
インボイス見積納品請求3点伝票作成の記事編成
- インボイス見積納品請求3点伝票作成ソフトの使い方とダウンロード
- インボイス見積納品請求伝票日付版作成ソフトの使い方とダウンロード
コンテンツ
税別金額に揃える「外税計算」シート

先の記事で、「外税計算」シートの開始設定について紹介しました。


外税計算を行うVBA設計

「外税計算」の開始設定で、見出し行にコマンドボタンを設置しました。
- セルA1には「通番」
- セルB1には「内税チェック」
- セルC1には「8%内税チェック」
- セルK1には「税別化転送」
これらのボタンには、「.OnAction=”〇〇〇”」によって標準モジュールで記述しているプロシージャーと関連付けが行われます。
今回は、この関連付けられたプロシージャーを作成していきます。Module2に記述しています。
「通番」コマンドボタンの関連付けプロシージャー
関連付けのプロシージャー名は「通番再配置」です。



Sub 通番再配置()
Dim NoRow, i As Long
If ActiveSheet.Name = "作業シート" Or ActiveSheet.Name = _
"外税計算" Then
With ActiveSheet
.Range("A:A").ClearContents
NoRow = .Cells(Rows.Count, 5).End(xlUp).Row
For i = 2 To NoRow
.Cells(i, 1) = i - 1
Next i
End With
End If
End Sub
入力されている商品名の記述の最下行数をカウントして、A2セルを1として通し番号を振っていきます。
商品データを削除したり統合したり追加したりして、それまでに振られている通番が変わる時に「通番再配置」を実行します。(プログラムを動かす上ではこの通番が振られていることが必須です。)
「内税チェック」コマンドボタンの関連付けプロシージャー
関連付けのプロシージャー名は「チェックボックス内税配置」です。


Sub チェックボックス内税配置()
Dim SzRow, URow, i As Long
Dim Tgrange As Range
Dim CB As checkbox
With Worksheets("外税計算")
.Select
'外税計算シートでのデータ入力の最終行数
SzRow = Cells(Rows.Count, 5).End(xlUp).Row
'外税計算シートでの使用セルの最終行
URow = .UsedRange.Rows.Count
End With
'内税チェックボックスを一旦削除
Range(Cells(2, 2), Cells(URow, 2)).Select
For Each Tgrange In Selection
With Tgrange
For Each CB In Worksheets("外税計算").CheckBoxes
If Not Application.Intersect(CB.TopLeftCell, _
Tgrange) Is Nothing Then
CB.Delete
End If
Next CB
End With
Next Tgrange
'内税チェックボックスをデータ数だけ設置
For i = 2 To SzRow
With Cells(i, 2)
'各セルにチェックボックスを配置しセルのサイズを調整
ActiveSheet.CheckBoxes.Add(.Left, .Top, _
.Width, .Height).Select
With Selection
.Characters.Text = ""
.LinkedCell = Cells(i, 2).Address
End With
'文字色を白色に変更
.Font.Color = RGB(255, 255, 255)
End With
Next i
End Sub
ここで配置するチェックボックスはフォームコントロールのタイプなので、クリック時のリンクセルを設定します。
やたらとデータ列数を増やしたくないので、チェックボックスを設置しているのと同じセルをリンクセルとしています。
リンクセルは、チェックボックスがチェックされた時に、「True」が表示されるセルになります。
テクニックとして、その「True」の文字が見えないように、Fontを「白色」に変更しておきます。
既にあるチェックボックスを一旦クリアしてから再度設置します。
チェックボックスはセルには入っていないので、「Clearメソッド」では消せません。
ここでは「Deleteメソッド」を使用しています
特定範囲のチェックボックスだけ削除するには、セル範囲を指定しないといけません。
チェックボックスの存在する範囲を知るのに、最下行のセルを調べるのも「Endプロパティ」では取得することが出来ません。
「UsedRangeプロパティ」を使えば、チェックボックスがあるセル範囲を調べることが出来ます。
チェックボックスを削除するのに、どれを削除するのか指定しないといけません。
削除対象範囲のセル位置にある(であろう)チェックボックスを1つづつ、「TopLeftCellプロパティ」を利用してそこに有るのか無いのかを判断し、あればそのチェックボックスを削除していきます。
「8%内税チェック」コマンドボタンの関連付けプロシージャー
関連付けのプロシージャー名は「チェック8内税配置」です。
Sub チェック8内税配置()
Dim SzRow, URow, i As Long
Dim Tgrange As Range
Dim CB As checkbox
With Worksheets("外税計算")
.Select
'外税計算シートでのデータ入力の最終行数
SzRow = Cells(Rows.Count, 5).End(xlUp).Row
'外税計算シートでの使用セルの最終行
URow = .UsedRange.Rows.Count
End With
'8%内税チェックボックスを一旦削除
Range(Cells(2, 3), Cells(URow, 3)).Select
For Each Tgrange In Selection
With Tgrange
For Each CB In Worksheets("外税計算").CheckBoxes
If Not Application.Intersect(CB.TopLeftCell, _
Tgrange) Is Nothing Then
CB.Delete
End If
Next CB
End With
Next Tgrange
'8%内税チェックボックスをデータ数だけ設置
For i = 2 To SzRow
With Cells(i, 3)
'各セルにチェックボックスを配置しセルのサイズを調整
ActiveSheet.CheckBoxes.Add(.Left, .Top, _
.Width, .Height).Select
With Selection
.Characters.Text = ""
.LinkedCell = Cells(i, 3).Address
End With
'文字色を白色に変更
.Font.Color = RGB(255, 255, 255)
End With
Next i
End Sub
「チェックボックス内税配置」プロシージャーと同様です。
「税別化転送」コマンドボタンの関連付けプロシージャー
関連付けのプロシージャー名は「税別化転送」です。

Sub 税別化転送()
Dim SkRow, i As Long
With Worksheets("外税計算")
SkRow = .Cells(Rows.Count, 5).End(xlUp).Row
For i = 2 To SkRow
If .Cells(i, 2) = True Then
With .Cells(i, 7)
.Offset(0, 2) = .Value
If Worksheets("外税計算") _
.Cells(i, 3) = True Then
CellV = .Value
Call CulcruleA8(CellV)
.Value = Sk8Tx
Else
CellV = .Value
Call CulcruleA10(CellV)
.Value = Sk10Tx
End If
.Offset(0, 1) = .Value * _
Worksheets("外税計算").Cells(i, 5)
End With
End If
Next i
.Range(.Cells(2, 3), .Cells(SkRow, 8)).Copy _
Worksheets("作業シート").Range("C2")
.Range("A1").Select
End With
With Worksheets("作業シート")
.Select
.Columns("D").AutoFit
.Range("A1").Select
End With
MsgBox "内税から外税に変更した元単価は、" & vbCrLf & _
"「外税計算シート 備考欄」で確認出来ます。", _
vbInformation, "インボイス見積納品請求3点日付版作成"
End Sub
「内税CHECK」や「8%内税CHECK」がチェックされている場合は、内税⇒外税に再計算されます。
再計算された場合は、元の内税金額を保存するために、「備考」の見出し項目列に元の再計算前の内税金額が表示されています。
計算完了後には、データは「作業シート」に自動転送されます。
計算には、Functionプロシージャーを使用します。

「内税⇒外税」の計算式については、小数点以下の端数計算を考えないといけません。
お店によって計算ルールを取り決めていると思います。
「切り上げ」「四捨五入」「切り捨て」の3つの方法すべてコード化する必要があります。
コード記述はFunctionプロシージャーで(Module7に)記述しています。
例えば、小数点以下「切り捨て」ルールで計算された税込価格は、税別にリバース再計算する場合は、同じく「切り捨て」で税別金額再計算してはいけません。その税別金額から再び消費税額を計算したときには同じ金額にはなりません。
ここでのVBA設計では、ユーザーフォームの「小数点以下計算ルール」で「切り上げ」「切り捨て」を選択した場合、自動的に、リバース計算時には切り捨てと切り上げの逆転計算が行われるようになっています。
Option Explicit
'消費税10%計算税別切り捨て
Function CTaxDD(CellV As Long) As Long
CTaxDD = WorksheetFunction.RoundDown(CellV / 1.1, 0)
End Function
'消費税10%計算税別四捨五入
Function CTaxAD(CellV As Long) As Long
CTaxAD = WorksheetFunction.Round(CellV / 1.1, 0)
End Function
'消費税10%計算税別切り上げ
Function CTaxUD(CellV As Long) As Long
CTaxUD = WorksheetFunction.RoundUp(CellV / 1.1, 0)
End Function
'消費税8%計算税別切り捨て
Function CTax8DD(CellV As Long) As Long
CTax8DD = WorksheetFunction.RoundDown(CellV / 1.08, 0)
End Function
'消費税8%計算税別四捨五入
Function CTax8AD(CellV As Long) As Long
CTax8AD = WorksheetFunction.Round(CellV / 1.08, 0)
End Function
'消費税8%計算税別切り上げ
Function CTax8UD(CellV As Long) As Long
CTax8UD = WorksheetFunction.RoundUp(CellV / 1.08, 0)
End Function
'消費税10%税額計算切り捨て
Function CTaxDM(CellV As Long) As Long
CTaxDM = WorksheetFunction.RoundDown(CellV * 0.1, 0)
End Function
'消費税10%税額計算四捨五入
Function CTaxAM(CellV As Long) As Long
CTaxAM = WorksheetFunction.Round(CellV * 0.1, 0)
End Function
'消費税10%税額計算切り上げ
Function CTaxUM(CellV As Long) As Long
CTaxUM = WorksheetFunction.RoundUp(CellV * 0.1, 0)
End Function
'消費税8%税額計算切り捨て
Function CTax8DM(CellV As Long) As Long
CTax8DM = WorksheetFunction.RoundDown(CellV * 0.08, 0)
End Function
'消費税8%税額計算四捨五入
Function CTax8AM(CellV As Long) As Long
CTax8AM = WorksheetFunction.Round(CellV * 0.08, 0)
End Function
'消費税8%税額計算切り上げ
Function CTax8UM(CellV As Long) As Long
CTax8UM = WorksheetFunction.RoundUp(CellV * 0.08, 0)
End Function
'消費税10%税別計算
Function CulcruleA10(CellV As Long) As Long
If インボイス3点操作パネル.OptionButton1 = True Then
Sk10Tx = CTaxDD(CellV)
ElseIf インボイス3点操作パネル.OptionButton3 = True Then
Sk10Tx = CTaxUD(CellV)
Else
Sk10Tx = CTaxAD(CellV)
End If
End Function
'消費税8%税別計算
Function CulcruleA8(CellV As Long) As Long
If インボイス3点操作パネル.OptionButton1 = True Then
Sk8Tx = CTax8DD(CellV)
ElseIf インボイス3点操作パネル.OptionButton3 = True Then
Sk8Tx = CTax8UD(CellV)
Else
Sk8Tx = CTax8AD(CellV)
End If
End Function
'消費税額10%計算
Function CulcruleB10(CellV As Long) As Long
If インボイス3点操作パネル.OptionButton1 = True Then
Con10Tx = CTaxUM(CellV)
ElseIf インボイス3点操作パネル.OptionButton3 = True Then
Con10Tx = CTaxDM(CellV)
Else
Con10Tx = CTaxAM(CellV)
End If
End Function
'消費税額8%計算
Function CulcruleB8(CellV As Long) As Long
If インボイス3点操作パネル.OptionButton1 = True Then
Con8Tx = CTax8UM(CellV)
ElseIf インボイス3点操作パネル.OptionButton3 = True Then
Con8Tx = CTax8DM(CellV)
Else
Con8Tx = CTax8AM(CellV)
End If
End Function
商品代を税別金額で揃えるのまとめ

適格請求書を作成するときには、一旦、商品価格を税別に戻して、全体を消費税別に振り分けて、税別合計を出して、そこから消費税額を計算して、というステップが必ず必要になります。
そのプロセスの中で、今回のVBA作成は非常に重要な部分になっています。
計算種類(変数種類も)多くなっていますので、頭を整理しながらコードを読んでみてください。
エクセルVBAを独習するのに参考書は欠かせません。 参考書選びは自分に合った「相棒」にできるものを選んでいきたいです。

今回の記事はここまでです。 最後までご覧いただき有難うございました。
<記事内容についての告知>
VBAコードの記述記事においては、その記述には細心の注意をしたつもりですが、掲載のVBAコードは動作を保証するものではりません。 あくまでVBAの情報の一例として掲載しています。 掲載のVBAコードのご使用は、自己責任でご判断ください。 万一データ破損等の損害が発生しても当方では責任は負いません。