VBAコードだけで見積・納品・請求書テンプレートを作成

invoice3tentempeyecatch

エクセルVBAコードだけで、見積書・納品書・請求書のテンプレートを作成します。

適格請求書の様式に対応しています。
VBAですので、壊しても簡単に再生することが出来ます。

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

インボイス見積納品請求伝票日付版で、見積書・納品書・請求書のテンプレートを作成します。

テンプレートは、白紙のシートから作るのではなく、VBAコード記述のみで作成します。

1ページ分のテンプレートですが、このままプリントアウトして手書きでも利用いただけます。

もちろん手打ち入力で紙化やPDF化を行うことも可能です。

なお、プログラム本体でのテンプレートについては、今から作る固定化したテンプレートそのものを利用するのではなく、その時々のデータ行数にも対応できるように、変更した形でVBAコードを作成しています。

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

完成形のテンプレート

invoice3tentempp04

完成したテンプレートはこのようになります。

それぞれの帳票にはインボイス登録番号が表示されます。

帳票下段には、消費税率毎の税別合計と各消費税額の集計欄を設置されます。

また、商品の入力可能行数は22行です。

請求書

請求書の場合は、振込先銀行名と口座番号が表示されます。

invoice3tentempp01

納品書

invoice3tentempp02

見積書

invoice3tentempp03

テンプレートを作成するVBA

invoice3tentempp05

VBAコードだけでテンプレートを作成するメリットは、

同じテンプレートを何回でも作成でき、シート上のテンプレートにどのような加工をしてもOKです。コードの再実行で、元通りのテンプレートに復旧することが出来ます。

今回作成する、テンプレートコードは、テンプレ様式を作成する記述だけで、セルにデータ入力した時の金額計算等の処理コードは含まれていません。

データ処理については、別記事での紹介になります。

作成のためのすべてのVBAコード

以下のコードを実行することで、同一フォーマットで、インボイス対応の「見積書」「納品書」「請求書」が作成されます。

記述する場所は、VBEの標準モジュール(例えばModule1など)になります。

コピペすることも出来ます。使い方の参考記事はこちら↓です。

vbacopipeeyecatch Webで見つけたマクロをコピペで使う
VBA
Option Explicit
Public MRK As Integer

Sub テンプレ作成2()
    Dim a, i, s As Long
    Dim Dtitle, Vinfo As String
        ThisWorkbook.Activate
        For a = 2 To 4
            With Worksheets(a)
                .Select
'一旦初期化
                With .Cells
                    .ClearFormats
                    .ClearContents
                    .UseStandardHeight = True
                    .UseStandardWidth = True
                End With
                .DrawingObjects.Delete
                With .PageSetup
                    .PrintArea = False
                    .PrintTitleRows = False
                    .RightHeader = ""
                    .CenterFooter = ""
                End With
'行高さ設定
                .Rows.RowHeight = 24
                .Rows("1:12").RowHeight = 19.5
                .Rows(1).RowHeight = 29.25
                .Rows(2).RowHeight = 9
                .Rows(4).RowHeight = 7.5
                .Rows("7:10").RowHeight = 15.75
                .Rows(11).RowHeight = 15.75
                .Rows(12).RowHeight = 7.5
                .Rows("13:14").RowHeight = 15.75
'列幅の設定
                .Columns("A").ColumnWidth = 3.5
                .Columns("B").ColumnWidth = 7.25
                .Columns("C").ColumnWidth = 27.63
                .Columns("D").ColumnWidth = 9.13
                .Columns("E").ColumnWidth = 6.63
                .Columns("F").ColumnWidth = 6
                .Columns("G").ColumnWidth = 4.75
                .Columns("H").ColumnWidth = 13.5
                .Columns("I").ColumnWidth = 7.5
'セルの結合
                .Range("C1:D1").Merge
                .Range("H1:I2").Merge
                .Range("H3:I3").Merge
                .Range("B4:C5").Merge
                .Range("B6:C7").Merge
                .Range("B9:C10").Merge
                .Range("B11:C11").Merge
                .Range("B12:C13").Merge
                .Range("D11:E11").Merge
                .Range("D12:E13").Merge
                For i = 15 To 40
                    .Range(.Cells(i, 6), Cells(i, 7)).Merge
                Next i
'罫線の設定
                .Range("B6:C7").Borders(xlEdgeBottom).LineStyle _
                            = xlContinuous
                With .Range("B11:E13").Borders
                    .LineStyle = xlDot
                    .Weight = xlHairline
                End With
                With .Range("B11:E11")
                    .Interior.Color = RGB(211, 211, 211)
                    .Font.Size = 12
                    .Font.Bold = True
                End With
                With .Range("B13:E13").Borders(xlEdgeBottom)
                    .LineStyle = xlDouble
                    .Weight = xlMedium
                End With
                .Range("A15:I40").Borders.LineStyle = xlContinuous
                .Range("B38:H40").BorderAround LineStyle:= _
                            xlContinuous, Weight:=xlMedium
