一覧からデータを選択移転するVBA インボイス領収書作成2

invorecipmoveeyecatch

エクセルVBAを使って、データ一覧の中から指定して、インボイス領収書にデータを記入できるようにします。また消費税金額計算はボタンクリックで計算できるようにします。

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

今回の作業は、先回作成したインボイス領収書のテンプレートに、金額データ等を記入していきます。

記入するデータは「発行データ入力」シートに一覧表形式で作成しておきます。

領収書を作成するデータの有る行のいずれかのセルを選択すれば、領収書に記入するデータが指定されるようにします。

データ一覧(発行データ入力表)の作成

invorecipmovep009

インボイス領収書に表示する金額などを入力する一覧表を「発行データ入力」シートに作成します。

入力項目欄の作成と、消費税の金額計算をするVBAも作成します。

一覧の項目表示と税計算のVBA

今回作成するすべてのVBAコードは、Module1に記述しています。

パブリック変数の設置

あとで作成するユーザーフォームから入手する変数化したデータを利用するために、パブリック変数として設定します。

VBA
Option Explicit

    Public STA, STO As Long
    Public Arow, Orow As Variant
    Public ErrNo As Long
    Public Gen, Nen, Tuk, Nit As String

一覧の先頭行の項目を表示

一覧の見出し行を作成します。

ほぼ1回限りの使用コードになるかと思いますが、手作業作成も面倒なので、コードを作っています。

このVBA(列項目プロシージャー)の起動は「Alt + F8」でマクロウインドウから実行してください。起動ボタンの設定は行いません。

この見出し行の一部の項目上には、コマンドボタンも乗せることになります。

また、データ行数が増えると、スクロールによって見出し行(コマンドボタンも)が消えてしまいますので、ウインドウ枠固定を行っておきます。

VBA
Sub 列項目()
        With Worksheets("発行データ入力")
            Range("A1") = "伝票番号"
            Range("B1") = "作成年月日"
            Range("C1") = "宛先1"
            Range("D1") = "宛先2"
            Range("E1") = "税込総計金額"
            Range("F1") = "10%税別金額"
            Range("G1") = "10%消費税金額"
            Range("H1") = "8%税別金額"
            Range("I1") = "8%消費税金額"
            Range("J1") = "非課税金額"
            Range("K1") = "発行済"
            Range("L1") = "但し書き"
            Range("M1") = "チェック欄"
            With .Range("A1:M1")
                .Font.Size = 11
                .Font.Name = "MS 明朝"
                .Font.Bold = True
                .HorizontalAlignment = xlCenter
                .Interior.ColorIndex = 15
            End With
            Range("A2").Select
            ActiveWindow.FreezePanes = True
        End With
End Sub

消費税額計算と総額計算

インボイス領収書では、各税率で「課税対象金額」と「消費税額」を明示しなければいけません。

従来の「税込価格」と「内消費税額」では認められません。

なので、領収書を1枚発行するのに、税率別計算と総計計算 最大3回計算しなければなりません。

ここはサクッとVBA自動計算で行います。(小数点以下計算は四捨五入で行います。)

VBA
Sub 税込総額計算()
        Worksheets("発行データ入力").Select
            Cells(ActiveCell.Row, 5) = WorksheetFunction.Sum _
            (Range(Cells(ActiveCell.Row, 6), Cells(ActiveCell.Row, 11)))
End Sub
VBA
Sub 消費税計算10()
        Worksheets("発行データ入力").Select
            Cells(ActiveCell.Row, 7) = WorksheetFunction.Round _
                                    (Cells(ActiveCell.Row, 6) * 0.1, 0)
End Sub
VBA
Sub 消費税計算8()
        Worksheets("発行データ入力").Select
            Cells(ActiveCell.Row, 9) = WorksheetFunction.Round _
                                    (Cells(ActiveCell.Row, 8) * 0.08, 0)
End Sub

発行データシートへのコマンドボタン設置

消費税額計算と総額計算のコードを実行するコマンドボタンを、発行データシートの見出し行に設置します。

invorecipmovep001
矢印下001
invorecipmovep002

コマンドボタンの設置方法については次の記事を参考にしてください。

コマンドボタンをシートに設置する2つの方法

ここで設置したコマンドボタンは、ActiveXコントロールのタイプで行いました。

VBEでシートモジュール Sheet2(発行データ入力)に以下のVBAコード記述を行います。

VBA
Option Explicit

Private Sub 消費税金額10_Click()
        Call Module1.消費税計算10
        消費税金額10.TakeFocusOnClick = False
End Sub

Private Sub 消費税金額8_Click()
        Call Module1.消費税計算8
        消費税金額8.TakeFocusOnClick = False
End Sub

Private Sub 税込総計額_Click()
        Call Module1.税込総額計算
        税込総計額.TakeFocusOnClick = False
End Sub

それそれのコマンドボタンのプロパティウインドウにおいては、次のように設定します。

invorecipmovep003
invorecipmovep004
invorecipmovep005

領収書へデータ移転させるVBA

発行データ入力表のデータをインボイス領収書のテンプレートに転記します。

転記データの指定は、転記したいデータ行のいずれかのセルをアクティブにすることで可能になります。

領収金額は、桁区切りをつけて表記して、数字1文字を1セルにはめていきます。

異なる税率が適用された場合は、自動的に「但し書き」にその旨が表示されます。

