機能分割のすすめ
「機能分割」とは、具体的にはプロシージャを呼び出す単位より細かい単位で作成することで、その単位は「機能」として明確に名前が付けられるものにすることを言います。
-
「マクロの記録」からVBAを始めた方が多いと思いますから、プロシージャは「標準モジュール」に作成する機能ごとに1つ作成するのが普通です。
ですが、作成する機能が複雑になって来ると「機能の部品化」の必要性が発生するものです。
大きな機能になると、この「機能の部品化」を行なわずに1つのプロシージャに全てプログラミングすることが困難になってくることはご理解いただけると思います。
一方、1つのプロシージャに書き切れないから部品化するのではなく、同じ記述が何回も発生する場合にその「同じ記述」の部分を「部品」として切り出そうという考え方もあると思います。
この「機能の部品化」をどのように行なうかがここでの「機能分割」の考え方です。
-
プログラム開発の部署では、「コーディング規約」などに次のような規則を盛り込むことがあります。
どういったことを規則にするかは意味があって、その規約に明文化されるべきことですが、代表的な項目は以下のようなものです。
- GoToの使用は禁止。(On Errorは別扱いが普通)
⇒現在では初心者向けの学習でも「GoTo」が出てくることはありませんが、古いソースプログラムの互換性のために残されているものです。
実行時にソースプログラム上の動作位置が秩序無く移動できてしまうので、検証を難しくしてしまう要因であり、禁止すべきものです。
但し「On Error GoTo」はVBAでは正常動作以外での異常処理として不可欠なので禁止すべきではありません。(禁止できません)
- 1行の文字数(半角換算値)の上限を設定する。(折り返しは除外が普通)
⇒これはソースプログラムを見やすくするための規則です。
画面上や印刷時のソースプログラムを見た時に、1行があまりに長いと左端と右端が同じ行であることが判りにくくなってしまうため、
一般には1行を半角換算で100文字程度を上限に設定します。
さほど複雑でないロジックでも長い変数名などの利用でこの制限を超えてしまうようなケースがありますが、この時は折り返しを用いれば
制限に掛からないとするのが一般的です。
- プロシージャタイトル・判断・分岐・繰り返しには説明コメントを設定する。
⇒大きなプログラムになると複数のプロシージャに分割されることになるので、それらのプロシージャについてソースプログラム上で
見やすくするためにタイトルコメントを付けます。
特に下記以降で説明する機能分割において、分割されたプロシージャに名前を付けることは重要です。
さらにプロシージャ内の判断・分岐・繰り返しなどのステップでも何をしているのかの説明が重要です。
- 1つのプロシージャの行数の上限を設定する。
⇒既にこういった規約がある場合、1つのプロシージャの行数の上限を設定することは多いようです。
ソースプログラムを見やすくするためには必要なのですが、単に行数制限のために無理矢理分割するということではないように
規則化してほしいです。
例えばExcelシートとデータベースのやりとりでも1行分の処理が100項目を超えることは度々あると思います。
これらの項目処理が1項目ずつでしか行なえない時に、「100行上限」だった場合、どうやってプロシージャを分割するのかと言う話です。
分割したそれぞれのプロシージャには機能分割として役割の名称を付けるのが前提なので、行数上限制限は「めやす」として、
機能として名前が付けられる小さい単位とするようにできれば良いと思います。
- 判断や繰り返しのネストの階層数を制限する。
⇒これは「1行の文字数」と意味が一部重複しますが、機能分割としては重要なことです。
判断や繰り返しの中の処理が数行であれば良いですが、さらに深いネストをするならそうではなく、名前を付けられる処理のはずなので
別のプロシージャに分けられるはずです。
これらは、プロシージャの1つ1つを小さいものににしたり、日本語説明を付加することで、見やすいものにすることを目的としています。
「見やすい」というのは、不具合が起きた時にソースプログラム上で発生箇所を特定しやすくするなど、解決の早期化やコスト削減に繋がるものです。
初期のプログラム作成者が永久に運用・保守を行なうのかという点に着目して下さい。
- 「構造化プログラミング」では、上のような単なる「数値制限」ではなく、プログラムを処理構造から考えて、機能を「箱」に描いていきます。「箱」は上下の階層を持ち、上の「箱」は下の「箱」を呼び出しますが、この時、上の「箱」は制御、下の「箱」は処理という役割りになります。
一般には「箱」の単位は「機能に日本語で名前を付けられる最小単位」と考えれば良いと思います。
それぞれの「箱」には、その機能を示す明確な名前が付けられて、階層構造を図式化したものをプログラム設計書に添付します。これを「モジュール構成図」などと呼びます。

「モジュール構成図」の具体例は「日本語で説明できる機能に細分化します。」以降で詳しく説明しています。
- 「モジュール構成図」の「モジュール」とは、この「箱」のことです。コンピュータ言語や開発方法によって「モジュール」といったり、場合によっては「ルーチン」といったりします。VBAではこれが「プロシージャ」になります。
VBAでの「Module(モジュール)」は「モジュール構成図」の「モジュール」ではなく、「プロシージャ」の集合体です。
- 簡単な処理であれば、呼び出すプロシージャの中で全てが完結してしまいますが、大きな仕組みを作るようになってくると、こういったプログラムの構造を考えなければならないようになります。細かい機能の「箱」はいわば「部品」であり、その「部品」の実装方法が「モジュール設計(構成)」で、その設計に従って作成したプログラムが「製品」となります。
- 「部品」に分けることは、その「部品」単位で動作確認(テスト)することで「製品」の品質を向上できます。また、機能が明確な「部品」であれば、他の「製品」を新たに作る時に流用でき、その時その「部品」は動作確認(テスト)済みなので、全体のテスト作業が軽減できるようになります。
- 実は、「構造化プログラミング」というだけで本1冊できてしまう位大きな内容で、このコーナーで説明し切れるものではありません。ここでは、そういう考え方でプログラム全体を捕らえながら作成していくものだということをご案内しておきます。