こんにちは!仕事効率化コーチのカフェインレスです。
今回は、例えば中学校の先生をやっていて、生徒全員分の成績表を作る必要があるとき、
1クリックで生徒全員分の成績表を印刷まで完了させるVBAマクロを組む方法を解説します。
この方法を応用すると、成績表だけでなく、データベースがあるものはほとんど一気に印刷できるようになります。
また、実際に記述したVBAのコードを掲載しますが、50枚の印刷に要した行数は7行でした。
たったの7行で50枚の印刷が完了します。
ちなみに、VBA中の50という数字を1,000にすると、1,000枚印刷されます。
今回の場合、データベースがないので51~1,000枚目はエラーになりますが、
データベースがあれば1,000枚正確に印刷されます。
手で頑張ってやる時間の何倍も早いです。
覚えないと損ですね。。
それでは、解説していきます!
VBA記述前のシステムについて
まずはデータベースの形式です。
今回はこの様なデータベースを使います。1~50番まで、50種のデータが入っています。
次に出力の書式です。
出力の書式はこちらを用います。この形式で50枚の印刷を行います。
データを出力形式に入れる際は、計算用シートを経由しています。
VBA記述前のこの状態のエクセルファイルをこちらにアップロードしておきます。
成績表の自動印刷システム(w/o VBA)
これらのデータは下記の記事で作成したものになりますので、
0からここまでを見たい場合は、下記の2つの記事をご覧下さい。
vlookup関数をオートフィルで簡単に書く方法
vlookup関数を使った書類作成を短時間で終わらせる一工夫
これらの記事の理解とVBAの下準備を行った上でこの記事を読むと、
自動出力システムの作成も難しくありません。
エクセルVBAを使う前の下準備|開発タブの設置と拡張子の設定
ぜひチャレンジして頂きたいと思います。
恐ろしく仕事が早くなりますよ。
VBAの記述内容
それでは実際にVBAを記述していきましょう。
たった7行といいましたが、実際に記述したVBAのコードはこちらです。
エクセルもアップロードしておきます。
VBAのコードは開発タブから確認して下さい。 >>開発タブの場所はこちらをご参照下さい。
クリックしたら印刷がスタートするボタンもつけようかと思ったのですが、
間違ってボタンをおしてしまった際に、いきなり50枚も印刷が開始されたら
申し訳ないので、ボタンの設置はやめておきました^^;
また、誤印刷防止のため、2枚までしか印刷できないようにしてあります。
(もし5枚とか印刷してみたい場合は、for i = 1 to 2 の 「2」の数字を変更してみてください。)
成績表の自動印刷システム(w/i VBA)
このようにデータベースからデータを取得して、一定の書式に出力するシステムはたった7行で記述できます。
なんかこれぐらいなら出来るんじゃないか、という気がしませんか?
ちなみにこのVBAマクロを走らせる場合は、
下記の再生ボタン?をクリックしたり、
下記の様にVBAマクロを関連付けたボタンを作って、
このボタンをクリックします。
7行のVBAの意味の説明
この7行を細かく説明しますと、4つのパートに分かれます。
コードと内容を色で対応させてあります。
1. モジュールの開始と終了宣言
2. 1 から50まで処理を繰り返す
3. 管理番号の数字の変更
4. 印刷する
—
Sub autoprint()
Dim i As Long
For i = 1 To 50
Worksheets(“sheet2”).Range(“O3”).Value = i
Worksheets(“Sheet2”).Range(“A1:L27”).PrintOut
Next i
End Sub
—
それでは、それぞれを細かく見ていきましょう。
1. モジュールの開始と終了宣言
—
Sub autoprint()
End Sub
—
この2行はVBAマクロに必ず必要な要素です。
autoprintはこのVBAマクロの名前です。
VBAマクロでは、「Sub 名前 () 」が最初に入り、
最後に 「End sub」 が必ず入ります。
2. 1 から50まで処理を繰り返す
For と Next で囲まれた間の処理を指定した回数だけ繰り返します。
1 to 50 と書くと、1,2,3,…50と順番に 「i」 に数字を入力します。
—
Dim i As Long
For i = 1 To 50
Next i
—
Dim i As Long というのは、「i」は数字ですよって意味です。
「i」は1から50まで変化するので変数といいますが、変数は数字なのか文字なのか、を
最初に宣言する必要があります。
数字の場合は「Long」、文字の場合は「String」ととりあえず宣言しておけば大丈夫です。
ちなみに、VBAの教科書とかには、数字の宣言にintegerという形式がよく使われていますが、
integerよりlongの方が大きな数字も扱えるし、処理速度も早いので、常にlongを使っておけば良いです。
3. 管理番号の数字の変更
Worksheets(“sheet2”).Range(“O3”).Value = i
sheet2のO3セルの数字を「i」にしてねっていう意味です。
「i」にするということは、1,2,3…と、数字がどんどんと変化していくことを指します。
i=1の時に、O3に1を入力して、印刷。
次は、i=2の時O3に2を入力して、印刷。
次は・・・、とi=50まで同じ動作を繰り返します。
for i = 1 to 50 step 2 と書けば、
1,3,5,7…という順番にも出来たりします。
4. 印刷する
Worksheets(“Sheet2”).Range(“A1:L27”).PrintOut
A1:L27の範囲を印刷してねという意味です。
プリンタを指定したりもできます。
この書式は最もシンプルですので、印刷機の指定は行っていません。
そのため、デフォルトのプリンターから印刷されます。
もしプリンターを変更したい場合は、コントロールパネルのデバイスとプリンターから
そのプリンターを変更するか、「VBA プリンター 指定」 で検索してみてください。
すぐに答えが出てくると思います。
検索の練習も大事ですので、ここだけは敢えて書かずにおこうと思います。
VBAのコードのまとめ
今回記述したVBAマクロの情報をまとめると、このようになります。
—
iという数字を1から50まで順番に変更していくから、
iという数字が変更されたら、その都度その数字をO3に入力して印刷して。
印刷が終わったら次の数字(+1した数)で同じ処理を行うよ。
iが50までいったら終わりにして。
—
これでおしまいです。
意外と簡単じゃないです?
たったこれだけで、単純作業から開放されるのであれば、
VBAを勉強してみるのも良いのかな、と思って貰えたら嬉しいです。
もし自分の書式を自動化したいなら
vlookup関数を使って、データベースからデータを抽出できている状態を前提に進めさせて頂きます。
vlookup関数を使ったデータの抽出については、下記の2つの記事を参考にして下さい。
vlookup関数をオートフィルで簡単に書く方法
vlookup関数を使った書類作成を短時間で終わらせる一工夫
上記を見ても、じゃあ実際に自分の書式に当てはめるにはどうしたら良いかなー、となると思うので、
ご自身の書式に当てはめる方法も解説します。
—
Sub autoprint()
Dim i As Long
For i = 1 To 50 ← 枚数を変更する場合は、50を任意の数字に変更して下さい。
Worksheets(“sheet2”).Range(“O3”).Value = i
Worksheets(“sheet2”) ← sheet2をご自身のシート名に変更して下さい。
Range(“O3”) ← O3をvlookupの検索値を指定している値に変更して下さい。
Worksheets(“Sheet2”).Range(“A1:L27”).PrintOut ← 範囲を”A1 ~ L27″から、任意の範囲に変更して下さい。
範囲の書き方はダブルクオーテーション(“) + セル + コロン(:) + セル + ダブルクオーテーション(“)です。
Next i
End Sub
—
変更が必要な所は4箇所ですね。
これらをご自身の書式に合わせるだけで、自動印刷システムの作成が可能です。
これができれば仕事の効率は大きく上がるので、ぜひ試してみてください。
なお、システムを動かして止めたい時は、Escボタンを長押ししてください。
また、システムを動かす前は2とか3枚の印刷で試し刷りを行って下さい。
まとめ
VBAマクロって言葉を聞くだけでも難しそうで、勉強する気になれなかったと思いますが、
実際のコードを見てみるとすごく簡単だったと思います。
本記事を見て、いきなり同等のシステムが組めるか、と言われると難しいと思いますが、
For i という 「繰り返し」の考え方と基本的なVBAの記述方法を学べば、簡単にできるようになります。
VBAのついても今後記事にしていきますので、楽しみにしておいて下さい。
今回は1つの書式の自動化を行いましたが、下記の記事では3種類の書式を使い分ける印刷自動化システムの作り方を説明しています。
エクセルVBAを使った多数の書式に対する自動印刷システムの作り方
上記で使うSelect Caseを用いると、VBAの幅が非常に広くなります。
書式の使い分けってあまり行わないかもしれませんが、3種以上パターンのあるIf文の勉強と考えても良いかもしれません。