今回は、成績データから個人の個票を順番に自動的に印刷していくマクロを作成したいと思います。繰り返しの作業を実行するには、「For」「Next」構文(ステートメント)を利用します。
下記の成績一覧データから順に個票で名前を変更していき、マクロで印刷(プリントアウト)していきます。
こちらの個票の氏名を自動的に変更していき、その都度プリントアウトする方法です。
元データは、「VLOOKUP関数」を利用しています。下記の記事をご覧になってください。
まずは「マクロの記録」で「プリントアウト(印刷)」のコードを生成
まずは、「マクロの記録」で「プリントアウト(印刷)」のコードを生成してみましょう。
「開発」タブの「マクロの記録」をクリックして記録開始です。
「マクロの記録」ダイアログボックスでは、「マクロ名」はそのまま「Macro1(何でもよい)」で、「OK」ボタンをクリックします。
まず、シート「個票」で「印刷範囲の設定」をします。セルA1~G7を選択後、「ページレイアウト」「印刷範囲」「印刷範囲の設定」をクリックします。
その後、「ファイル」「印刷」で実際にプリントアウトします。
以上で一旦「マクロの記録」を終了します。
そして「開発」「Visual Basic」をクリックしてコードの確認をします。
「Microsoft Visual Basic for Applications」の画面左側「標準モジュール」「Module1」をダブルクリックして記録したマクロを表示させます。
下記が、今回「マクロの記録」で自動生成されたコードとなります。
「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」構文の前に、繰り返しをしないの作業をしない「印刷範囲の設定」をコピーして貼り付けています。
そして「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 = FalseSheets("個票").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
マクロは慣れるまでなかなか難しいものです。慣れるには、数をこなす必要ががあります。
今回の記事で不明な点、またはご要望があればコメントいただけたら幸いです。
マクロの記事は解説が複雑なので難しいですね。。。
コメント