エクセルの関数・マクロ・VBAが無料で分かる。
HOMEエクセル VBA > プロシージャ

プロシージャ

Excelでいうマクロのことを、VBAでは「プロシージャ」と呼んでいます。プロシージャとは、処理の実行単位のことで、1つのマクロが1つのプロシージャです。 プロシージャには、「Subプロシージャ」や「Functionプロシージャ」など、機能によりいくつかの種類があります。 プロシージャの構成要素には、キーワード、コメント、ステートメントがあります。また、プロシージャからはほかのプロシージャを呼び出して実行すること もできます。マクロで頻繁に行う処理をプロシージャとして独立させて、複数のプロシージャから呼び出して利用できます。


プロシージャの構成要素

プロシージャは、ステートメント、コメント、キーワードで構成されています。それぞれの用語の意味や、使い方を理解しておくことがプログラミング を行う際に必要となります。


ステートメント

ステートメントとは、プロシージャ内の1行1行のことで、1行が1つの命令文になります。1ステートメントは1行で記述します。 また、プロシージャ内では、上のステートメントから順番に処理が実行されます。


※マクロは上から下へ、1行ずつ実行されます
Sub 週間スケジュール作成() '[週間スケジュール作成]というマクロを記述する

    Range("A4").Value = Range("D1").Value '1行 = 1ステートメント = 1命令文。セルA4にセルD1の内容を表示する
    Range("A4").AutoFill Destination:=Range("A4:A10") 'セルA4の内容をセルA4〜A10にオートフィルを使ってコピーする
    Range("C4:D10").ClearContents 'セルC4〜D10の内容を消去する
    Range("A1").Select 'セルA1を選択する

End Sub 'マクロの記述を終了する


命令文としてのステートメントとキーワードとしてのステートメント
ここで説明したのは、命令文としてのステートメントですが、これ以外に、キーワードとしてのステートメントがあります。たとえば、 Dateステートメントはシステム時刻を設定するキーワードで、Killステートメントは、ファイルを削除するキーワードです。 これらのキーワードはそれ自体特別な意味を持っています。Do〜LoopステートメントやIf〜Then〜Elseステートメントも、 処理を制御するためのキーワードをもつステートメントです。このように、ステートメントには2種類あることに注意してください。


■ステートメントを複数行に分割する
1ステートメントは、1行で記述します。しかし、1行が画面をスクロールしなければ表示できないほど長い場合は、行継続文字( _)を使って1ステートメント を複数行に分割することができます。長いステートメントは複数行に分割することで、読みやすく、編集しやすくなります。 行継続文字は、改行したい位置で「半角スペース」+「_(半角アンダースコア)」を入力します。行継続文字を入力した後と、改行して複数行に入力しても 1行としてみなされます。

1ステートメント

長いステートメントは、行継続文字を使用して2行に分けて書くことができます。

1つのステートメントが長すぎて1画面で表示できない場合、行継続文字を使用して1つのステートメントを2行に分割します。

1ステートメントの分割

@分割する位置にカーソルを移動

A「 (半角スペース)」+「_(半角アンダースコア)」を入力

B[Enter]キーを押す

1ステートメントの分割後


アンダースコアの入力方法
アンダースコアは、半角英数モードで[Shift]+[ろ]キーを押して入力します。また、アンダースコアは、アンダーバーとも呼ばれることがあります。

ステートメントの改行できる位置
行継続文字は、カンマの前後、ピリオドの前後のような区切りのよい箇所に挿入してください。 プロパティやメソッドのような単語の途中や、文字列の途中に挿入することはできません。



■1行に複数のステートメントを記述する
1ステートメントが短い場合は、ステートメントの後ろに「:(半角コロン)」を入力して、続けて別のステートメントを記述することができます。 行数を少なくしたい場合に利用すると便利です。

@1行目のステートメントの後ろに「:(半角コロン)」を入力する
1行目ステートメント

A「:」に続けて次のステートメントを入力する
2行目ステートメント

2行のステートメントが1行にまとめられました


コメント

コメントとは、ステートメントの先頭に「’(シングルクォーテーション)」が入力されている行のことで、緑色の文字で表示されます。 コメントの部分は、マクロ実行時には無視されます。そのため、ステートメントを一時的に実行したくない場合や説明文を付けたい場合に コメントを使います。また、行の途中で「'」を記入すると、それ以降の文字列はコメントとなり実行されないので、行末に説明などを入れたい場合に便利です。


コメントを作成するにはコメントにする部分の先頭に「'」を入力する
コメントの部分は緑色の文字で表示される
コメントだよ




■ツールバーを使用してコメント行を設定する [編集]ツールバーの[コメントブロック]ボタンを使用して、コメントにする行を簡単に設定することができます。 また、複数行をまとめてコメント行にすることもできます。

@[表示]をクリック

A[ツールバー]に合わせる

B[編集]をクリック


編集をクリック

編集ツールバーが表示

[編集]ツールバーが表示されます

Cコメント行にしたい行を選択し

D[コメントブロック]をクリックします

[コメントブロック]をクリック