VBA
Sub インボイス領収書作成()
    Dim aR, aN As Long
    Dim aDay, aCusa, aCusb As String
    Dim aBill, aTAXa, aTAXb As Long
    Dim aBILLa, aBILLb, aBILLc As Long
    Dim aNote As String
    Dim anum, anum1, anum2 As Integer
    Dim x, y, P, Z, i, j, s, t As Long
    Dim aBilln As String
        With Worksheets("発行データ入力")
            .Select
            aR = ActiveCell.Row
            If Nen = "" Then Nen = "  "
            If Tuk = "" Then Tuk = "  "
            If Nit = "" Then Nit = "  "
            .Range("B" & aR).Value = _
                            Gen & Nen & "年" & Tuk & "月" & Nit & "日"
            .Range("K" & aR).Value = "済"
'データを変数に代入
    '伝票番号
            aN = .Range("A" & aR).Value
    '作成年月日
            aDay = .Range("B" & aR).Value
    '宛先1
            aCusa = .Range("C" & aR).Value
    '宛先2
            aCusb = .Range("D" & aR).Value
    '税込領収金額
            aBill = .Range("E" & aR).Value
    '10%税別金額
            aBILLa = .Range("F" & aR).Value
    '10%消費税額
            aTAXa = .Range("G" & aR).Value
    '8%税別金額
            aBILLb = .Range("H" & aR).Value
    '8%消費税額
            aTAXb = .Range("I" & aR).Value
    '非課税金額
            aBILLc = .Range("J" & aR).Value
    '但し書き
            aNote = .Range("L" & aR).Value
         End With
        anum1 = Len(CStr(aBill))
        x = anum1 \ 3
        y = anum1 Mod 3
        If y <> 0 Then
            P = x + 1
        Else
            P = x
        End If
    Dim myBOX(5) As String
        If anum1 = 3 Or anum1 = 2 Or anum1 = 1 Then
            aBilln = CStr(aBill)
        Else
            For t = 0 To P - 1
                If y <> 0 Then
                    If t = 0 And y <> 0 Then
                        myBOX(0) = Mid(aBill, 1, y)
                    Else
                        myBOX(t) = Mid(aBill, y + 3 * (t - 1) + 1, 3)
                    End If
                Else
                    If t = 0 Then
                        myBOX(0) = Mid(aBill, 1, 3)
                    Else
                        myBOX(t) = Mid(aBill, y + 3 * t + 1, 3)
                    End If
                End If
            Next t
            aBilln = Join(myBOX, ",")
        End If
        anum2 = Len(aBilln)
        With Worksheets("インボイス領収書")
            .Select
            .Range("T2,T26") = aN
            .Range("R4,R28") = aDay
            .Range("C6,C30") = aCusa
            .Range("C7,C31") = aCusb
            For s = 0 To 15
                .Cells(10, s + 5).Value = ""
                .Cells(32, s + 5).Value = ""
            Next s
            .Range("E10") = "¥"
            .Range("E34") = "¥"
            For i = 1 To anum2
                .Cells(10, 5 + i).Value = Mid(aBilln, i, 1)
                .Cells(34, 5 + i).Value = Mid(aBilln, i, 1)
            Next i
            If y <> 0 Then
                Z = y + 3 * (P - 1) + 1 + P - 1
            Else
                Z = y + 3 * (P - 1) + 1 + 3 + P - 1
            End If
            .Cells(10, Z + 5).Value = "-"
            .Cells(34, Z + 5).Value = "-"
            For j = Z + 6 To 20
                .Cells(10, j).Value = ""
                .Cells(34, j).Value = ""
            Next j
            If aTAXa = 0 And aBILLa = 0 Then
                .Range("G18:G19,G42:G43") = " - 円"
            ElseIf aTAXa > 0 Then
                .Range("G18,G42") = aBILLa & "円"
                .Range("G19,G43") = aTAXa & "円"
            End If
            If aTAXb = 0 And aBILLb = 0 Then
                .Range("G20:G21,G44:G45") = " - 円"
            ElseIf aTAXb > 0 Then
                .Range("G20,G44") = aBILLb & "円"
                .Range("G21,G45") = aTAXb & "円"
            End If
            If aBILLc = 0 Then
                .Range("G22:G23,G46:G47") = " - 円"
            ElseIf aBILLc > 0 Then
                .Range("G22,G46") = aBILLc & "円"
                .Range("G23,G47") = " - 円"
            End If
            .Range("F13,F37") = aNote
            .Range("F14,F38") = ""
            If aBILLb > 0 And aBILLc > 0 Then
                .Range("F14,F38") = "軽減税率8%と非課税の商品代金が" & _
                                                        "含まれています。"
            ElseIf aBILLb > 0 Then
                .Range("F14,F38") = "軽減税率8%の商品代金が含まれています。"
            ElseIf aBILLc > 0 Then
                .Range("F14,F38") = "非課税の商品代金が含まれています。"
            End If
        End With
End Sub

まとめ

invorecipmovep010

今回は発行データ入力表の作成と、領収書テンプレートへの転記について説明をしました。

今回行った作業での実行結果イメージはこのような感じになります。

invorecipmovep006
invorecipmovep008

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

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

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

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

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

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

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

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

NTTコム サーチ

af_banner01

Dstyle web

dstyleweb_logo
dstyle_320x50-min