エクセルVBA業務ツール 物品購入申請書テンプレートをつくる

buppinsinseieyecatch

エクセルVBA で物品購入申請書 のテンプレートを作ります。
VBAで作るテンプレートは、エクセルシート管理のものとは運用面でも結構自由度が変わります。

違いを知ってみてください。

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

業務の中で非常によく使うものに「書類作成のテンプレート」があります。

エクセルシートで作られたテンプレートをコピーして、繰り返し使うことが多いですよね。

今回はエクセルVBAを使って、「書類のテンプレート」を作っていきます。

「プチなVBAコード」の記事一覧

「エクセルVBA最速理解」の記事一覧

物品購入申請書テンプレートをVBAで作る

書類作成のテンプレートは普通、エクセルシートにひな形を作り、それを大切に保管して使用しているでしょう。

中には、テンプレートの記入部のセルの中には関数式がぎっしり埋め込まれたテンプレートもあるでしょう。

”関数式でぎっしり” パターンは、エクセルVBAでは、たくさん計算させるコードを作成する必要があるかもですので、そういった専用のテンプレートは、エクセルVBAとしては一番得意な部分ではあります。

今回は、そういった、二筋三筋縄が必要かもしれないテンプレートではなく、汎用性のあるものを作ります。

手入力可能な文章や計算が中心の書類作成テンプレート「物品購入申請書テンプレート」をエクセルVBAで簡単作成します

buppinshinsei003
完成形の物品購入申請書テンプレート

テンプレートをVBAで作るメリットとデメリット

VBAで作られた「書式のテンプレート」を使う側から見た時には、普通に、メリットとデメリットがあります。

まず、先にそれを明確にしておきます。メリット、デメリットは足し算引き算ですので、「ご自分の判断は如何に」ということになります。

メリット
  • テンプレートを入手するために、掲示サイトからダウンロードする必要がない。A4用紙1枚ほどのテンプレートなら掲示サイトのVBAコードをコピーペーストで入手可能
  • 何回でも原紙を生成できるので、作成されたテンプレートを最初に原紙としてそのまま保存する必要がない。
  • 原紙保存を気にせず、作成されたテンプレートに直接記入加工修正して使用することが出来る。
  • テンプレートのエクセルファイルとして保管できるだけではなく、エクセルのデータファイルの中にテンプレート作成VBAを埋め込むことで、データとテンプレートの一括ファイル管理が可能になる。
  • VBAプログラムコードだけなら、軽量のテキストファイルで保存可能
  • さらにVBAを利用すればテンプレート作成だけでなく、データリンク(別エクセルファイルからも)入力も行える。
デメリット
  • プログラム言語アレルギーのある人には多少なりとも厳しいかも(?)
  • 最初のVBAコードのコピーペーストが出来れば、後は放置で利用できますが、名称や見出し項目変更をデフォルトで行いたい時は、ごく簡単ですがVBAコードをいじる必要がある。
  • エクセルVBA入門程度の知識はあった方が良い。

作成されたテンプレートの表示方法

物品購入申請書テンプレートの完成形を表示するのは、このようにします。

  • 「物品購入申請書テンプレートの全VBAコード」をVBEで標準モジュールにペーストする。(写真では、Module1にペーストしています。)
矢印下001
  • 「Alt+F8」クリック でマクロの表示を呼び出し「物品購入申請Temp」を実行する
矢印下001
  • 物品購入申請書が作成されます。メッセージボックスでOKクリックで使用できます。

テンプレート作成の全VBAコード

物品購入申請書テンプレートの全VBAコードです。

vbacopipeeyecatch エクセルVBA基礎知識 Webで見つけたマクロをコピペで使う

このコードをコピーペーストで標準モジュールに張り付けてコードを実行すれば、新規シートでテンプレートが作成されます。

物品購入申請書VBAコード
Option Explicit
Sub 物品購入申請Temp()
    Dim s As Long
    Dim MbBn As Long
        For s = 1 To Worksheets.Count
            If Worksheets(s).Name = "物品購入申請書" Then
                MbBn = MsgBox("テンプレートシートは存在します。" & vbCrLf & _
                "今あるテンプレートシートをリネームしてください。" & vbCrLf & _
                "リネームするなら「はい」、上書きするなら「いいえ」を選択してください。" _
                , vbYesNo + vbExclamation, "入力問合せ")
                Exit For
            End If
        Next s
        If MbBn = vbYes Then
            Exit Sub
        ElseIf MbBn = vbNo Then
            Call シートクリアA
        Else
            Call テンプレシート挿入A
        End If
        Call ページ設定A
        Call セルサイズA
        Call セルの書式設定A
        Call セル入力項目A
        Call 罫線A
        Range("A1").Select
        MsgBox "テンプレートを作成しました。"
