仕事に役立つエクセルマクロ 第2回 
〜リストから単票を印刷する〜
阿部 晋也 記事更新日.09.02.09
愛知工業大学 経営情報科学部 非常勤講師

システム開発・楽曲制作・教育研修・DVD制作
Orange-Piece(オレンジピース)

「Wordを使って、文書をレイアウトするのは苦手だな、表計算ソフトのExcelはセルを使って、簡単に表を作成できるから楽なんだよ」というようなご意見があります。実際、わたしが担当してきたシステム開発の仕様書のほとんどはExcelで作成されたものでした。

2回目では「印刷レポートの作成」と題し、データを置き換えながら、印刷するという作業、いわゆる“差し込み印刷”にチャレンジします。
また、マクロの裏方に相当するプログラム言語についても操作します。ただ、あまりプログラム言語は意識せず、プログラムをコピーしておき、貼り付ければ出来てしまった!というような形で進めていきたいと考えています。早速、はじめてみましょう。
(ここから教材データがダウンロードできます。)
1.印刷の対象となるデータ本体と単票レイアウトの作成
まず、次のデータをみてください。こちらは、1回目の記事で登場したリストと同じです。この中の1件分のデータを抽出して、別のシートから呼び出そうと考えています。




ユーザの操作の流れは次のようなイメージです。あらかじめ第1回目で作成したような“ボタン”を作成しておき、作成したボタンをクリックすると、「印刷用」ワークシートを印刷するようにします。このとき、リストのデータを1行ずつ、「印刷用」ワークシートに差し込みながら、印刷するようにします。

では作業を始めましょう。「参加者リスト」ワークシート、「印刷用」ワークシートをあらかじめ作成しておきます。わたしのクセになってしまいますが、いつも「印刷用」ワークシートを作成するときは、セルの高さと幅を同じにして、方眼紙のようなワークシートを作成しています。

一般的に□や○といった図形を描くときには、[Alt]キーを押しながらドラッグして描くことで、セルに吸着します。方眼紙のようにしておき、さらにこのショートカットキーを使うことで、いろいろな図形を容易にレイアウトすることもできます。なお、こちらは今後の作業の必須条件ではありませんので、既定の幅や高さでももちろん大丈夫です。
ここでは次のようにレイアウトしています。この続きの記事を読むときの参考にしてください。
2.マクロを考えるときは、規則性をみつけることが大切
ここで、Excelの基本を振り返っておきましょう。別のワークシートの値を参照するときには、どのように入力すればよかったでしょうか?

たとえば、「参加者リスト」ワークシートのセルB7のデータを「印刷用」ワークシートのセルH3から参照しようとしたとき、セルH3に入力する式はどれでしょうか?

ア)=参加者リスト&B7
イ)=参加者リスト!B7
ウ)=参加者リスト:B7

正解は、イです。ほかのワークシートのセルのデータを呼び出すときには、「!(エクスクラメーションマーク)」を使って、「ワークシート名!セル番地」という形で記述します。この文法を知っていれば、1件分のデータを別のワークシートに転送することは容易にできます。印刷用ワークシートのセルの内容を下のように数式で置き換えてみましょう。

B日程が空欄のところは、別のワークシートで表示させると0となってしまいますが、これは現段階では仕方ありません。気になる方は、「ツール/オプション/[全般]タブ“ゼロ値”」をオフにすると、0の表示がなくなります。また、これはA日程が空欄のところも同様です。

ここで大切なことはリストの1件目のデータは全て7行に存在しているという規則性を把握することです。参加者リストワークシートのB8、C8、D8…つまり、8行目にすると、2件目のデータを取り出すことができます。また、9行目のデータを参照すれば、3件目のデータとなります。

このような規則性を理解できれば、後はマクロの出番です。第1回目で登場したように、マクロは繰り返し行うような作業を自動化する機能です。しかし、第1回目で登場した「操作の記録」作業だけで、7行目を参照して、8行目を参照して、9行目を参照して…と操作をすべて記録していると途方に暮れてしまいます。そこで登場するのがマクロの改修作業です。
マクロの改修作業には、Visual Basic for Application(VBA)の知識が必要です。
3.とりあえずVBAを動かしてみましょう。
いまからVisual Basic for Application(以下、VBA)というプログラム言語について解説します(正確には解説を試みようと考えていたのですが…)。プログラム言語の基礎となるのは英語だと私は考えています。また、プログラムを組み立てるのは数学に似ていると考えています。したがって、プログラムは「留学先で数学を学習するようなもの」と受講者の方にはお話しています。
 ですから、今日はそのような硬い話はやめにしましょう(結局、解説をあきらめました、難しいですものね)。どうしても必要な操作だけチャレンジしていただき、プログラムについては、コピーして貼り付ければ、個々の特殊な環境を除いて、ある程度の読者は正常に動作するだろうという多少甘い認識でおります。「コピペ」だ!「簡単」だ!と念じながら、どうぞ肩の力を抜いて、コピーアンドペーストしてください。
 さて、まずボタンは作っておきましょうか、詳しくは第1回目のページも参考にしてください。

