ブログトップ

カクレ理系のやぶにらみ

tamm.exblog.jp

時間のある方はお読みください。軽い気持ちで読み始めると頭が痛くなります。

Excelで繰返し行う処理を自動化する(1)マクロの使用

 前回は、条件付き書式を使って、指定した出席番号の生徒の成績と順位だけを表示させるシートを作成しました。これを生徒に配布するには、人数分この表を作成しなければなりません。出席番号を1から順番に入れて、その都度印刷すればよいのですが、人数が多くなると手間がかかって大変です。
 Excelには繰り返し行う処理を自動的に実行してくれるマクロという機能があるので、今回はこれを活用する方法について書くことにします。



(付記)
 本稿で紹介しているサンプルファイルをインターネット上で公開しています。「成績通知表(条件付き書式・マクロ)」というファイル名です。Excel2003以前のもの(拡張子xls)と、Excel2007以降のもの(拡張しxlsm)と2種類あります。興味のある方は下記のリンクをクリックしてダウンロードしてください。


http://bit.ly/JmX4VJ


(完成形)
c0136904_20462070.jpg




(マクロについて)
 Excelもしょせんはプログラムなのですから、ユーザーがExcelに実施させるプログラムを書くことも理論的には可能です。しかし、一般のユーザーにはプログラムを書く知識はないので、素人でも手軽に扱えるように「マクロ」という機能が用意されています。
 マクロの基本的な使い方は、ユーザーがExcelに覚えさせたい一連の操作を1度やってみせるというものです。もう少しわりやすく説明すると、Excelに対し、「これからやってみせるからね」という合図をした後、一連の操作を実施します。それが終わったら、「これで終わりだよ」とExcelに教えてやることで、Excelはその操作の内容を記憶します。
 これが基本的な使い方なのですが、本稿では単純なマクロしか扱わないので、いきなりコートを書くことにします。
 なお、本稿ではExcel2010での操作を前提としていますが、Excel2003以前でも基本的な操作は同じです。操作方法が異なる場合は、その都度説明を加えます。

(手順1)ExcelでVisualBasicを起動させます
以下は、新規にExcelファイルを作成した場合の手順です。
(1)Excelでリボンのところある「開発」タブをクリックします。
 「開発」タブが表示されていないときは、「ファイル」タブをクリックして「オプション」を選択肢、「リボンのユーザー設定」をクリックします。右側にある「メイン・タブ」の中にある「開発」のチェックをオンにすると、リボンに「開発」タブが表示されるようになります。



c0136904_2047634.jpg



なお、Excel2003 以前では、「ツール」メニューの「マクロ」から「Visual Basic Editor」を選択します。


(2)「開発」タブの一番左端にある「VisualBasic」をクリックすると、「Microsoft Visual Basic For Application」(以下「VBA」)が起動するので、「挿入(I)」メニューから「標準モジュール」を選択すると、下図のように空白のウィンドウが開きます。


c0136904_20475424.jpg


(付記)
本稿で説明するExcelのマクロは、どのワークシートでも使えるようにするために、「標準モジュール」に登録することにしています。



(手順2)印刷するマクロのコードを入力します
(1)コード・ウィンドウに、次のように入力します。(面倒だという人は、コピー&ペーストしてください)

Sub 印刷()
'
' 印刷 Macro
'
'印刷範囲を選択状態にします
Range("b2:e13").Select

'選択した範囲を印刷します
Selection.PrintOut , , Copies:=1

End Sub



(手順2)入力したマクロの保存
コード・ウィンドウを閉じれば、入力したまくろは自動的に保存されます。

(解説)
・Sub印刷() と End Sub
 マクロの最初には必ず「Sub」を記述することになっており、これはマクロの開始の合図だと思っていれば間違いありません。始まりの合図なのですから、当然マクロの名前も指定することになります。この場合「印刷」というのがマクロの名前になり、()を最後につけることになっています。