End Sub

Sub シートクリアA()
        With Worksheets("物品購入申請書").Cells
            .Clear
            .UseStandardHeight = True
            .UseStandardWidth = True
        '    .DrawingObjects.Delete  'データ印等をクリアするときに
        End With
End Sub

Sub テンプレシート挿入A()
        ThisWorkbook.Worksheets.Add(before:=Worksheets(1)).Name = "物品購入申請書"
End Sub

Sub ページ設定A()
'余白
        With ActiveSheet.PageSetup
            .PaperSize = xlPaperA4
            .Orientation = xlPortrait
            .LeftMargin = Application.CentimetersToPoints(2)
            .RightMargin = Application.CentimetersToPoints(0.5)
            .TopMargin = Application.CentimetersToPoints(2)
            .BottomMargin = Application.CentimetersToPoints(1.5)
        End With
'フォント
        With Cells.Font
                .Name = "メイリオ"
                .Size = 12
        End With
End Sub

Sub セルサイズA()
    Dim i, n As Integer
        With Cells
            .RowHeight = 18.75
            .Columns(1).ColumnWidth = 6.25
            Union(.Columns(8), .Columns("J:K")).ColumnWidth = 3.88
        End With
        With Range("A1:L43")
            Union(.Rows(3), .Rows(9)).Merge
        End With
        For i = 1 To 39
            If i = 1 Or i > 5 And i < 8 Then
                Range(Cells(i, 10), Cells(i, 12)).Merge
            ElseIf i > 10 And i < 22 Then
                Range(Cells(i, 2), Cells(i, 4)).Merge
                Range(Cells(i, 6), Cells(i, 7)).Merge
                Range(Cells(i, 8), Cells(i, 10)).Merge
                Range(Cells(i, 11), Cells(i, 12)).Merge
                If i = 11 Then Range("A11:K11").Interior.ColorIndex = 15
            ElseIf i = 22 Then
                Range(Cells(i, 2), Cells(i, 4)).Merge
                Range(Cells(i, 8), Cells(i, 10)).Merge
            ElseIf i = 25 Then
                Range(Cells(i, 1), Cells(i + 5, 2)).Merge
                Range(Cells(i, 3), Cells(i + 5, 12)).Merge
            ElseIf i = 31 Then
                Range(Cells(i, 1), Cells(i + 1, 2)).Merge
                Range(Cells(i, 3), Cells(i + 1, 12)).Merge
            ElseIf i > 32 And i < 38 Then
                Range(Cells(i, 3), Cells(i, 12)).Merge
                If i = 33 Then Range(Cells(i, 1), Cells(i + 4, 2)).Merge
            ElseIf i = 39 Then
                For n = 0 To 4 Step 2
                    Range(Cells(i, 7 + n), Cells(i, 8 + n)).Merge
                    Range(Cells(i + 1, 7 + n), Cells(i + 4, 8 + n)).Merge
                Next n
            End If
        Next i
End Sub

Sub セルの書式設定A()
        With Range("J1")
            .NumberFormatLocal = "ggge年mm月dd日"
            .Font.Size = 11
        End With
        With Range("A3")
            .HorizontalAlignment = xlCenter
            .Font.Bold = True
            .Font.Size = 15
        End With
        Union(Range("A11"), Range("B11"), Range("E11"), Range("F11"), _
        Range("H11"), Range("K11"), Range("B22")).Select
        With Selection
            .HorizontalAlignment = xlCenter
            .Font.Bold = True
        End With
End Sub

Sub セル入力項目A()
        Range("J1") = Date
        Range("A3") = "物品購入申請書"
        Range("A5") = "■■部長 ○○ ○○ 様"
        Range("J6") = "外商部販売2課"
        Range("J7") = "○○ ○○"
        Range("A9") = "下記の通り物品購入を申請致します。"
        Range("A11") = "NO"
        Range("B11") = "品番・品名"
        Range("E11") = "数量"
        Range("F11") = "単価"
        Range("H11") = "予定金額"
        Range("K11") = "予定購入先"
        Range("B22") = "合計"
        Range("H22") = "=Sum(H12:H21)"
        Range("A25") = "申請理由"
        Range("A31") = "購入予定日"
        Range("A33") = "参考資料"
        Range("B33") = "申請理由を補強するデータ資料"
        Range("B34") = "購入見積書"
        Range("B35") = "商品カタログ"
        Range("G39") = "○○"
        Range("I39") = "○○"
        Range("K39") = "○○"