'日付の表記
                With .Range("H1")
                    .Font.Size = 10
                    .Value = "令和  年  月  日"
                End With
'合計欄の作成
                With .Range("B11")
                    .Value = "税込合計金額"
                    .Font.Size = 10
                    .VerticalAlignment = xlBottom
                End With
                With .Range("D11")
                    .Value = "内消費税額"
                    .Font.Size = 10
                    .VerticalAlignment = xlBottom
                End With
'項目の入力
                .Range("A15") = "No."
                .Range("B15") = "日付"
                .Range("C15") = "品名"
                .Range("D15") = "数量"
                .Range("E15") = "単位"
                .Range("F15") = "単価"
                .Range("H15") = "税別金額"
                .Range("I15") = "税率"
                .Rows(15).Font.Size = 11
                With .Range("C1")
                    .Font.Size = 18
                    .HorizontalAlignment = xlRight
                End With
'印刷余白の設定
                With .PageSetup
                    .TopMargin = Application _
                                        .CentimetersToPoints(1.5)
                    .LeftMargin = Application _
                                        .CentimetersToPoints(2)
                    .RightMargin = Application _
                                        .CentimetersToPoints(1)
                    .BottomMargin = Application _
                                        .CentimetersToPoints(1)
                    .HeaderMargin = Application _
                                        .CentimetersToPoints(0.5)
                    .FooterMargin = Application _
                                        .CentimetersToPoints(0.5)
                End With
'自社の表示設定
                With .Range("G5")
                    .Value = Worksheets("電子印鑑の登録").Range("B2")
                    .Font.Size = 14
                End With
                With .Range("H6")
                    .Value = Worksheets("電子印鑑の登録").Range("B3")
                    .Font.Size = 12
                End With
                With .Range("G7")
                    .Value = Worksheets("電子印鑑の登録").Range("B5")
                    .Font.Size = 10
                End With
                With .Range("G8")
                    .Value = Worksheets("電子印鑑の登録").Range("B6")
                    .Font.Size = 10
                End With
                With .Range("G9")
                    .Value = Worksheets("電子印鑑の登録").Range("B7")
                    .Font.Size = 10
                End With
                With .Range("G10")
                    .Value = Worksheets("電子印鑑の登録").Range("B8")
                    .Font.Size = 10
                End With
                With .Range("G11")
                    .Value = Worksheets("電子印鑑の登録").Range("B9")
                    .Font.Size = 10
                End With
                With .Range("G13")
                    .Value = "登録番号" & ":" & _
                            Worksheets("電子印鑑の登録").Range("B10")
                    .Font.Size = 10
                    .VerticalAlignment = xlTop
                End With
                If インボイス3点操作パネル.CheckBox2 = True Then
                    Worksheets("電子印鑑の登録").Range("B13") _
                                .Copy Worksheets(a).Range("H5")
                    Worksheets(a).Range("H5").ClearFormats
                End If
'相手先文字ほか表示
                With .Range("B4")
                    .VerticalAlignment = xlTop
                    .WrapText = True
                    .Font.Size = 10
                End With
                With .Range("B6")
                    .WrapText = True
                    .Font.Size = 13
                    .Font.Bold = True
                End With
                With .Range("B12")
                    .HorizontalAlignment = xlCenter
                    .Font.Size = 21
                    .NumberFormatLocal = "\ #,##0"
                End With
                With .Range("D12")
                    .HorizontalAlignment = xlCenter
                    .Font.Size = 18
                    .NumberFormatLocal = "\ #,##0"
                End With
'帳票別設定
                If a = 2 Then
                    Dtitle = "請 求 書"
                    Vinfo = "下記の通り請求申し上げます。"
                    With .Range(.Cells(14, 6), .Cells(14, 9))
                        .Merge
                        .Value = Worksheets("電子印鑑の登録") _
                                    .Range("B11")
                        .ShrinkToFit = True
                        .Font.Size = 9
                        .VerticalAlignment = xlTop
                    End With
                ElseIf a = 3 Then
                    Dtitle = "納 品 書"
                    Vinfo = "下記の通り納品申し上げます。"
                Else
                    Dtitle = "見 積 書"
                    Vinfo = "下記の通り見積申し上げます。"
                End If
                With .Range("C1")
                    .Value = Dtitle
                End With
                With .Range("B9")
                    .Value = Vinfo
                    .Font.Size = 10
                End With
