VBA-プロシージャ

VBAプロシージャとは

プロシージャとは、VBAにおける処理まとめたを単位であり、SubプロシージャとFunctionプロシージャの2種類あります。

他のプログラム言語における関数と同様、一連の処理をプロシージャにまとめることで再利用処理が可能です。

Subプロシージャはマクロの実行開始点となりますが、Functionプロシージャはマクロの実行開始点にはなりません。


Subプロシージャ

Subプロシージャが戻り値を返さない関数です。

引数を受け取りますが、戻り値を返しません。

マクロを実行する際、Subプロシージャは処理開始点になります。


Sub sum(num1 As Integer, num2 As Integer)
    Dim total As Integer
    total = num1 + num2
    MsgBox total
End Sub

Functionプロシージャ

Functionプロシージャは引数を受け取り、戻り値を返すという関数としての役割を果たすことができる。

マクロを実行する際、Functionプロシージャは処理開始点になります。


戻り値を返却するには、Functionプロシージャ名に戻り値を代入します。

戻り値のデータ型を「Function() As データ型」として宣言する必要があります。


Function sum(num1 As Integer, num2 As Integer) As Integer
    Dim total As Integer
    total = num1 + num2
    '戻り値
    sum = total
End Sub

exit subステートメント

Subプロシージャの途中で抜けるにはExit Subステートメントを使用します。


Sub sum(num1 As Integer, num2 As Integer)
    Dim total As Integer
    total = num1 + num2
    if (total < 0) Then Exit Sub
    MsgBox total
End Sub

exit functionステートメント

Functionプロシージャの途中で抜けるにはExit Functionステートメントを使用します。


Function sum(num1 As Integer, num2 As Integer) As Integer
    Dim total As Integer
    total = num1 + num2
    '戻り値
    If (total < 0) Then
        sum = -1
        Exit Function
    End If
    sum = total
End Sub

publicとprivate

VBAではプロシージャのスコープ(参照範囲)をpublic/privateステートメントで指定します。

なお、ステートメントを省略した場合にはpublicが適用されます。


public

プロシージャをプロジェクト上で公開するにはpublic宣言を使用します。

publicプロシージャはVBAプロジェクト上のいずれのモジュールからでも呼び出せるになります。


public Function _
sum(num1 As Integer, num2 As Integer) As Integer
    Dim total As Integer
    total = num1 + num2
    sum = total
End Sub

Public Sub sum_start()
    Dim total As Integer
    total = sum(10, 5)
    MsgBox total
End Sub

private

プロシージャをプロジェクト上で公開しない場合にはprivate宣言を使用します。

「Private」で宣言すると、当該モジュール内の各プロシージャからは参照できますが、プロジェクト内の他のモジュールからは参照できません。


Subプロシージャに対してPrivateを設定すると、実行マクロの一覧で表示されなくなります。

ただし、ボタンから実行することやプロシージャ指定で実行することが可能です。

マクロの存在を隠したい場合にSubプロシージャをPrivate指定します。


Private Function _
sum(num1 As Integer, num2 As Integer) As Integer
    Dim total As Integer
    total = num1 + num2
    sum = total
End Sub

Private Sub sum_start()
    Dim total As Integer
    total = sum(10, 5)
    MsgBox total
End Sub

引数の参照渡しと値渡し

プロシージャへの引数の渡し方はByval/Byrefステートメントで指定できます。

省略すると引数は「ByRef」と見なされます。


Byval

Byvalは「値渡し」です。

変数を渡されたプロシージャー側で引数の値を変更しても、呼び出し元のプロシージャーの変数の値も変わりません。


Private Function _
sum(Byval num1 As Integer, Byval num2 As Integer, Byval total As Integer)
    total = num1 + num2
End Sub

Public Sub sum_start()
    Dim total As Integer
    total = 0
    sum(10, 5, total)
    MsgBox total '0のまま
End Sub

Byref

ByRefは「参照渡し」です。

変数を渡されたプロシージャー側で引数の値を変更すると、呼び出し元のプロシージャーの変数の値も変わります。


Private Function _
sum(Byval num1 As Integer, Byval num2 As Integer, Byref total As Integer)
    total = num1 + num2
End Sub

Public Sub sum_start()
    Dim total As Integer
    total = 0
    sum(10, 5, total)
    MsgBox total '15
End Sub

関連ページ