商品代を税別金額で揃えるためのVBA 3点伝票日付版

invoice3tenzeibetueyecatch

税込商品代をリバースして税別金額にします。
小数点以下計算ルールもあるので、注意してください。
Round、Roundup、Rounddown関数の計算結果に注目です。

こんにちは、じゅんぱ店長(@junpa33)です。

エクセルVBAソフト インボイス見積納品請求伝票日付版を作成しています。

今回の作業は、税込金額を税別金額に再計算して全てを税別金額に揃えるプログラムを考えます。

適格請求書の作成規定では、1伝票の中での消費税額の計算は消費税額毎に1度しか行うことが出来ません。

なので、

税込金額で商品代をすでに計算している場合は「税額計算は1度だけ」のルールで、その商品1つだけの請求書発行ということになります。税込金額では、商品2つであれば請求書は2通必要ということになります。

このため、1通の適格請求書を作成するためには、

税込金額を税別金額に再計算し直して、税別金額の商品代合計を行い1度だけの消費税額を計算することになります。(もちろん消費税率別に)

インボイス見積納品請求3点伝票作成の記事編成

税別金額に揃える「外税計算」シート

invoice3tenzeibetup001

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

invoice3tenshseteyecatch 使用するワークシートの準備 インボイス見積納品請求伝票
invoice3tenshsetp05

外税計算を行うVBA設計

invoice3tenzeibetup002

「外税計算」の開始設定で、見出し行にコマンドボタンを設置しました。

  1. セルA1には「通番」
  2. セルB1には「内税チェック」
  3. セルC1には「8%内税チェック」
  4. セルK1には「税別化転送」

これらのボタンには、「.OnAction=”〇〇〇”」によって標準モジュールで記述しているプロシージャーと関連付けが行われます。

今回は、この関連付けられたプロシージャーを作成していきます。Module2に記述しています。

「通番」コマンドボタンの関連付けプロシージャー

関連付けのプロシージャー名は「通番再配置」です。

vbaendpropertyeyecatch Endプロパティで上下左右の最終セルを取得 fornextirekoeyecatch For~Nextのループと入れ子構造をVBA最速理解 vbawithstateeyecatch With~End Withの使い方。VBAコードを簡潔に記述する
VBA
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として通し番号を振っていきます。

商品データを削除したり統合したり追加したりして、それまでに振られている通番が変わる時に「通番再配置」を実行します。(プログラムを動かす上ではこの通番が振られていることが必須です。)

「内税チェック」コマンドボタンの関連付けプロシージャー

関連付けのプロシージャー名は「チェックボックス内税配置」です。

VBACheckBoxeyecatch シートへの【2種類のチェックボックス】の設置と使い方の違い vbausedrangeeyecatch UsedRangeプロパティの使い方のコツ
VBA
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を「白色」に変更しておきます。

既にあるチェックボックスを一旦クリアしてから再度設置します。

特定の範囲のチェックボックスを掴んで削除するVBA

チェックボックスはセルには入っていないので、「Clearメソッド」では消せません。

ここでは「Deleteメソッド」を使用しています

特定範囲のチェックボックスだけ削除するには、セル範囲を指定しないといけません。

チェックボックスの存在する範囲を知るのに、最下行のセルを調べるのも「Endプロパティ」では取得することが出来ません。

「UsedRangeプロパティ」を使えば、チェックボックスがあるセル範囲を調べることが出来ます。

チェックボックスを削除するのに、どれを削除するのか指定しないといけません。

削除対象範囲のセル位置にある(であろう)チェックボックスを1つづつ、「TopLeftCellプロパティ」を利用してそこに有るのか無いのかを判断し、あればそのチェックボックスを削除していきます。

「8%内税チェック」コマンドボタンの関連付けプロシージャー

関連付けのプロシージャー名は「チェック8内税配置」です。

VBA
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

「チェックボックス内税配置」プロシージャーと同様です。

「税別化転送」コマンドボタンの関連付けプロシージャー

関連付けのプロシージャー名は「税別化転送」です。

vbaoffseteyecatch Offsetプロパティは指定範囲を移動させる
VBA
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プロシージャーを使用します。

VBAFunctioneyecatch Functionプロシージャーとユーザー定義関数
「内税⇒外税」の計算式

「内税⇒外税」の計算式については、小数点以下の端数計算を考えないといけません。

お店によって計算ルールを取り決めていると思います。

「切り上げ」「四捨五入」「切り捨て」の3つの方法すべてコード化する必要があります。

コード記述はFunctionプロシージャーで(Module7に)記述しています。

例えば、小数点以下「切り捨て」ルールで計算された税込価格は、税別にリバース再計算する場合は、同じく「切り捨て」で税別金額再計算してはいけません。その税別金額から再び消費税額を計算したときには同じ金額にはなりません。

例えば、こういうこと
  1. 切り捨てルールで税込¥100を10%税別に戻す。税別金額¥90
  2. 切り捨てルールで税別¥90円の10%消費税額を計算。消費税額¥9
  1. 切り上げルールで税込¥100を10%税別に戻す。税別金額¥91
  2. 切り捨てルールで税別¥91円の10%消費税額を計算。消費税額¥9

ここでのVBA設計では、ユーザーフォームの「小数点以下計算ルール」で「切り上げ」「切り捨て」を選択した場合、自動的に、リバース計算時には切り捨てと切り上げの逆転計算が行われるようになっています。

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

商品代を税別金額で揃えるのまとめ

invoice3tenzeibetup003

適格請求書を作成するときには、一旦、商品価格を税別に戻して、全体を消費税別に振り分けて、税別合計を出して、そこから消費税額を計算して、というステップが必ず必要になります。

そのプロセスの中で、今回のVBA作成は非常に重要な部分になっています。

計算種類(変数種類も)多くなっていますので、頭を整理しながらコードを読んでみてください。

エクセルVBAを独習するのに参考書は欠かせません。 参考書選びは自分に合った「相棒」にできるものを選んでいきたいです。

vbastudyeyecatch2 エクセルVBAの独習でおすすめ参考書を7冊選ぶ。良書との出会いは大切です

今回の記事はここまでです。   最後までご覧いただき有難うございました。

エクセルVBA最速理解で必要な知識を集めよう!

エクセルVBA業務ツールで日常の業務改善を行いましょう。

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

アンケートでポイ活しよう!!

アンケートに答えれば答えるほど ”使える” ポイントがたまります。

NTTコム サーチ

af_banner01

Dstyle web

dstyleweb_logo
dstyle_320x50-min