Excelにおけるマクロ作成の初歩を学びます.まずExcelの操作に関して,マクロの作成をするうえで必要となる最小限の知識を確認します.つぎに最も簡単な方法である「記録機能」を利用して,マクロの作成と利用を体験します.このとき同時に,マクロを記述するための最小限の記法等も学習します.最後にExcelのマクロにおいて広く必要とされる「セルの参照」のいくつかの記述法を,実際にサンプルマクロを書きながら学習します.
1. Excel入門ダイジェスト版
2. マクロの記録機能の利用
3. セルの参照のしかた
学習を進めるために必要最小限のExcelの操作に関する知識を確認します.
Excelは表計算を行うためのアプリケーションです.このアプリケーションで作業をおこなう際には,以下の操作対象を扱います.
数値,文字,数式等を入力する1つひとつの枠をセルと呼びます.
セルの集合をワークシートと呼びます.ワークシートには列方向にA, B, C...,行方向に1, 2, 3...と記号が振られています.ワークシートの中にある1つのセルの位置を特定する場合,通常はA1,D13など,「列,行」の順で呼びます.
ワークシートの集合をブックと呼びます.Excelでは1つのブックが1つのファイルとして扱われます.1つのブックは1枚以上のワークシートによって構成されます.
Excelを使って以下の表を完成しましょう(practice01.xls, Sheet1).
この表はあるおすし屋さんの1日の売上表です.それぞれの商品ごとに単価と売上数から売上金額,売上数の割合(%),売上金額の割合(%)を算出します.また,すべての商品の合計も算出します.
セルに入力される文字や数値を「値(あたい)」と呼びます.早速欠けている値(商品名,単価,売上数)を入力しましょう.基本的な値の入力の手順は次の通りです.
なお,計算の対象となる数値は全角ではなく半角で入力するようにしましょう(全角で入力すると後でトラブルの原因になることがあります).
セルには計算式を入力することも出来ます.例えば大トロの売上金額は,「大トロの単価×大トロの売上数」で算出されます.この場合,売上金額を算出したいD3のセルに次のように入力します.
=B3*C3
このように入力すると,D3のセルにはB3とC3の乗算(かけ算)の結果が表示されます.
=(イコール)は,計算式を入力する際に,必ず先頭に入力します.B3は大トロの単価の入力されたセル,C3は大トロの売上数の入力されたセルです.間にある*(アスタリスク)は,前後の項の乗算を意味する演算子(算術計算の記号)です.演算子は他に+(加算), -(減算), /(除算)などがあります.
同じようにして中トロの売上金額も算出してみましょう.
トロ以下,カッパに至るまでの数式の入力は,コピーを使って行うことが出来ます.D3(中トロの売上金額)をマウスで選択した後,マウスのポインタをセルの右下に移動します.するとポインタが以下のような状態に変化します.
左ボタンを押したままマウスを下に(D11まで)ずらします.すると,ずらした個所に自動的に数式が入力されます.
Excelには頻繁に使われる計算式が「関数」として登録されています.たとえば複数の値の合計を求める際には,SUM(合計)関数を使えば「=A1+A2+A3+....」などと数式を入力しなくても済みます.
SUM関数を使って売上数,売上金額の合計を求めましょう.
するとC12にC3からC11の合計の値が表示されます.
同様にして売上金額の合計も求めましょう.
売上数の割合は「売上数/売上数の合計*100」で求められます.そこで大トロの売上数の割合を表示するE3に「=C3/C12*100」と入力し,以下,コピーを使って他の商品の売上の割合を求めようとすると,エラー記号(#DIV/0!,「0で割れません」の意味)が表示されうまく行きません.
これは,コピーをすると,数式を構成する各項(売上数,売上数の合計)のセルの位置が1行ずつ下にずれるためです.売上数はこれで正しく参照(記号によってセルを指し示すこと)されるのですが,売上数の合計は常にC12にあるため,コピーによってC13, C14...と1行ずつずれてしまうと正しく計算が出来ません.
ある特定のセルを,コピーなどの操作があっても変化しないよう絶対的に参照するためには,そのセルの列や行を表す記号の前に$をつけます.たとえば売上数の合計はC12ですが,コピーによってセルが1行ずつ下にずれても常に同じ行(12行目)を参照すようにするために,あらかじめE3(大トロの売上数の割合)に以下の式を入力しておきます.
=C3/C$12*100
このように,セルの行や列(あるいは両方)について,それを絶対的な位置として参照するやり方を「絶対参照」と呼びます.それに対して,$を使って絶対参照を指定しない場合,セルの参照は前後左右の相対的な位置関係を指すものと解釈されます.これを「相対参照」と呼びます.
売上金額の割合も,同様にセルの絶対参照を使いながら記述しましょう.
現状で必要なすべての値と数式の入力が終わりましたが,表としてはあまり見やすい状態とはいえません.そこで「セルの書式設定」を使いながら,表を見やすくします.
「セルの書式設定」はプルダウンメニューの「書式→セル」で起動します.
表に罫線(表の外枠や内側の仕切り線)を引きましょう.あらかじめ表全体をマウスで選択した上で「セルの書式設定」を起動します.ダイアログ画面の「罫線」タブを表示し,必要な罫線の位置と線の種類を指定します.線の種類を使い分ける場合には,必要な箇所をマウスで選択して同様の操作を繰り返します.
Excelでは値を表示する形式に様々な区別があります.表示形式は「表示形式」タブで指定します.たとえば「通貨」を選ぶと,自動的に通貨記号や桁を区切るカンマが入ります.また,小数点以下を四捨五入して表示桁数を調整したい場合,「数値」を選んだうえで「小数点以下の桁数」を指定します.
セルの背景色は「パターン」で選択します.あらかじめ範囲を選択しておいた上で,「パターン」タブから使いたい色を選択します.
セル内の文字や数値の配置を指定することが出来ます.「配置」タブで「横位置」,「縦位置」それぞれについて設定します.また,複数のセルを結合したい場合(たとえば表のタイトルなど),あらかじめ結合するセルを選択したうえで,「セルを結合する」にチェックをします.
行や列の幅を,値の縦・横幅にあわせて自動的に調整することが出来ます.対象となる行,列をあらかじめ選択したうえで,「書式→行→自動サイズ調整」あるいは「書式→列→選択範囲に合わせる」を選択します.
Excelの操作に関する補足資料を用意しました(PDF版).もう少し練習したい方はこちらをどうぞ.
Excel入門ダイジェスト・補足資料Excelの「マクロの記録機能」を利用してマクロの作成と利用を体験します.
マクロとはアプリケーションの操作を自動化するためのプログラムです.操作の手順をマクロ作成用に用意されたプログラミング言語であらかじめ記述し登録しておきます.登録されたマクロを呼び出すことで,記述された操作を自動的に実行してくれます.
頻繁に行う定型的な操作をマクロとして登録しておくことで,アプリケーションを利用した作業の効率を向上することができます.
Excelにはマクロ作成用のプログラミング言語としてVBA(Visual Basic for Application)が用意されています.Excel用のマクロを作成するためにはVBAを理解する必要があります.
VBAはExcelだけでなく,マイクロソフト社の他のアプリケーションソフト(Word, Access, PowerPoint)にも実装されています.したがってExcelでVBAを学習しておけば,これらの他のアプリケーションでのマクロの作成にも応用が利きます(もちろん別途の学習は必要ですが).
Excelにはマクロの記録機能があります.これは,ユーザーが操作を行うそばから,その手順をマクロとして自動的に記録する機能です.この機能を用いれば,プログラミングの経験を持たなくても,簡単にマクロを作成することが出来ます.
「セルの背景色の変更」を記録機能を使ってマクロとして登録してみましょう.たとえば「期末テスト得点表」を読みやすくするために,以下のように一行おきに水色の背景色をつけたいと思います.
手順としては,1. セルを選択する,2. 「書式→セル...→パターン」を開いて背景色を選ぶ,3. OKをクリックする,となりますが,1つひとつの対象にこの作業を施していては手間がかかります.
そこで,次のように1回だけ操作を行い,その操作をマクロとして記録します.
(1)あらかじめ背景色を変更する範囲を選択しておく(A4とB4)
(2)「ツール→マクロ→新しいマクロの記録...」を選択する
この時点で以下のようなダイアログ画面が出ます.
「マクロ名」には記録するマクロの名称を入力します.ここでは仮に「背景色変更」と入れます.「ショートカットキー」は,記録したマクロを実行するためのショートカットキーを割り当てたい場合に入力します.既存のショートカットキーと重ならないように,Shiftキーを押しながらAと入力しておきましょう.)必要事項を入力したらOKをクリックします.
(3)実際に背景色の変更の操作を行う
ここでは「書式→セル...→パターン」を開いて水色を選択しましょう.
(4)ツールバーの停止ボタンをクリックする
記録機能を用いると,この停止ボタンをクリックするまでの間の作業をマクロとして記録します.記録したい作業を終了したら必ず停止ボタンで記録を停止します.
マクロの実行の最も一般的な手順は,「ツール→マクロ→マクロ...」を選択するやり方です.以下のようなダイアログが出現しますので,実行したいマクロの名称を選択して「実行」をクリックします.
先程は,背景色を変更したい範囲を選択した後の作業を記録しました.したがって,上記の手順でマクロを呼び出す前に,背景色を変更する範囲を選択しておきます.
マクロを記録する際にショートカットキーを割り当てておいた場合,直接そのショートカットキーを押せばマクロを実行することが出来ます.先程はControl + Shift + Aを割り当てておきました.したがって,あらかじめ範囲を選択したうえでControl + Shift + Aを押せば,マクロが実行されます.
先程記録したマクロの記述を確認してみましょう.
先程記録した背景色変更マクロの記述を確認してみましょう.マクロの作成や編集はExcelに備えられたVisual Basic Editorで行います.背景色変更マクロの記述もこれで確認できます.
Visual Basic Editorの起動はメニューバーの「ツール→マクロ→Visual Basic Editor」から行います.起動すると次のような画面が出現します.
中央にあるコードウィンドウでマクロの記述をおこないます.左側にあるプロジェクトエクスプローラは,ブックに登録されたシートやモジュール(マクロの集合体)の名称が表示されます(その下のプロパティウィンドウは当面利用しません).
以下は先程記録した背景色変更マクロの実際の記述です.
1つのマクロには必ず始まりと終わりがあります.1行目の「Sub 背景色変更()」と最終行の「End Sub」は対応しており,それぞれこのマクロの始まりと終わりを示しています.また,1行目にはこのマクロの名称も書かれています.
このように,Subから始まってEnd Subで終わるマクロのことを特に「プロシージャ」と呼びます.1つのプロシージャの開始と終了の書式は以下の通りです.
Sub マクロ名() 〜 End Sub
マクロを構成する命令はすべてこの内側に記述します.
記録機能を使って作成されたマクロには,冒頭にマクロに関する情報が「コメント」として自動的に記録されます(緑字の部分).マクロはコンピュータに対する命令が書かれたものですが,場合によって,それぞれの命令に関する注釈を記述しておきたい場合があります.コメントは,マクロを構成する命令に対する注釈を書き込んだものです.
コメントを書きたい場合には,命令にあたる部分と区別するために,各行の冒頭に「'」記号を入力します.こうすると,それ以降の改行に至るまでの1行が,コメントとして命令から区別されます.
この「With」で囲まれた部分は,このマクロの実質的な命令を記述した部分です.
「With 〜」という書き方は,正しくはWithステートメントといい,ある特定の対象に対して一括して操作を行いたい場合に用います.このマクロの場合には,「Selection.Interior」に対して一括して操作を行います.Withステートメントの終わりの部分には必ず「End With」を書きます.
「Selection.Interior」とは「選択対象の内部」を意味します.VBAにおいてSelectionは「シート上で選択した対象」,Interiorは「セルの内部」を指す名称として定義されています.「.(ピリオド)」は日本語で言う「の」にあたると考えると理解しやすいです.
したがって,マクロの記述に従うと,「選択対象の内部」という対象に対して「.ColorIndex = 34」,「.Pattern = xlSolid」,「.PatternColorIndex = xlAutomatic」という3つの操作を行う事になります.
Withステートメントに囲まれた3つの命令は,「セルの書式設定」画面の以下の操作に対応します.
ColorIndexの番号は以下の通りです.
記録されたマクロは,必要に応じて内容を編集(記述の追加・削除・変更)することが出来ます.マクロの基本的な書式を確認した後で,背景色変更マクロを編集してみましょう.
マクロを記述する際の基本書式は以下の通りです.
Sub マクロ名() 命令文 End Sub
命令文は1行である場合も,複数行である場合もあります.
マクロ名には日本語あるいは半角のアルファベットを用いることが出来ます.先頭の文字に使わない限り,数字を混ぜることも出来ます.マクロの目的を的確に表す名称をつけましょう.
Sub〜End Subで囲まれた領域に命令を書き込む場合,各行の冒頭でインデント(字下げ)をします.これは,マクロの記述の論理的な構成を見やすくするための習慣です.インデントをするためにはTabキーを押します.各行を書き出す際には必ずTabキーを押す習慣を付けましょう.
記録機能を使って自動的に作成されたマクロには,必ずしも必要のない(削除しても差し支えのない)命令文が含まれることがあります.ここではそうした不要な命令文を削除して,記述をスリム化します.
スリム化を行う前に,1点だけ前提知識を学習します.
背景色変更マクロの3つの命令文の冒頭が「.(ピリオド)」で始まっているのは,それぞれがWithステートメントで宣言された対象(Selection.Interior)の続きであることを意味します.つまり,それぞれ「選択範囲の内部の<色>を...」,「選択範囲の内部の<パターン>を...」,「選択範囲の内部の<パターン色>を...」という操作を意味します.
Withステートメントは,共通する対象についての記述を省略するための書き方です.このマクロは,Withステートメントの宣言(および終了のEnd With)をせずに,以下のように書いても全く同じ命令として解釈されます(コメント部分は省略).
Sub 背景色変更() Selection.Interior.ColorIndex = 34 Selection.Interior.Pattern = xlSolid Selection.Interior.PatternColorIndex = xlAutomatic End Sub
上記の3つの命令文のうち,本質的に必要な記述は1つめの「Selection.Interior.ColorIndex = 34」です.残りの2つはアプリケーションのデフォルト設定(最初からの設定)をそのまま書き出したものであり,なくても差し支えありません.
そこで,上記のマクロは以下のようにスリム化することが出来ます.
Sub 背景色変更() Selection.Interior.ColorIndex = 34 End Sub
上記のように記述を削除し,保存した後で,このマクロがきちんと動作するかどうかを確認してみましょう.
マクロにおけるセルの参照の記述のしかたを学習します.
セルの参照を正しく記述することは,マクロを自作するうえでの最も重要なスキルです.なぜならセルの参照はExcelにおけるあらゆる処理の基本だからです.セルの参照をマクロで表現するためには様々な記述の仕方が用意されていますが,ここではその中で最も基本的なものを取り上げます.
Rangeプロパティを利用することで,特定の1つのセル,または複数のセルで構成されるセル範囲を参照することが出来ます.
1つのセルを参照する際には以下のように記述します.
Range("セル番地")
「セル番地」には,セルの位置を特定する記号を列,行の順に記入します.たとえばA1のセルを参照したい場合,以下のように書きます.
Range("A1")
セル範囲を参照する際には以下のように記述します.
Range("開始セル番地:終了セル番地")
「開始セル番地」には範囲の開始となるセル番地を,「終了セル番地」には範囲の終わりとなるセル番地を,「:(コロン)」ではさんでそれぞれ記述します.たとえばA1からB5のセル範囲を参照したい場合,以下のように書きます.
Range("A1:B5")
「プロパティ」とは,マクロによる処理や操作の対象(これを「オブジェクト」と呼ぶ)が保持する様々なデータに与えられた分類のことで,「属性」と訳されることもあります.たとえばRangeプロパティは,上記の場合,操作対象である現在表示中のワークシート,すなわちWorksheetオブジェクト,が保持するすべてのセルの中の特定のセルないしはセル範囲を参照します.ただし操作対象が「現在表示中のシート」であることは自明であるため,上記の記述において「現在表示中のシートの」にあたる記述は省略されています.
マクロから特定のセルへ文字や数値を出力したい場合,Valueプロパティを使います.ValueプロパティはRangeオブジェクト(Rangeプロパティによって参照されるデータ.実質的には操作対象のセルまたはセル範囲を指す)に属するプロパティの1つで,Rangeによって特定されるセルの保持する値を表します.
たとえば以下のマクロは,A1, B1, A2, B2に所属氏名を出力するマクロです(practice01.xls, Sheet3を空白にしておきましたので実際に試してください).
Sub 所属氏名出力1() Range("A1").Value = "○○大学" Range("B1").Value = "△△学部" Range("A2").Value = "1年" Range("B2").Value = "山田 太郎" End Sub
「=」は「代入」の操作を指示する命令です.代入とは特定の対象に値を書き込む操作です.代入をするためには「対象 = 値」の形で記述します.このとき,右辺にある値が左辺にある対象に代入,すなわち書き込まれます.
上記の例では,右辺にある文字列(文字の連なったデータ)が左辺で参照されるセルのValueプロパティに代入されます.Valueプロパティはセルの値を示すプロパティです.したがって,A1, B1, A2, B2のそれぞれのセルに,右辺に記述された文字列が代入されます.
代入する値が数値の場合,右辺の””(ダブルコーテーション)の囲みは必要ありません.
Range("B3").Value = 150
セル範囲に同じ値を一度に出力することも可能です.
Range("E1:G3").Value = "○○大学"
OffsetプロパティはRangeオブジェクトのプロパティの一つです.Offsetプロパティを用いると,基準となるセルとの相対的な位置関係でセル参照を指定することが出来ます.
Offset(行方向の移動数, 列方向の移動数)
ただし行,列,それぞれの方向の移動数は,どちらかが必要なければ省略できます.
例えばC1セルを起点に,先程の「所属氏名出力1」と同様の位置関係で所属氏名を出力してみましょう.
Sub 所属氏名出力2() Range("C1").Value = "○○大学" Range("C1").Offset(, 1).Value = "△△学部" Range("C1").Offset(1).Value = "1年" Range("C1").Offset(1, 1).Value = "山田 太郎" End Sub
上記のマクロはWithステートメントを用いて以下のように記述することも出来ます.
Sub 所属氏名入力3() With Range("C1") .Value = "○○大学" .Offset(, 1).Value = "△△学部" .Offset(1).Value = "1年" .Offset(1, 1).Value = "山田 太郎" End With End Sub
A1, B1のように特定のセルを参照するのではなく,マウスによる選択などによって「その時点でアクティブになっているセル」を参照することも出来ます.そのためにはRangeプロパティのかわりにActiveCellプロパティを用います.ActiveCellプロパティはRangeプロパティと同様にRangeオブジェクトを参照します.
たとえばマウスで選択したセルを起点に,これまでと同様の配置で所属氏名を出力したい場合,以下のように記述します.
Sub 所属氏名入力4() With ActiveCell .Value = "○○大学" .Offset(, 1).Value = "△△学部" .Offset(1).Value = "1年" .Offset(1, 1).Value = "山田 太郎" End With End Sub
マウスによって選択されたセル範囲全体を参照したい場合,Selectionプロパティを用います.「2. マクロの記録機能の利用」で登場した背景色変更マクロも実はSelectionプロパティを用いています.
Sub 背景色変更() Selection.Interior.ColorIndex = 34 End Sub
Selectionプロパティによって参照されるのは,マウスなどで選択したセル範囲全体を参照するRangeオブジェクトです.Interiorは正しくはRangeオブジェクトの属性の1つでInteriorプロパティと呼び,セルの内部の状態を表します.ColorIndexは同様にColorIndexプロパティと呼び,Interiorオブジェクト(Interiorプロパティによって参照される),すなわちセル内部の色の状態を表します.
以下の表(practice1.xls, Sheet4)の列見出しの背景色を,先程作成した背景色変更マクロで変更してみましょう.
また,表タイトル(「友人名簿」の部分)の書式は,「書式→セル...→配置タブ」で「横位置」と「縦位置」をそれぞれ「中央揃え」に,さらに「文字の制御」の「セルを結合する」のチェックボックスをオンにして作成します.このの作成過程を記録機能を使って記録し,その記述の内容を確認してみましょう.その際,記録の開始を(1)A1〜D1を選択する前,(2)A1〜D1を選択した後,と変えた場合,作成される記述はどのように異なるでしょうか.