土日でマスター エクセルVBA講座② 成績個票を自動でプリントアウト 繰り返し作業を実行する「For」「Next」構文+おまじない

スポンサーリンク

今回は、成績データから個人の個票を順番に自動的に印刷していくマクロを作成したいと思います。繰り返しの作業を実行するには、「For」「Next」構文(ステートメント)を利用します。

下記の成績一覧データから順に個票で名前を変更していき、マクロで印刷(プリントアウト)していきます。

成績一覧データ

こちらの個票の氏名を自動的に変更していき、その都度プリントアウトする方法です。

「氏名」を変更し、次々プリントアウトしていくマクロの作成

元データは、「VLOOKUP関数」を利用しています。下記の記事をご覧になってください。

超簡単!エクセルのVLOOKUP関数で成績一覧から個人の成績票を作成 VLOOKUP関数の ちょっとした裏技も! 365・2019・2016・2013・2010・2007対応
今回は、成績一覧データから、個人の成績票を「VLOOKUP関数」で作成する方法です。下記の成績一覧データから、個人の成績票を作成します(ちなみに名前は架空の人物です)。各教科の点数が入っているシートこのように、氏名...
スポンサーリンク

まずは「マクロの記録」で「プリントアウト(印刷)」のコードを生成

まずは、「マクロの記録」で「プリントアウト(印刷)」のコードを生成してみましょう。

「開発」タブの「マクロの記録」をクリックして記録開始です。

「マクロの記録」の開始

「マクロの記録」ダイアログボックスでは、「マクロ名」はそのまま「Macro1(何でもよい)」で、「OK」ボタンをクリックします。

「マクロの記録」

まず、シート「個票」で「印刷範囲の設定」をします。セルA1~G7を選択後、「ページレイアウト」「印刷範囲」「印刷範囲の設定」をクリックします。

「セルを選択」して「印刷範囲の設定」をクリック

その後、「ファイル」「印刷」で実際にプリントアウトします。

「マクロの記録」「印刷」

以上で一旦「マクロの記録」を終了します。

そして「開発」「Visual Basic」をクリックしてコードの確認をします。

「開発」「Visual Basic」

「Microsoft Visual Basic for Applications」の画面左側「標準モジュール」「Module1」をダブルクリックして記録したマクロを表示させます。

「Microsoft Visual Basic for Applications」

下記が、今回「マクロの記録」で自動生成されたコードとなります。

「印刷範囲の設定」と「印刷」のコード

「Range(“A1:G7”).Select」の部分が「セル範囲A1~G7を選択」、「ActiveSheet.PageSetup.PrintArea = “$A$1:$G$7″」の部分が「印刷範囲の設定」です。

ですから、「印刷範囲の設定」で再度セル「A1~G7」セルを選択していますので「Range(“A1:G7”).Select」の部分は省略しても問題はありません。ですが今はそのままにしておきます。

その後の

「ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True, _
IgnorePrintAreas:=False」

の部分が「プリントアウト(印刷)」のコードとなります。詳細は今回は省略します。後程、この部分をコピーしてマクロの中に貼り付けます。

いよいよコードを自分で作成してみる セルの値の変更をするマクロの作成

それでは、いよいよ自分でマクロを記述してみましょう。

記述する場所は「Mcro1」の「End Sub」の下です。

マクロ名は「test()」としています。「Sub test」と入力し、エンターキーを押すと自動的に「End Sub」が追加されます。

下記のコードを「test()」と「End Sub」の間に記述してください。

Sub test()
Sheets("個票").Range("f2").Value = Sheets("成績").Range("a3").Value
End Sub

マクロは「Sub マクロ名()」で始まり、「End Sub」で完結するのが大前提です。

Sheets(“個票”).Range(“f2”).Value = Sheets(“成績”).Range(“a3”).Value

の部分ですが、意味はシート「個票」の「F2セルの値(Value)」シート「成績」のA3セルの値にしなさいという意味です。

それでは、カーソルを「Sub test()」にある状態で上の「Sub/ユーザー フォームの実行」をクリックするか、キーボードの「F5」キーを押します。

「ユーザーフォームの実行」

すると、シート「個票」のF2セルの値が「鈴木 一郎」から「田中 実」に自動で変更されたことが確認できます。

セルの値をマクロで変更

