全体を常に頭の中に入れておけない場合は、図式化した仕様書を起こす。

ここまでの説明で、「制御」「処理」といった機能分割の考え方がいくらかかでもご理解いただけたでしょうか。
普通の一括処理は、通常、「前処理」「主処理」「後処理」に分割できます。



前処理、主処理、後処理の分割の図
モジュール構成図はこのようになります。
この「前処理」「主処理」「後処理」は、下記のような役割分担になります。
全体制御 ここでは「前処理」「主処理」「後処理」をどのように呼び出すかだけを記述します。
何かの判断によるのか、または何かの条件で繰り返すのかということです。
判断や繰り返しがないなら、
①「前処理」を行なう。
②「主処理」を入力データの終了まで繰り返し行なう。
③「後処理」を行なう。
だけの処理になります。
前処理 「制御」の中の先頭の方で1回だけ呼ばれる処理です。
主に初期化、初期値のセットなどをこの段階で行ないます。
主処理 データの件数分、1件あたり1回ずつ呼び出される処理です。
呼び出し回数を決めるのは、「制御」が行なう仕事であり、「主処理」自体は単純に1件分の処理を行なうだけの作業です。
後処理 「制御」の中の最後の方で1回だけ呼ばれる処理です。
主に処理結果の通知(表示)を行ないます。


では、簡単なサンプルで説明してみます。
例えば、一覧表の合計を作成する処理を考えてみましょう。Excelでは計算式を1つのセル入れるだけで終わってしまいますが、あえて1行ずつ加算していく処理を作成するとしたら、
全体制御 ①「前処理」を行ないます。
②「主処理」を集計対象行全てに繰り返して行ないます。
③「後処理」を行ないます。
前処理 ①「合計」の変数を初期化します。
②これから加算していく一覧の行カウンタに1行目の行番号をセットします。
主処理 ①現在行の数量と単価を乗算して、結果を「合計」に加算します。
②行カウンタに次の行の行番号をセットします。つまり、行カウンタに1を加えます。
後処理 ①「合計」を最終行の次の行にセットします。
となります。
これで、「全体制御」は、まず「前処理」を呼び、次に「主処理」を最終行まで繰り返して呼び出し、最後に「後処理」を呼び出すことで、合計が表示されます。

この考え方(「箱」単位を崩さずに)で、コードを書いてみることにしましょう。
B2行目から11行目までを集計し、12行目に合計をセットすることにします。
※ここでは「構造」の説明のみなので、逆に「引数」などは使わないサンプルとしています。

'***************************************************************************************************
'   単純合計のサンプル
'
'   作成者:井上治  URL:https://www.ne.jp/asahi/excel/inoue/ [Excelでお仕事!]
'***************************************************************************************************
Option Explicit
'===================================================================================================
' 変数の宣言(引数などを説明から除外するためモジュール変数を使います)
Private g_lngRow As Long                                            ' 行
Private g_crnKingaku As Currency                                    ' 金額

'***************************************************************************************************
'  ■全体制御
'***************************************************************************************************
Sub 単純合計のサンプル()
    '-----------------------------------------------------------------------------------------------
    ' 前処理(最初に1回だけ)
    Call 前処理
    ' 主処理は11行まで繰り返す
    Do While g_lngRow <= 11
        Call 主処理
    Loop
    ' 後処理(最後に1回だけ)
    Call 後処理
End Sub

'***************************************************************************************************
'  ■前処理
'***************************************************************************************************
Private Sub 前処理()
    '-----------------------------------------------------------------------------------------------
    g_crnKingaku = 0                                        ' 合計を初期化
    g_lngRow = 2                                            ' 集計先頭行をセット
End Sub

'***************************************************************************************************
'  ■主処理
'***************************************************************************************************
Private Sub 主処理()
    '-----------------------------------------------------------------------------------------------
    ' B列の値を合計に加算
    g_crnKingaku = g_crnKingaku + Cells(g_lngRow, 2).Value
    ' 行を加算
    g_lngRow = g_lngRow + 1
End Sub

'***************************************************************************************************
'  ■後処理
'***************************************************************************************************
Private Sub 後処理()
    '-----------------------------------------------------------------------------------------------
    ' 行を加算(間1行空けるため)
    g_lngRow = g_lngRow + 1
    ' 合計をセット
    Cells(g_lngRow, 1).Value = "合計"                       ' 見出し
    Cells(g_lngRow, 2).Value = g_crnKingaku                 ' 合計額
End Sub

'------------------------------------------<< End of Source >>--------------------------------------
このようになります。
記述自体にも設計と同様にタイトルを付けると見やすくなります。それぞれの機能が単純化されるので、記述間違いも見つけやすく、さらに機能変更の要求にも柔軟に対応できるようになります。

ここでは1階層だけですが、複雑な機能の処理では「前処理」「主処理」「後処理」がそれぞれ「制御」として機能してさらに下層の「処理」を呼び出すような構造になります。
少し、解りました? 「新しいマクロの記録」で簡単なマクロを作ったことがある方は、複数のプロシージャが出てきたり、変数が出てきたり、記録では登場することのない判断・分岐・繰り返し(ここでは繰り返しだけ)の記述に出会います。
ここでの考え方は、「部品化」です。「製品」は「部品」の集まりです。この「部品」にはそれぞれ明確な機能があるので、その機能に日本語で名前を付けます。上記の設計書の図式の11つの「箱」が1つの「部品」です。
この例は単純なものですが、皆さんが作りたいと思っている仕組みはもっともっと複雑になってしまうのではないでしょうか。でも、このように図式化して、「部品」の箱を作っていき、1つの「部品」の中をさらに細かい「部品」に落としていくことで全体の機能を仕上げていくのです。

では、次頁で「大分類」「中分類」「小分類」といった多段階の集計を行なう仕組みを考えてみましょう。