なお、Sub マクロ名() というコードを入力すると、自動的にEnd Sub というコードが挿入されます。これはマクロがこれで終了するという合図になります。したがって、マクロで実行する処理は、Subマクロ名() の次の行から、End Subの間の行に記述することになります。

・Range("b2:e13").Select
 印刷する範囲を選択するコードです。前半のRange("b2:e13")で範囲を指定し、後半のSelectは選択せよという指示となります。

・Selection.PrintOut , , Copies:=1
 選択した範囲を印刷するコードです。Selection(選択範囲)をPrintOut(印刷せよ)ということなのですが、末尾の , , Copies:=1は1部だけ印刷するという意味です。

 マクロには独特の文法がありますが、基本はコンピュータに対する命令形です。したがって、何を、どのように、●●せよ、という要素がコードとして記述されることになります。

 マクロのコードは上の行から順番に実行されていきますが、行の先頭に「’」がついている場合、その行に書かれていることは無視されます。マクロのコードは、基本的にはExcelに対する指示書ですが、こうすることで、ユーザーが自分宛にマクロのコードの説明(コメント)を書き込むことができるようになります。なぜこんなことをするのかというと、後でコードを修正する際に便利になるからです。


(手順3)出席番号を順番に入力するコードを記述します
 セルE2に出席番号を順番に入力していくためのコードを入力します。

(1)新しいマクロの記述
 印刷マクロの最後の行のEnd Subの次の行に、Sub 印刷開始()というコードを入力します。こうすると、前の行のEnd Subとの間に線が引かれ、別のマクロであることがユーザーにもわかるようになります。

(2)コードを記述します
 新たに入力するコードは次の通りです。面倒だという方はコピー&ペーストしてください。

Sub 印刷開始()
'
'印刷開始 Macro

'
'出席番号という変数を定義します

Dim 出席番号 As Integer

'マクロ実行中は画面の更新を停止します

Application.ScreenUpdating = False


'セルE2、に1から順番に数値をあてはめ、その都度印刷をします

For 出席番号 = 1 To 9

Range("e2").Value = 出席番号

Call 印刷


Next 出席番号

'セルE2の値を0にします

Range("e2").Value = 0


'画面の更新停止を解除します
Application.ScreenUpdating = True


End Sub  


(解説)
・Dim 出席番号 As Integer

 セルE2に順番に数値を入力していくために、変数というのを使います。変数というのは文字通り値が変化する(この場合は1から9まで)ものという意味であり、どの値になるのかはその都度ユーザーが指示することになります。
 変数を使うには、その変数がどのようなものであるかをあらかじめExcelに教えることが必要で、これを変数の定義と呼んでいます。
 このコードでは、先頭にDimという文字列を配置することで、「出席番号」という名前の変数が、整数型(Integer、少数や文字列は扱わない)であることを、Excelに教えているわけです。
 構文は決まっていて、Dim 変数の名前(漢字OK)As 変数の型 という書き方をします。


・Application.ScreenUpdating = False

 Excelは、マクロの記述されているコートを順番に実行していくので、画面にもその作業の進捗状況が逐一反映されることになります。画面の更新は素早く行われるのですが、今回のように全体の作業量が多い場合は、画面の更新をしないように設定した方が早く処理が終わります。
 そのため、マクロの最初の部分でこのコードを記述しておいて、それ以降の画面の更新を禁止するわけです。
 なお、一連の処理が完了したら、画面の更新を再開させるためのコードを記述しておきます。その場合、末尾のFalseをTrueに変更したものを記述します。

 Application.ScreenUpdating = True  ←画面の更新を再開するコード


・For 出席番号 = 1 To 9
    Range("e2").Value = 出席番号
Call 印刷
 Next 出席番号


 For~Next は同じ処理を一定回数繰り返すときに使うコードです。その構文は、

For 変数=初期値(最初の値) to 最後の値
(処理)
Next


となります。
すなわち、変数が初期値のときに(処理)を行ったら、Nex変数名で変数の値を1つ増やしてから元(For以下)に戻り、同じ(処理)を実行します。以下同じことを変数が最後の値(この場合は9)になるまで繰り返すという意味です。つまり、生徒が9人いるので、同じ処理を全部で9回繰り返せばよいということになるので、それをExcelに命じているわけです。

