エクセルVBA で物品購入申請書 のテンプレートを作ります。
VBAで作るテンプレートは、エクセルシート管理のものとは運用面でも結構自由度が変わります。
違いを知ってみてください。
こんにちは じゅんぱ店長 (@junpa33) です。
業務の中で非常によく使うものに「書類作成のテンプレート」があります。
エクセルシートで作られたテンプレートをコピーして、繰り返し使うことが多いですよね。
今回はエクセルVBAを使って、「書類のテンプレート」を作っていきます。
コンテンツ
物品購入申請書テンプレートをVBAで作る
書類作成のテンプレートは普通、エクセルシートにひな形を作り、それを大切に保管して使用しているでしょう。
中には、テンプレートの記入部のセルの中には関数式がぎっしり埋め込まれたテンプレートもあるでしょう。
”関数式でぎっしり” の専用のテンプレートパターンは、エクセルVBAでは一番得意な部分になります。
今回は、そういった、二筋三筋縄が必要かもしれないテンプレートではなく、汎用性のあるものを作ります。
手入力可能な文章や計算が中心の書類作成テンプレート「物品購入申請書テンプレート」をエクセルVBAで簡単作成します。
テンプレートをVBAで作るメリットとデメリット
VBAで作られた「書式のテンプレート」を使う側から見た時には、普通に、メリットとデメリットがあります。
まず、先にそれを明確にしておきます。メリット、デメリットは足し算引き算ですので、「ご自分の判断は如何に」ということです。
メリット |
|
デメリット |
|
作成されたテンプレートの表示方法
物品購入申請書テンプレートの完成形を表示するのは、このようにします。
- 「物品購入申請書テンプレートの全VBAコード」をVBEで標準モジュールにペーストする。(写真では、Module1にペーストしています。)
- 「Alt+F8」クリック でマクロの表示を呼び出し「物品購入申請Temp」を実行する
- 物品購入申請書が作成されます。メッセージボックスでOKクリックで使用できます。
テンプレート作成の全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」プロシージャー
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回目以降のプログラム使用で、すでに「物品購入申請書」シートが作成されていれば、それを検知することが出来ます。
- 前回作成されたものを残すのなら「シートをリネームする」
- 前回作成されたものを残さないなら「内容を上書きする(内容をクリアして新たに白紙を作る)」
かの、どちらかを選択するように促します。
メッセージボックスで「はい」「いいえ」で選択します。
メッセージボックス MsgBox実際の使い方を最速に理解その条件分岐に沿って、「Callステートメント」で部品プロシージャーを呼び出します。
部品化プロシージャーでCallステートメントは必須 If条件文のVBAコードの組み方。条件の絞り方を最速理解「シートクリアA」プロシージャー
' .DrawingObjects.Delete 'データ印等をクリアするときに
日付印やデータ印、商品写真などの画像系を挿入したときは、
このVBAコードを有効にします。
コメントアウト(シングルクォーテーションを消す)ことでコードが有効になります。
シートクリアーを目的のメソッド別にVBA最速理解「テンプレート挿入A」プロシージャー
ThisWorkbook.Worksheets.Add(before:=Worksheets(1)).Name = "物品購入申請書
このプログラムを埋め込んだエクセルBOOKの1番目のワークシートの左に「物品購入申請書」シートを作成し挿入します。
「ページ設定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にセットしています。この部分を変更することで、フォントや文字サイズを変更できます。
With~End Withの使い方。VBAコードを簡潔に記述する「セルサイズ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メソッド」で一括処理を行っています。
UnionとRangeの一括選択の働きを比較 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行単位でコード変更が出来るようにコード組み立てを行っています。
Range VS Cells !VBAで使えるのはどっち「セルの書式設定A」プロシージャー
With Range("J1")
.NumberFormatLocal = "ggge年mm月dd日"
.Font.Size = 11
End With
日付表示を和暦で指定していますが、この部分を変更すれば西暦表示も可能です。
Fontプロパティで文字装飾操作をする「セル入力項目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」プロシージャー
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メソッドで一度に選択して罫線の指定しています。
Bordersの/位置/線種/太さ/色/と<外枠だけの罫線>の設置物品購入申請書テンプレートをVBAで作る まとめ
エクセルVBAでテンプレートを作ると運用がより楽になり、メリットを感じてもらえる部分も多くなると思います。
さらに進んで、入力欄のセルに自動で内容を入力できる様にすることを考えてみたり・・・、
それはもう、すでにVBAを勉強を始めているということです。
エクセルVBAに、なかなか手を出し辛い人も、このようなことからでもかかわって行くことで、また一つ壁が低くなるのかもしれません。
エクセルVBAを独習するのに参考書は欠かせません。 参考書選びは自分に合った「相棒」にできるものを選んでいきたいです。
エクセルVBAの独習でおすすめ参考書を7冊選ぶ。良書との出会いは大切です今回の記事はここまでです。 最後までご覧いただき有難うございました。
<記事内容についての告知>
VBAコードの記述記事においては、その記述には細心の注意をしたつもりですが、掲載のVBAコードは動作を保証するものではりません。 あくまでVBAの情報の一例として掲載しています。 掲載のVBAコードのご使用は、自己責任でご判断ください。 万一データ破損等の損害が発生しても当方では責任は負いません。
アンケートでポイ活しよう!!
アンケートに答えれば答えるほど ”使える” ポイントがたまります。