セルの値を順番に変更していくマクロ 「For」「Next」構文

それでは、「VLOOKUP関数」で各教科の得点を連動させている「氏名」欄であるF2セルの値を順番に変更していき、印刷するマクロを記述してみましょう。

繰り返しの変更をするには「For」「Next」構文(ステートメント)を利用します。

For カウントしていく変数=最初の数 to 最後の数
  繰り返しの変更の処理 
 Next カウントしていく変数

となります。

ここでは、カウントしていく変数を「i」に(一般的に「For」「Next」構文では変数「i」や「j」を用います)、最初の数は氏名のある2行目の「2」、最後の数は氏名の最後の行「8」を設定します。

「Next i」で「i」の値を1つ増やし、再び「For」以下の処理が実行されます。

そして「For」と「Next」の間に繰り返しの変更をする処理を記述します。

今回の処理は2つ、「セルF2の値を変えるコード」と「印刷のコード」を記述します。

今回のマクロ名は「myfor」と一旦名前をつけています。

「For」「Next」の間に繰り返すコードを記述

「For」構文の前に、繰り返しをしないの作業をしない「印刷範囲の設定」をコピーして貼り付けています。

そして「For」と「Next」の間に2つの構文を記述しています。

まずは、下図は「印刷」(プリントアウト)の処理を「セルF2の値を変更する」コードの後にコピーして貼り付けています。

セルの値を順番に変更していくコード

セルの値を順番に変更していくコードは下記になります。

Sheets(“個票”).Range(“f2”).Value= Sheets(“成績”).Range(“a” & i).Value

Sheets(“個票”).Range(“f2”).Valueは、「氏名」セルですから変更しません。固定されています。

ところがSheets(“成績“).Range(“a” & i).Valueは、繰り返し処理の中で2行目から8行目まで変更しなければなりません。

そこでRange(範囲)を2から8まで1ずつ変動していく変数「i」を使ってセルの場所を順番に「A2」から「A8」まで1ずつ変更していく処理となります。

セルの値を変更して、プリントアウトを2行目から8行目まで繰り返していく処理は下記のようになります。

Sub myfor()
Range("A1:G7").Select
ActiveSheet.PageSetup.PrintArea = "$A$1:$G$7"
For i = 2 To 8
'ここにセルF2の値を変えるコード
Sheets("個票").Range("f2").Value = Sheets("成績").Range("a" & i).Value
'ここに印刷範囲の設定と印刷のコード
ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True, _
    IgnorePrintAreas:=False
Next i
 End Sub

それでは「開発」「マクロ」から「myfor」を「実行」してみてください。

マクロの実行

うまく動作しましたでしようか。

最後におまじないを2つ

最後におまじないのような構文(ステートメント)を追加しています。

普通にマクロをする実行すると、マクロの記述通りにパソコン上のエクセル画面も動作している様子がわかります。ただこれをすると、複雑なマクロではメモリを消費し、動作も遅くなります。

そこでマクロの最初に「Application.ScreenUpdating = False」の一文を加えると、マクロを実行している間エクセルの画面は変化しません。バックグラウンドでマクロを実行し、マクロ全て完了後に画面が変化します。

マクロをご存知の方も意外と知らない構文(ステートメント)ですので覚えておいてください。

もう一つの「Sheets(“個票”).Select」は、「個票」シート以外でマクロを実行しても「個票」シート選択する設定となります。

いずれもマクロを制御する、重要な構文(ステートメント)となります。

完成したコードはこちらです。

Sub myfor()
 Application.ScreenUpdating = False
 Sheets("個票").Select Range("A1:G7").Select ActiveSheet.PageSetup.PrintArea = "$A$1:$G$7"
 For i = 2 To 8
 'ここにセルF2の値を変えるコード
 Sheets("個票").Range("f2").Value = Sheets("成績").Range("a" & i).Value
 'ここに印刷範囲の設定と印刷のコード
 ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True, _
     IgnorePrintAreas:=False
 Next i
 End Sub

マクロは慣れるまでなかなか難しいものです。慣れるには、数をこなす必要ががあります。

今回の記事で不明な点、またはご要望があればコメントいただけたら幸いです。

マクロの記事は解説が複雑なので難しいですね。。。

コメント

タイトルとURLをコピーしました