1.04 3種類のプロシージャ

以下の3種類です。
  1. ファンクション・プロシージャ
  2. サブ・プロシージャ
  3. プロパティ・プロシージャ
1.ファンクション・プロシージャ
    戻り値(返却値)を返すことができるプロシージャ。
    例えばプロシージャ名が「SampleProc」、戻り値の型がLong型だとすると、

   Dim ret As Long
   ret = SampleProc

    Function SampleProc()  As Long

        '戻り値の設定例
        SampleProc = 1
    End Function

    となります。
    変数retには「1」が入ります。なお、「return」は使用できません。

2.サブ・プロシージャ
    戻り値を返せないほかは、ファンクションプロシージャと同様です。

    Sub SampleProc() 

    End Sub

    イベントプロシージャは形式上、サブ・プロシージャに属します。

3.プロパティ・プロシージャ
    プロパティを作る際に使用するプロシージャです。以下のような記述になります。

    '扱う値の型がオブジェクトでない場合の例

    'グローバルに変数を用意。
    Private SampleValue_ As Long
    
    Ptoperty Get SampleValue() As Long
        SampleValue  = SampleValue_
    End Property
    Property Let SampleValue(ByVal vData As Long)
        SampleValue_ = vData
    End Property

GetとLetが1セットです。
Getは、呼び出す側から見て値を得るプロシージャ、Letは呼び出す側から見て値を入れるプロシージャであり、片方のみ記述することも可能です。
Getのみの場合、値の代入が不可となり、Letのみの場合、値の参照が不可となります。必要に応じて使い分けます。この点が、普通の変数を使用した場合と違います。値を他から変更されたくないなど、プログラム上の必要が生じる場合があります。そういうときにこのプロシージャが便利です。
なお、基本的に、プロパティプロシージャは値の受け渡しのみで、値のチェックロジック以外に、プログラムロジックを記載することはありません。(記述自体は可能ですが、ルール上望ましくないとされています。)
念のためLetの引数には、「ByVal」をつけましょう。

以下は呼び出し側の記述例です。

    Dim val As Long
    'Letに処理がわたります。
    SampleValue = 1

    'Getに処理がわたります。
    val = SampleValue


    '扱う値の型がオブジェクトの場合の例

    'グローバルに変数を用意する。
    Private SampleObject_ As Object
    
    Ptoperty Get SampleObject() As Object
        Set SampleObject  = SampleObject_
    End Property
    Property Set SampleObject(vObject As Object)
        Set SampleObject_ = vObject
    End Property

    基本はオブジェクト以外の場合と変わりませんが、LetがSetに変わります。
    よって、呼び出し側にもSetステートメントが必要になります。

引数による値の受け渡しについて
例えば、以下のような例です。
        Dim App As Excel.Application
        GetApp App
        App.Visible = True
        App.Quit

        Sub GetApp(App As Excel.Application)
            Set App = New Excel.Application
        End Sub

GetAppプロシージャの中でエクセルアプリケーションを生成してセットしています。
このため、呼び出し側では、引数に渡した変数にエクセルアプリケーションオブジェクトが引き渡され、その後の処理が継続できます。

このようなプログラミング方法は、可能ですが、望ましくないとされます。引数にin/outのような属性をつけられないVBAでは、この方法を許容すると、どの引数が何の目的で渡されるのかがわかりにくくなってしまいます。(プログラミングした本人にはわかりやすくとも、他人にはわかりにくい。)このため、可読性が下がるということが考えられます。
ただし、絶対的ルールというわけではなく、状況に応じて使用が前提となることもあり得ると思います。
一般的に、呼び出し側に値を返したい場合は、戻り値を使用します。
複数の値を返した場合も考えられます。この場合は、配列を使用する、コレクションを使用するなどが考えられます。


関数との違い
VBAでは、関数とプロシージャは別のものです。
関数は、VBAの環境で用意されているプログラムを指します。VBAでは関数が豊富に用意されており、自分で作る前に、欲しい機能が関数にないか調べてみることをお勧めします。作る無駄が省けます。
1.VBEを起動し、F2キーを押す。オブジェクトブラウザが表示されます。
2.<すべてのライブラリ>と表示されているドロップダウンリストボックスから、「VBA」を選択します。
3.クラスのリストに表示されるもののうち、メソッドとして表示されるものが「関数」です。
ヘルプでも探すことができます。