選択していた行がコメント行に変わる

選択していた行がコメント行に変わりました


コメント行を解除するには
コメント行を解除するには、コメント行を解除したい行を選択して[編集]ツールバーの[非コメントブロック]ボタンをクリックします。



キーワード

キーワードとは「Sub」や「End」など、VBAによって特別な意味を持っている文字列や記号のことで、ステートメント名、関数名、演算子などがあります。 キーワードと同じ文字列をプロシージャ名(マクロ名)や変数名に利用することはできません。


青い文字で表示されるキーワード
一部のキーワードは、コードを入力した後で改行すると文字の色が青くなります。 関数名などは、入力しても青文字で表示されません。



SubプロシージャとFunctionプロシージャ

VBAでよく使用するプロシージャに「Subプロシージャ」と「Functionプロシージャ」があります。 Subプロシージャは、主に処理を実行するプロシージャです。マクロの記録機能で作成されるマクロはすべてSubプロシージャになります。 また、Functionプロシージャは、処理をした結果の値を返すプロシージャで、Excelのワークシートで使う関数のように扱うことができます。


Subプロシージャの構成

Subプロシージャは、「Subステートメント」で始まり、「End Subステートメント」で終わります。 先頭のSubの後ろに半角スペースを空けて、「プロシージャ名()」を入力します。 Subの後ろの半角スペースを忘れると、プロシージャとして認識されないので注意してください。


プロシージャ名の後ろの()
Subステートメントのプロシージャ名の後ろの()は、Subプロシージャの実行に引数を必要とする場合に、()内にその必要とする引数を指定するためにあります。 引数を必要としないSubプロシージャであっても空の()は必ず記述しなければなりません。実際に入力する場合には、「Sub プロシージャ名」と入力し、 [Enter]キーを押して改行すると、プロシージャ名の後ろに()が自動的に追加され、カーソルの下の行に「End Sub」も表示されます。



Functionプロシージャの構成

Functionプロシージャは、「Functionステートメント」で始まり、「End Functionステートメント」で終わります。 Functionプロシージャは、実行後に戻り値が返るため、それを格納するための変数が必要となります。変数とは、値を格納するための入れ物のことです。 Functionプロシージャの戻り値を格納する変数名には、プロシージャ名を使い、「プロシージャ=戻り値」と記述します。


Functionプロシージャで引数を指定する
Functionプロシージャには、戻り値を得るための情報として、引数を必要とするものがあります。 たとえば、三角形の面積を求めるFunctionプロシージャを作成する場合、底辺と高さが必要な情報となります。 これらをFunctionステートメントのプロシージャ名の後ろの()内に「Function 三角形(底辺,高さ)」のように設定します。



プロシージャの連携

SubプロシージャやFunctionプロシージャは、他のプロシージャから呼び出して実行することができます。 汎用性のある処理を小さなプロシージャに分割して作成すれば、作成するプロシージャがシンプルになり、再利用がしやすくなります。 ここでは、Subプロシージャ同士の連携のみ説明します。


■すべての処理を1つのプロシージャに書いた場合
すべての処理を1つのプロシージャに書いた場合、1つのプロシージャのみですべての処理が実行できますが、コードが長くなり、 コード修正作業に時間がかかってしまいます。



■プロシージャを連携させた場合
実行する処理のいくつかを小さいプロシージャとして独立させると、すべての処理を実行するのに複数のプロシージャを必要としますが、 独立したプロシージャを複数のプロシージャから呼び出して利用でき、コードがシンプルになため、修正作業に時間がかかりません。




親プロシージャとサブルーチン

他のプロシージャを呼び出すプロシージャを親プロシージャといい、呼び出されるプロシージャをサブルーチンといいます。 親プロシージャからサブルーチンを呼び出す場合は、サブルーチンのプロシージャ名を記述します。 また、例のように[ファイルを開く]プロシージャで、開くファイルを指定する場合には、そのファイル名を引数としてサブルーチンに渡します。


引数を使用するときの注意
サブルーチンに引数を渡す時は、サブルーチン名の後ろに半角スペースを空けて引数を指定します。 サブルーチンで複数の引数が必要とされる場合は、サブルーチンに渡す引数の数を一致させます。 サブルーチンで必要とされる引数の数とサブルーチンに渡す引数の数や順序が異なるとエラーになります。

名前付き引数で引数の値を指定する
親プロシージャからサブルーチンを引数を指定して呼び出すとき、引数の順序を正しく指定しないとエラーになりますが、 サブルーチンの引数名を指定すると、引数の順番を入れ替えてもエラーになりません。

Callステートメントを使ってサブルーチンを呼び出す
サブルーチンを呼び出すときに、呼び出すプロシージャ名を記述するだけだと、それがプロシージャ名なのかどうかがすぐに分からないことがあります。 そこで、Callステートメントを使用して「Call 呼び出すプロシージャ名」と記述することにより、明示的にサブルーチンを呼び出すことができます。 ただし、Callステートメントを使用する場合に、引数をサブルーチンに引き渡すには、引数を()で囲まないとエラーになります。