End Sub

Sub 罫線A()
        Union(Range("A11:L21"), Range("A25:L30"), Range("A31:L32"), _
        Range("A33:L37"), Range("G39:L43")).Select
        With Selection
            .Borders.LineStyle = xlContinuous
            .BorderAround LineStyle:=xlContinuous, Weight:=xlMedium
        End With
        Range("H22").Borders.LineStyle = xlContinuous
        Range("B22:J22").BorderAround LineStyle:=xlContinuous, Weight:=xlMedium
End Sub

物品購入申請書のVBAコードを個別解説

「物品購入申請Temp」プロシージャー

物品購入申請Tempの先頭部分
Sub 物品購入申請Temp()
    Dim s As Long
    Dim MbBn As Long
        For s = 1 To Worksheets.Count
            If Worksheets(s).Name = "物品購入申請書" Then
                MbBn = MsgBox("テンプレートシートは存在します。" & vbCrLf & _
                "今あるテンプレートシートをリネームしてください。" & vbCrLf & _
                "リネームするなら「はい」、上書きするなら「いいえ」を選択してください。" _
                , vbYesNo + vbExclamation, "入力問合せ")
                Exit For
            End If
        Next s
        If MbBn = vbYes Then
            Exit Sub
        ElseIf MbBn = vbNo Then
            Call シートクリアA
        Else
            Call テンプレシート挿入A
        End If

この物品購入申請書テンプレートのプログラムは、プログラムを移植したエクセルBOOK内に「物品購入申請書」シートを新規で作成します。

2回目以降のプログラム使用で、すでに「物品購入申請書」シートが作成されていれば、それを検知することが出来ます。

  1. 前回作成されたものを残すのなら「シートをリネームする」
  2. 前回作成されたものを残さないなら「内容を上書きする(内容をクリアして新たに白紙を作る)」

かの、どちらかを選択するように促します。

メッセージボックスで「はい」「いいえ」で選択します。

vbamsgboxeyecatch メッセージボックス MsgBox実際の使い方を最速に理解

その条件分岐に沿って、「Callステートメント」で部品プロシージャーを呼び出します。

vbacalleyecatch エクセルVBA基礎知識 部品化プロシージャーでCallステートメントは必須 vbaifjyokeneyecatch 「If条件文」のVBAコードの組み方。条件の絞り方を最速に理解。

「シートクリアA」プロシージャー

シートクリアAの一部
        '    .DrawingObjects.Delete  'データ印等をクリアするときに

日付印やデータ印、商品写真などの画像系を挿入したときは、

このVBAコードを有効にします。

コメントアウト(シングルクォーテーションを消す)ことでコードが有効になります。

vbacleareyecatch シートの操作 クリアーを目的のメソッド別にVBA最速理解

「テンプレート挿入A」プロシージャー

テンプレート挿入A
        ThisWorkbook.Worksheets.Add(before:=Worksheets(1)).Name = "物品購入申請書

このプログラムを埋め込んだエクセルBOOKの1番目のワークシートの左に「物品購入申請書」シートを作成し挿入します。

「ページ設定A」プロシージャー

ページ設定Aの一部
'余白
        With ActiveSheet.PageSetup
            .PaperSize = xlPaperA4
            .Orientation = xlPortrait
            .LeftMargin = Application.CentimetersToPoints(2)
            .RightMargin = Application.CentimetersToPoints(0.5)
            .TopMargin = Application.CentimetersToPoints(2)
            .BottomMargin = Application.CentimetersToPoints(1.5)
        End With

印刷時の上下左右の余白設定を行います。これで1ページでの印刷範囲内に収まるセル範囲を確定させます。

また、

使用フォントを「メイリオ」サイズを12にセットしています。この部分を変更することで、フォントや文字サイズを変更できます。

vbawithstateeyecatch With~End Withの使い方。VBAコードを簡潔に記述する

「セルサイズA」プロシージャー

