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