モジュールとプロシージャ

プロジェクト内のモジュールや、モジュール内のプロシージャの関係を説明します。
「プロジェクト」
「プロジェクト」は実行単位の仕組みの「かたまり」とでも説明すると理解していただけるでしょうか。
Excelの場合は、1つのワークブックが1つの「プロジェクト」となるので、理解しやすいと思います。
BASICの基礎的なことの説明の部分ですが、「プロジェクト」とか「モジュール」とかは古いBASICの概念ではなく、おそらくVisualBasicが出てきてからのことだと思います。ですが、この後の「変数の有効範囲」などに関わることであるため、あえてここで説明しておきます。

「モジュール」
「モジュール」は、「プロジェクト」の中の構成単位です。これまで「判断」「分岐」「繰り返し」などを説明したのが「標準モジュール」という種類の「モジュール」です。

VBプロジェクトの構成要素

このサンプルは、VBEの左上にある「プロジェクトエクスプローラ」で、デフォルト名で各モジュールを追加して見たものです。Excelワークブックは普通に見ると、「ワークブック自体の中にワークシートが1つ又は複数収容されている」ことは誰でも理解できていると思いますが、「仕組みの構成」から考えると、その他にこういった構成要素があります。もちろん「ワークブック」や「シート」もご覧のように「プロジェクト」の構成要素であり、ここに表示されているそれぞれにプログラムである「コード」が書き込めるようになっています。

「標準モジュール」のことを単に「モジュール」と呼ぶことはありますが、ここでの「モジュール」はそうではなく「プログラムコードを書くことができる場所」を指しています。 「Sheet」も「ThisWorkbook」も「Class」も含まれ、その11つが「モジュール」です。

「プロシージャ」
「プロシージャ」とは仕組みの中で動作する最小単位のことです。プログラムはいろいろな方法で実行されますが、1つの実行で呼び出されるのが1つの「プロシージャ」です。
ですが、呼び出された「プロシージャ」は「親分」であり、この「親分」は仕事をそれぞれの担当の「子分」にやらせるので、中でいくつもの「プロシージャ」が発生しうるわけです。
ExcelVBA等は1つのスレッドでしか動かないので、「子分」は分散されていても同時には動きません。「プロシージャ」を分割するのは、あくまでも「作り手」の発想によります。
すなわち、大きな仕組みになるものを作り上げるのに、
  • 明確かくな機能を別に切り出して分割する。
  • 同じ内容の記述が重複して発生する場合は、共通なものとして切り出す。
  • 他に転用できそうな機能は、あえて別「プロシージャ」として切り分けておく。
  • 1「プロシージャ」が長いのはメンテナンスに支障が出るため、これを考慮して説明の付く機能単位に切り分ける。
などの点を考慮して「プロシージャ」は分割させるのが普通です。
「プロシージャ」から別の「プロシージャ」へは「Call」で呼び出すことができ、引数を手渡すこともできます。
「プロシージャ」には、「Subプロシージャ」とFunctionプロシージャ」があり、「Subプロシージャ」は一方的に処理をするだけなのに対し、Functionプロシージャ」は処理結果などを呼び元に返送させることができます。


'***************************************************************************************************
'   判断・分岐処理(多分岐)のサンプル                                Module1(Module)
'
'   作成者:井上治  URL:https://www.ne.jp/asahi/excel/inoue/ [Excelでお仕事!]
'***************************************************************************************************
'変更日付 Rev  変更履歴内容------------------------------------------------------------------------>
'03/06/24(1.00)新規作成
'16/11/19(1.10)*.xlsm化
'20/01/17(1.11)記述整理等
'***************************************************************************************************
Option Explicit

'***************************************************************************************************
'   ■■■ シートからの起動処理 ■■■
'***************************************************************************************************
'* 処理名 :TEST6
'* 機能  :判断・分岐処理のサンプル
'---------------------------------------------------------------------------------------------------
'* 返り値 :(なし)
'* 引数  :(なし)
'---------------------------------------------------------------------------------------------------
'* 作成日 :2003年06月23日
'* 作成者 :井上 治
'* 更新日 :2020年01月17日
'* 更新者 :井上 治
'* 機能説明:
'* 注意事項:
'***************************************************************************************************
Sub TEST6()
    '-----------------------------------------------------------------------------------------------
    ' A1セルに評価点を入れる
    Select Case Cells(1, 1).Value
        Case 100:       MsgBox "満点です。おめでとう!!"
        Case 99:        MsgBox "ほとんど満点です。おめでとう!!"
        Case Is >= 95:  MsgBox "おしい!!次でがんばろう!"
        Case Is >= 90:  MsgBox "上出来です。今度はもっとがんばろう!"
        Case Is >= 80:  MsgBox "一応、上位ですが「天狗」にならないように"
        Case Is >= 50:  MsgBox "中くらいです。"
        Case Is >= 30:  MsgBox "良くありません。"
        Case Else:      MsgBox "やり直してきなさい!"
    End Select
End Sub

'------------------------------------------<< End of Source >>--------------------------------------

Functionプロシージャ」は、呼び元に通知する内容を、プロシージャ名にセットすることで呼び元に通知されます。呼び元は「Call」で呼ばずに、「=」の右辺にFunctionプロシージャ」をセットするだけです。

この他に「プロパティ」というものがありますが、ここでの説明は省略とし、「ユーザーフォーム」のところで説明します。