・Range("e2").Value = 出席番号
これは、セルE2の値として、変数「出席番号」の値を代入せよ、という意味です。前回ご説明したように、セルE2に出席番号を入力すると、その生徒の氏名と成績だけが表示され、他の生徒の氏名と成績は非表示となります。そのうえで、次の印刷処理を行うわけです。
なお、2回目以降は、「Next 変数」 によって、変数の値が1つ増えた状態で処理が行われます。

・Call 印刷
これは、既に登録してあるマクロ「印刷を呼び出して実行するという意味のコードです。以前も申し上げているように、Excelでは細かいパーツに分けて考えるというのが鉄則ですから、指定した範囲を印刷するマクロをあらかじめつくっておき、必要なときにそれを呼び出して実行させるという方法をとっているわけです。

印刷が完了すると、一連の(処理)が完了するので、次の行にある、「Next 変数」によって、変数の値が1つ増えたうえで、最初に戻り、同じ処理が行われます。このマクロでは、それを9回(生徒の人数分)繰り返すことになります。
  
・Application.ScreenUpdating = True

9人分の処理が完了すると、For ~ Nextの処理が完了するので、Excelはその次の行に書かれているコードを実行します。
この例では、画面の更新禁止を解除するという命令が実行され、これで一連の処理がすべて完了することになります。

(手順4)マクロの保存
コード・ウィンドウを閉じて、入力したマクロを保存します。


(手順5)ボタンを配置して、これをクリックすればマクロが実行されるようにする
(1)「挿入」タブで「図形」を選択し、四角形を選びます。

(2)シート上の好きな位置をドラッグして、四角形を配置します。

(3)四角形の上で右クリックし「テキストの編集」から、「印刷開始」という文字列を入力します。これで四角形の上に「印刷開始」という文字列が表示されるようになります。」

(4)もう一度四角形の上で右クリックし、「マクロの登録」を選択します。「マクロの登録」ウィンドウで「印刷開始」を選択します。これは、この四角形とマクロ(印刷開始)をリンクさせるために行うものであり、この登録が完了すると、以後四角形はボタンとなり、マウスでクリックできるようになります。


(手順6)Excelファイルを保存する
マクロの登録が完了したら、Excelファイルを保存します。Excel2010では、マクロが含まれたファイルを登録するには、拡張子を「xslm」に変更しなければなりません。パソコンの設定によっては、拡張子を表示させないようになっている場合もあるので、マクロを含むファイルを保存する場合には、ファイル名も(マクロあり)というふうに変更した方がわかりやすくなると思います。


(おさらい)
(1)マクロとは、Excelに対する、一連の処理の指示書のようなものです。
(2)そのため、「何に対して」「どのように」「○○をせよ」という形で、命令文(これを「ステートメント」といいます)を記述していきます。
(3)命令文で用いる用語と構文は独特なものがありますが、落ち着いてみると、どれも高校程度の英語力で理解できるものばかりです。
なお、記述方法は基本的には次の順番となります。

(処理の対象).(処理)= (処理方法)
※「 = 」の代わりに「 , 」が用いられることもあります。



(次回の予告)
同じ処理を繰り返して実施する場合、マクロを利用すると圧倒的に手間隙を省くことができるようになることがおわかりいただけたことと思います。
今回ご紹介した事例は、生徒数が9人に固定されているので、印刷範囲が変化することはありません。ところが、実際には、クラスが異なれば生徒の人数が変わるように、ケース・バイ・ケースで印刷範囲が変わってくる場合もあります。
そういう場合にはどうしたらよいかについて解説している本は、私が知るかぎり、見たことがありません。そこで、次回は印刷範囲が変わる場合に、(ユーザーの手を煩わせることなく)自動的に処理ができるようにする方法をご紹介することにしたいと思います。
by t_am | 2012-04-22 20:54 | Excel のあの手この手