セルサイズAの一部
        With Cells
            .RowHeight = 18.75
            .Columns(1).ColumnWidth = 6.25
            Union(.Columns(8), .Columns("J:K")).ColumnWidth = 3.88
        End With
        With Range("A1:L43")
            Union(.Rows(3), .Rows(9)).Merge
        End With

行と列のサイズと結合を行います。

1行、1列ごとに行うのではなく「Unionメソッド」で一括処理を行っています。

vbaunioneyecatch セルの範囲選択 UnionとRangeの一括選択の働きを比較
セルサイズAの一部
        For i = 1 To 39
            If i = 1 Or i > 5 And i < 8 Then
                Range(Cells(i, 10), Cells(i, 12)).Merge
            ElseIf i > 10 And i < 22 Then
                Range(Cells(i, 2), Cells(i, 4)).Merge
                Range(Cells(i, 6), Cells(i, 7)).Merge
                Range(Cells(i, 8), Cells(i, 10)).Merge
                Range(Cells(i, 11), Cells(i, 12)).Merge
                If i = 11 Then Range("A11:K11").Interior.ColorIndex = 15
            ElseIf i = 22 Then
                Range(Cells(i, 2), Cells(i, 4)).Merge
                Range(Cells(i, 8), Cells(i, 10)).Merge
            ElseIf i = 25 Then

1行目から下方向へ順番に個別セルのサイズ設定を行います。

一つのセル毎に微調節が出来るように1行単位でコード変更が出来るようにコード組み立てを行っています。

vbarangevscellseyecatch セルの範囲選択 Range VS Cells 、VBAで使えるのはどっち

「セルの書式設定A」プロシージャー

セルの書式設定Aの一部
        With Range("J1")
            .NumberFormatLocal = "ggge年mm月dd日"
            .Font.Size = 11
        End With

日付表示を和暦で指定していますが、この部分を変更すれば西暦表示も可能です。

vbafontsyseyecatcha セルの編集 Fontプロパティで文字装飾操作をする

「セル入力項目A」プロシージャー

セル入力項目A
        Range("J1") = Date
        Range("A3") = "物品購入申請書"
        Range("A5") = "■■部長 ○○ ○○ 様"
        Range("J6") = "外商部販売2課"
        Range("J7") = "○○ ○○"
        Range("A9") = "下記の通り物品購入を申請致します。"
        Range("A11") = "NO"
        Range("B11") = "品番・品名"
        Range("E11") = "数量"
        Range("F11") = "単価"
        Range("H11") = "予定金額"
        Range("K11") = "予定購入先"
        Range("B22") = "合計"
        Range("H22") = "=Sum(H12:H21)"
        Range("A25") = "申請理由"
        Range("A31") = "購入予定日"
        Range("A33") = "参考資料"
        Range("B33") = "申請理由を補強するデータ資料"
        Range("B34") = "購入見積書"
        Range("B35") = "商品カタログ"
        Range("G39") = "○○"
        Range("I39") = "○○"
        Range("K39") = "○○"

テンプレートの項目欄それぞれのデフォルト入力値です。

用途に合わせてそれぞれ文字を入れ替えてください。

「罫線A」プロシージャー

罫線A
        Union(Range("A11:L21"), Range("A25:L30"), Range("A31:L32"), _
        Range("A33:L37"), Range("G39:L43")).Select
        With Selection
            .Borders.LineStyle = xlContinuous
            .BorderAround LineStyle:=xlContinuous, Weight:=xlMedium
        End With
        Range("H22").Borders.LineStyle = xlContinuous
        Range("B22:J22").BorderAround LineStyle:=xlContinuous, Weight:=xlMedium

罫線を引く範囲をUnionメソッドで一度に選択して罫線の指定しています。

vbaborder1eyecatch セルの編集 実際に罫線を設定する 位置・線種・太さ・色

物品購入申請書テンプレートをVBAで作る まとめ

エクセルVBAでテンプレートを作ると運用がより楽になり、メリットを感じてもらえる部分も多くなると思います。

さらに進んで、入力欄のセルに自動で内容を入力できる様にすることを考えてみたり・・・、

それはもう、すでにVBAを勉強を始めているということです。

エクセルVBAに、なかなか手を出し辛い人も、このようなことからでもかかわって行くことで、また一つ壁が低くなるのかもしれません。

物品購入の稟議書を作る

提出先がさらに上の上級長への稟議書をエクセルVBAで作成します。

buppinringieyecatch エクセルVBA業務ツール 物品購入稟議書テンプレートを作る

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

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

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

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