プロシージャの概要
プロシージャとは、多少の語弊はあるかもしれませんが、簡単に言うとプログラムのことです。
Excelマクロの開発 = プロシージャの作成、と言っても過言ではないでしょう。
Excelマクロは、以下のような構成となっており、ユーザーよってExcelマクロが起動されると、プロシージャに記述されたステートメントが処理され、何らかの結果が出力されます。
なお、標準モジュールはプロシージャを格納するフォルダのような存在で、管理しやすいように分割することもできます。
- Excelマクロ
- 1つ以上の標準モジュール
- 1つ以上のプロシージャ
- 複数行で構成されるステートメント(ステートメントとは、処理を行う1行の命令文)
- 1つ以上のプロシージャ
- 1つ以上の標準モジュール
プロシージャの詳細
プロシージャは、以下のように分類されます。
- プロシージャ全体
- 標準モジュールで作成可能なプロシージャ(一般的に「プロシージャ」とはこのことを指し、以降の説明では「プロシージャ」と記述する。)
- Subプロシージャ
- Functionプロシージャ
- イベントプロシージャ
- ワークブックで作成可能なイベントプロシージャ
- Openプロシージャ
- Activateプロシージャ
- etc…
- ワークシートで作成可能なイベントプロシージャ
- Changeプロシージャ
- Activateプロシージャ
- etc…
- ワークブックで作成可能なイベントプロシージャ
- 標準モジュールで作成可能なプロシージャ(一般的に「プロシージャ」とはこのことを指し、以降の説明では「プロシージャ」と記述する。)
プロシージャとイベントプロシージャの違いは、以下の通りです。
- プロシージャ:ユーザーによってExcelマクロが起動された場合に実行される。
- イベントプロシージャ:ユーザーがワークブック(Excelファイル)やワークシートに対して、特定の操作を行った場合に、実行される。
SubプロシージャとFunctionプロシージャの違いは、以下の通りです。
- Subプロシージャ:プロシージャの起動元に対して、戻り値を返さない。
- Functionプロシージャ:プロシージャの起動元に対して、戻り値を返す。
プロシージャは、プロシージャ全体から一部を分割してサブプロシージャとし、メインプロシージャからサブプロシージャを呼び出すような親子構造とすることができます。サブプロシージャからサブプロシージャを呼び出すような作りも可能で、何段階でも親子構造を作成することが可能です。
プロシージャの親子関係で、子プロシージャが親プロシージャに処理結果である戻り値を戻すのがFunctionプロシージャ、戻さないのがSubプロシージャです。
一般的にプロシージャの大半がSubプロシージャで作成されます。(その理由は、戻り値を戻す必要がない場合が多いのと、処理結果を戻り値ではなく、引数(引数については、後ほど詳しく解説します)で渡す場合が多いためです。)
余談ですが、Functionを日本語に訳すと一般的には「機能」となりますが、数学の世界では「関数」となります。
数学の世界で、関数は、y=f(x)という公式で表現されますが、「f」はfunctionの略です。
数学の関数は、xで構成される数式にx=aの値を渡すと、関数という数式が計算を行い、yという結果が出る、というものです。
Functionプロシージャもこれと同様で、Functionプロシージャに何らかの値を渡すと、戻り値が返ってくる、というものです。
このように、Excelマクロでは戻り値を返すFunctionプロシージャを自分で作成することが可能ですし、ExcelシートやExcelVBAには、それぞれワークシート関数、VBA関数と呼ばれる、何らかの処理を行い戻り値を返す、使用頻度の高い機能が予め提供されています。
プロシージャを作成する際、プロシージャの分割は必須ではありませんが、一般的にプロシージャのステートメントの行数が多くなった場合は、プロシージャを分割した方がいいと言われています。
また、複数のExcelマクロで共通的に使用できるプロシージャは、その部分を取り出して1つのプロシージャとし、幅広く使用した方が効率的で品質の向上につながります。
プロシージャのコーディング方法
プロシージャのコードは、以下のように記述します。
'Subプロシージャの場合
Sub プロシージャ名()
End Sub
'Functionプロシージャの場合
Function プロシージャ名()
End Function
- Subプロシージャ
Sub ~ End Subで1つのSubプロシージャとなります。
コーディングの際は、「Sub プロシージャ名」まで入力して改行すると、「Sub プロシージャ名」の後の「()」と「End Sub」は、VBEが自動で表示します。 - Functionプロシージャ
Function ~ End Functionで1つのFunctionプロシージャとなります。
コーディングの際は、「Function プロシージャ名」まで入力して改行すると、「Function プロシージャ名」の後の「()」と「End Function 」は、VBEが自動で表示します。
イベントプロシージャは別途解説
イベントプロシージャについては、ExcelVBAを網羅的にマスターする上では必修ですが、ExcelVBAの習得の初期段階では不要と思われますので、別途解説することにさせていただきます。