●ボタンを作成しましょう。

(1)「フォーム」ツールバーを表示して、「ボタン」を選択します。ドラッグして、ボタンの領域を作成します。


(2)ボタンが作成されます。ボタンの名称はボタンを作成した回数によって、多少異なります。同時に「マクロの登録」ダイアログボックスが表示されました。この操作は第1回目と同じですね。第1回目では「記録」ボタンをクリックしましたが、今回は「新規作成」ボタンをクリックします。
(3)「Microsoft Visual Basic Editor」が開きました。これはちょうどExcelの裏舞台に相当します。簡単に画面を確認しておきましょう。この中のコードウィンドウ画面に、VBAのプログラムを入力することになります。

●コードを貼り付けましょう。

(1)コードウィンドウ内にカーソルを移動します。今回はボタン4という名前になっています。「Sub ボタン4_Click」の次の行にカーソルを移動します。

(2)さて、肝心のコードを貼り付けましょう。以下のコードをすべて選択して、コピーします。
'画面のちらつきを防止する
Application.ScreenUpdating = False

'参加者リストワークシートを選択する
Worksheets("参加者リスト").Activate

'まず参加者リストワークシートのセルB6をアクティブセルにする
Range("B6").Select

   'ループXの開始
   Do

   'アクティブセルを1つ下に移動する
   ActiveCell.Offset(1, 0).Select

   '空欄であれば、プログラムを終了する
   'Trim関数は前後のスペースを消去する
   If Trim(ActiveCell.Value) = "" Then
      Exit Do
   End If

   '非表示セルは印刷の対象としない
   If ActiveCell.EntireRow.Hidden = False Then

       'これ以降、すべて印刷用シート
       With Worksheets("印刷用")

       'レコードの先頭セルを選択
         .Range("H3").Value = ActiveCell.Offset(0, 0).Value
         .Range("H4").Value = ActiveCell.Offset(0, 1).Value
         .Range("H5").Value = ActiveCell.Offset(0, 2).Value
         .Range("C7").Value = ActiveCell.Offset(0, 3).Value
         .Range("C8").Value = ActiveCell.Offset(0, 4).Value

       'レコードの最終セルであれば、1部印刷を実行する
           .PrintOut

       '印刷用シート終了
       End With

   End If

   'ループXの終了
   Loop

'画面のちらつきを防止する
Application.ScreenUpdating = True

(3)実際にコードを入力した画面は次のようになります。

●ボタンをクリックして、実行してみましょう。

(1)では、Excelの画面に切り替えて、ボタンを実行してみましょう。切り替えるときには、タスクバーに表示されるボタンをクリックします。

(2)Excelの画面に切り替わります。ボタンの名前を変更するときには、右クリックして、表示されたポップアップメニューから「テキストの編集」を選択して、変更します。また、今回貼り付けたコードはオートフィルタ時にも有効です。ボタンをクリックして、実行してみましょう。これで1枚ずつ印刷されます。
4.VBAの改造するポイントだけは知っておきましょう。
●全体像

さて、プログラムの改造のポイントです。VBAの文法をすべて解説するスペースはありませんが、要点だけは抑えておきたいと思います。まず、フォームのボタンとVBAの関係です。ボタンがクリックされると、プログラムのコードが解釈され、実行される仕掛けになっています。
●VBAの基本的な文法3つ

プログラムを改造する前に知っておきたいポイントが3つあります。これを押さえておきましょう。
・基本的には上の行から順番に実行される
・「’(シングルクォーテーション)」は、“コメント行”といいプログラムを書くときのメモのような存在となっている。これは実際のプログラムには影響しない
・「Sub プログラム名()」から「End Sub」までが1つのプログラムの単位であり、実際にはこの間に記述されたコードが実行されることになる。この単位をプロシージャという。

●改造のポイント

(1)リストが含まれているワークシート名が違う 
   →この場合には、網掛け部分を変更してください。

(2)印刷先のワークシート名が違う
   →この場合には、網掛け部分を変更してください。

(3)リストに含まれる項目数が多い、レイアウト先を変更する        
      →基本的に下のコードの行数を増やしましょう。特に網掛け部分です。

この部分の改造にあたっては、以下のような流れを把握しておきます。(下の画像をクリックすると拡大します)

プログラム上でアクティブセルをどのように動かしているのか、イメージをつかむことはできますか?たとえば、B日程の右側の列に「備考」という新しい列があり、それを「印刷用」ワークシートのセルC9に転送することを考えると、次のような網掛け部分を追加することになります。
5.さいごに
いかがでしたか?第2回目では、VBAにチャレンジしてみました。文法をしっかり覚えて、プログラムにチャレンジすることはもちろん大切ですが、あまり文法が多いので、途中で断念することもしばしばあります。
今回ご紹介したように、改造するポイントをまずはきちんと押さえておき、実際に改造して、違うワークシートでも実行できるかどうかから始めてみるのもよいのではないかと思います。そして、同じような改造に慣れたら、ぜひ文法も調べてみてください。すると、単純に文法を学習するよりもきっと楽しいと思います。