VBA(Visual Basic for Applications)において「手続き(Procedure)」は、特定の処理をまとめて再利用可能にしたコードのブロックを意味します。手続きには主に Sub(サブプロシージャ)
と Function(関数プロシージャ)
の2種類があり、どちらもプログラムの構造を明確にし、保守性・再利用性を高めるために重要です。
以下では、VBAの手続きについて、Sub
と Function
の違い・使い方・特徴・応用まで、詳細に説明します。
◆ 1. 手続きとは?
手続きは、一連の処理をまとめたコードのまとまりで、名前をつけて定義され、必要なときに呼び出して実行することができます。
手続きを使う目的
- 処理をモジュール化して見やすく整理
- 同じ処理を繰り返し使える
- プログラムの保守性が高まる
- バグの発見や修正が容易
◆ 2. Sub(サブプロシージャ)
基本構文
Sub 手続き名()
' 実行したい処理
End Sub
例
Sub あいさつ()
MsgBox "こんにちは!"
End Sub
この手続きを呼び出すと、メッセージボックスが表示されます。
引数付きのSub
Sub 表示メッセージ(メッセージ As String)
MsgBox メッセージ
End Sub
呼び出し例:
Call 表示メッセージ("お疲れさまです!")
※ Call
は省略可能です。
◆ 3. Function(関数プロシージャ)
Function
は Sub
と違い、「戻り値(結果)」を返すことができます。セル関数のように使えるのが特徴です。
基本構文
Function 関数名(引数 As データ型, ...) As 戻り値の型
' 処理
関数名 = 戻り値
End Function
例
Function 足し算(a As Double, b As Double) As Double
足し算 = a + b
End Function
呼び出し例(Sub内で):
Sub テスト()
Dim 結果 As Double
結果 = 足し算(5, 3)
MsgBox 結果 ' 8 と表示
End Sub
また、この 足し算
関数はセル関数としても使用可能:
=足し算(5, 3)
◆ 4. SubとFunctionの違い
項目 | Sub | Function |
---|---|---|
戻り値 | なし | あり(値を返す) |
呼び出し方 | Call または 省略可能 | 戻り値を変数で受け取る |
使用目的 | 動作を実行(メッセージ表示など) | 計算や値の返却(関数的処理) |
セルでの使用 | × | ○(セル関数として使える) |
◆ 5. ByVal と ByRef(引数の受け渡し)
ByVal(値渡し)
引数の値のコピーを渡す。呼び出し元の変数は変更されない。
Sub 変更不可(ByVal x As Integer)
x = x + 1
End Sub
ByRef(参照渡し)
引数そのものを渡す。呼び出し元の変数も変更される。
Sub 変更可(ByRef x As Integer)
x = x + 1
End Sub
◆ 6. 手続きのスコープ(Public / Private)
手続きの宣言方法によって、呼び出せる範囲(スコープ)が変わります。
宣言 | 説明 |
---|---|
Public | 他のモジュールからも呼び出せる |
Private | 定義したモジュール内でのみ有効 |
Public Sub 全体から使える処理()
MsgBox "Public"
End Sub
Private Sub モジュール内専用処理()
MsgBox "Private"
End Sub
◆ 7. ネスト(手続きの中に手続きは不可)
VBAでは、SubやFunctionの中に別の手続きを定義することはできません。すべて独立して定義する必要があります。
◆ 8. エラー処理と組み合わせた例
Sub 割り算(ByVal x As Double, ByVal y As Double)
On Error GoTo エラー
MsgBox x / y
Exit Sub
エラー:
MsgBox "エラーです:" & Err.Description
End Sub
◆ 9. Functionで複数値を返す方法
戻り値が1つに限定されるため、配列やユーザー定義型、ByRef を使って複数の情報を渡すことが可能です。
Function 二乗と三乗(x As Double, ByRef 二乗 As Double, ByRef 三乗 As Double)
二乗 = x ^ 2
三乗 = x ^ 3
End Function
呼び出し:
Sub テスト()
Dim x2 As Double, x3 As Double
Call 二乗と三乗(2, x2, x3)
MsgBox "二乗:" & x2 & ", 三乗:" & x3
End Sub
◆ まとめ
ポイント | 内容 |
---|---|
Sub | 処理を実行する手続き。戻り値はない |
Function | 処理の結果(戻り値)を返す関数型の手続き |
引数の使い方 | ByVal(値渡し)、ByRef(参照渡し) |
スコープ | Public/Privateで手続きの公開範囲を制御 |
セル関数としての利用 | Functionのみ可 |
再利用性の向上・コードの整理 | 手続きを分けて管理することでメンテナンスがしやすくなる |