'合計欄の設定
                With .Range(.Cells(38, 2), .Cells(40, 2))
                    .Merge
                    .Value = "税抜き合計"
                    .WrapText = True
                    .Font.Bold = True
                    .HorizontalAlignment = xlCenter
                    .VerticalAlignment = xlCenter
                End With
                For s = 38 To 40
                    With .Cells(s, 3)
                        .Font.Bold = True
                        If s = 38 Then .Value = "10%対象合計"
                        If s = 39 Then .Value = "8%対象合計"
                        If s = 40 Then .Value = "非課税対象合計"
                    End With
                    With .Range(.Cells(s, 4), .Cells(s, 5))
                        .Merge
                        .NumberFormatLocal = "¥#,##0;[赤]-¥#,##0"
                        .Font.Bold = True
                    End With
                    
                    With .Cells(s, 6)
                        .Value = "消費税額"
                        .Font.Bold = True
                    End With
                    With .Cells(s, 8)
                        .NumberFormatLocal = "¥#,##0;[赤]-¥#,##0"
                        .Font.Bold = True
                    End With
                Next s
            End With
        Next a
        Worksheets("請求書").Select
        If MRK = 1 Then
        MsgBox "3点伝票テンプレートの作成が完了しました。", vbInformation, _
                    "インボイス見積納品請求3点日付版作成"
        End If
End Sub

それぞれの処理コードの説明

各処理のコードを簡単に説明して行きます。

モジュールの先頭(変数の宣言)

Option Explicit
Public MRK As Integer

Option Explicit

「Option Explicit」については、こちらの記事を参考にしてください。

vbaopexplieyecatch Option Explicitとは何、必要? VBA記述で不注意なエラーを防止する

変数MRK

変数MRKをパブリック変数として宣言しています。

変数MRKは、「何処のルートからの実行命令か?」によって、ユーザーに表示するメッセージを区別するための指標として使用しています。

vbasengeneyecatch 宣言方法で変数の適用範囲を変える エクセルVBA

プロシージャーの先頭

    Dim a, i, s As Long
    Dim Dtitle, Vinfo As String
        ThisWorkbook.Activate
        For a = 2 To 4
            With Worksheets(a)
                .Select

Dim ~ As ~

プロシージャー内で有効な変数を宣言しています。

For a = 2 To 4

「見積書」「納品書」「請求書」シートに対して、シートのインデックス番号を使って、同じ操作をループして実行していきます。

一旦初期化

With .Cells

ワークシートの全セルに対して値、書式設定を消去した上でセルの行高さと列幅をデフォルトの状態に戻します。

.DrawingObjects.Delete

シート上の描画を削除します。(オブジェクトはワークシートになります。)

With .PageSetup

印刷範囲をクリアし、プリントタイトルを無効にし、ヘッダー・フッターの内容を消去します。

行高さ設定、列幅の設定、セルの結合

セルのサイズを設定しています。

罫線の設定

明細表、合計欄などの罫線表示を規定しています。

罫線の使い方についてはこちらを参考にしてください。

vbacellsbordereyecatch 「罫線」のVBAを最速理解 vbaborder1eyecatch Bordersの/位置/線種/太さ/色/と<外枠だけの罫線>の設置

日付の表記、合計欄の作成、項目の入力

それぞれの見出しセルに入力項目を当てはめています。

印刷余白の設定

With .PageSetup
    .TopMargin = Application _
                        .CentimetersToPoints(1.5)
・・・・
End With

「With PageSetup・・・End With」の中で、4方向の余白を設定しています。

「Application .CentimetersToPoints(1.5)」は、1.5cmの余白を取得するというコードになります。

自社の表示設定

「電子印鑑の登録」シートに保存された自社情報から表示データを取得しています。

 If インボイス3点操作パネル.CheckBox2 = True Then
・・・

とは、

ユーザーフォームの「電子印鑑 押印する」チェックボックスがチェックされている場合は・・・という意味になります。

相手先文字ほか表示

文字の表示設定、書式設定を行っています。

参考記事としてこちらをご覧ください。

vbacellssyoshikieyecatch 「表示形式」をVBAコード的に最速理解する vbacellsplacementeyecatch 「配置」を最速理解する エクセルVBA

帳票別設定

「見積書」「納品書」「請求書」毎に表示が異なる部分を指定しています。

合計欄の設定

作成する帳票の一番下の部分に、消費税別にそれぞれの合計金額と消費税額計を表示するようにしています。

適格請求書の作成規定に準じた部分になります。

If MRK = 1 Then

「MRK=1」とは、ユーザーフォームで「テンプレ作成」ボタンをクリックした時にMRKに1が代入されるようにしています。

つまり「テンプレ作成」ボタンをクリックしてこのプロシージャーを実行した場合に、条件合致で、以下記述のメッセージが表示されるという仕組みになっています。

VBAコードでテンプレート作成のまとめ

invoice3tentempp06

VBAコードだけで作るインボイス対応の「見積書」「納品書」「請求書」のテンプレート作成を紹介しました。

「インボイス見積納品請求伝票日付版作成ソフト」を構成する一部分のプログラムではありますが、この記事部分だけを取り出して、利用いただくことも可能です。

多少のVBAの知識は必要ですが、

commandbuttoneyecatch マクロの実行を1クリックで!フローティングボタンをユーザーフォームで作る

を利用して独立した実行ボタンにプロシージャーを関連付けて使用することも可能です。

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

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

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

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

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

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