仕事柄チェックシートを大量に印刷することがよくあるのですが、型は固定で内容が一枚ずつ違うシートを大量に印刷しないといけないので手作業で行うにはめちゃくちゃ面倒くさいです。
今回はそんな面倒な印刷をexcel関数とVBAを使って自動化する方法のご紹介です。
目次
テンプレートの作成
下の画像のステータス列にそれぞれ別の値を入れて印刷を行うとします。
その場合まず「Sheet1」に印刷したいステータス欄を空白の状態で作成します。
次に「Sheet2」にステータス欄に入れる内容の一覧を作成します。
一覧を作成する際には必ず一番左セルに通し番号を記載し、入力したい内容を右側セルに記載していきます。
今回は1行目に項目を入れています。項目を入れておくと後々に編集するときに確認しやすいので予め入れておくことをおすすめします。
これでテンプレは完成です。
関数の挿入
今回はSheet1の「D1セル」に番号を記入すると、Sheet2のA列の番号の項目がステータス欄に入るようにします。
関数は「vlookup」を使用します。
「vlookup」とは指定範囲の中から検索条件に合致する値を返してくれる関数です。
これを使ってSheet1のステータス欄にSheet2のそれぞれの値を挿入していきます。
vlookupの書き方は
=vlookup(検索値 , 範囲 , 列番号 , 検索方法) 検索値 : 検索する値を指定します。(今回はD1セルとなります。) 範囲 : 検索を行う範囲を指定します。(今回はSheet2の作成した表を指定します。) 列番号 : 指定した範囲の内左から何番目の列の値を返すかを指定します。 検索方法: 「FALSE」か「TRUE」を指定します。 |
これを各項目のステータス欄に挿入にします。
項目 | ステータス |
種別 | =VLOOKUP(D1,Sheet2!A1:D6,2,FALSE) |
好物 | =VLOOKUP(D1,Sheet2!A1:D6,3,FALSE) |
色 | =VLOOKUP(D1,Sheet2!A1:D6,4,FALSE) |
これでD1に番号を入れると各ステータスが自動で表示されるようになります。
VBAの挿入
VBAを使ってD1セルに番号を自動挿入してから印刷を行うように設定します。
VBAについては前回記載しましたので下記を参照して下さい。
番号を自動入力するコードの作成
使用するコードは「For ~ Next」構文です。
これは指定された回数だけ一連の処理を繰り返してくれます。
使用方法を簡単に書くと
For 変数 = 開始点 to 終了点 —–処理—– Next 変数 |
となります。
今回はデータが1~5まであるので、開始点を「1」終了点を「5」変数を「i」とします。
※変数は任意の文字で構いません。
1 2 3 |
For i = 1 To 5 Worksheets("Sheet1").Range("D1") = i Next i |
これでSheet1のD1セルに1~5まで順番に入力されていきます。
自動印刷コードの作成
印刷を行うときは「.PrintOut」を使用します。
使い方は簡単で下記一行を入れてあげるだけで印刷を行います。
また、予め印刷範囲をSheet側で決めておけばその範囲で印刷を行います。
印刷を行いたいシート名.PrintOut |
今回はD1セルに番号が入ったタイミングで印刷を行うようにすれば、1~5番の印刷が行えるので先程作成したコードに挿入します。
1 2 3 4 |
For i = 1 To 5 Worksheets("Sheet1").Range("D1") = i Worksheets("Sheet1").PrintOut Next i |
VBEに各コードを記述
上記で作成したコードを実際に使用できる形で記述します。
1 2 3 4 5 6 7 8 9 10 |
Sub PrintTest() Dim i As Integer For i = 1 To 5 Worksheets("Sheet1").Range("D1") = i Worksheets("Sheet1").PrintOut Next i End Sub |
For文の上にあるDimは変数を宣言するためにあります。
今回使用した変数の「i」は整数を代入するものなので「Integer」を宣言します。
開始点と終了点の数字を変更すれば、印刷したい番号だけを印刷することも可能です。
開始点と終了点をVBEを開かずに指定する
上記までで自動印刷は可能ですが、どうせならVBEを開かずとも開始点と終了点を決定できるように修正します。
こうしておけばVBAを知らない人でも使いやすくなるのでおすすめです。
開始点と終了点入力箇所の作成
これはとても簡単で、下図のように印刷範囲外にここに入れてねっという枠を用意してあげればOKです。
F5セルに開始点、H5セルに終了点を入れてあげればOKです。
ここに入力した数字を変数に入れて印刷を行います。
開始点と終了点を変数に代入
今回使用する変数はわかりやすく
・開始点 : Start_Point
・終了点 : End_Point
を使用します。
※特に決まりはないので好きなものを使って構いません。
まずはこの変数の値をそれぞれF5セルの値とH5セルの値に決定します。
1 2 |
Start_Point = Worksheets("Sheet1").Range("F5").Value End_Point = Worksheets("Sheet1").Range("H5").Value |
後はこのコードを先程のコードに付け加えて、開始点と終了点の数字を変数に変えてあげれば完成です。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Sub PrintTest() Dim i As Integer Dim Start_Point As Integer Dim End_Point As Integer Start_Point = Worksheets("Sheet1").Range("F5").Value End_Point = Worksheets("Sheet1").Range("H5").Value For i = Start_Point To End_Point Worksheets("Sheet1").Range("D1") = i Worksheets("Sheet1").PrintOut Next i End Sub |
これで印刷の自動化はできました。
ですが、これだと実行するのにVBEを開かないといけないので少し手間がかかってしまいます。
なので次回はコマンドボタンを使用して、ボタン一つで実行可能にする方法をご紹介します。
よかったらそちらも見に来て下さい。
2018-06-26 at 11:33
-VBA Project ( ___.xls )
- Microsoft Excel Objects
Sheet1 ( 名簿 )
Sheet2 ( 通知書 )
ThisWorkbook
– 標準モジュール
Module1
Module2
Module3
上記の質問で、
ThisWorkbookは、どういう位置づけか?
Module1,2,3と勝手に増え続け、どれに書いても同じように動くのか?
おしえてください。
2018-06-26 at 13:21
それぞれを簡単に説明すると
・Sheet1
その「Sheet」のイベントプロシージャを使うとき等に使います。
また、Sheetの指定がされていないセルの場合はそのSheetのセルとなります。
・ThisWorkbook
その「ブック」のイベントプロシージャを使うとき等に使います。
・Module
標準モジュールと言い、基本的にはここを使用します。
また、Sheetの指定がされていないセルの場合はアクティブなSheetのセルとなります。
※イベントプロシージャ
イベントプロシージャはセルの内容が変更された等の特定の動作がされたときに実行されるプロシージャです。
ThisWorkbookの使い方としては
僕はアクティブセルのいる行や列の色を変えて、場所がわかりやすくするときなどによく使っています。
Moduleに関してはどれを使っても問題ないですが、後々どこを使ったかわからなくなったりと面倒なので使わないModuleは削除したほうがいいと思います。
2019-11-01 at 17:33
印刷するシートを増やしたいのですが、どうすればいいでしょうか?
各シートとも、中身が連動して変わります。
2020-01-07 at 09:11
遅くなりました。
11行目の「Worksheets(“Sheet1”).PrintOut」の後に印刷したいシートの分だけ下記要領でprintoutを記載すれば可能です。
Worksheets(“Sheet1”).PrintOut
Worksheets(“Sheet2”).PrintOut
Worksheets(“Sheet3”).PrintOut
どのシートを印刷するかは括弧の中身を印刷したいシートのシート名にすれば変更可能です。