Excel VBAを学習していると、
ほぼ確実に次のような疑問に直面します。
- 「SubとFunctionって何が違うのか分からない」
- 「どちらを使えば正解なのか判断できない」
- 「Functionにした方が良さそうだが、Subでも動く」
- 「他人のVBAを読むと設計がバラバラに見える」
VBA初心者の多くは、
SubとFunctionの違いを“動作の違い”だけで理解しようとしてしまいます。
しかし、それでは必ず限界がきます。
実務で扱うVBAは、
- 処理が長くなる
- 複数のプロシージャが絡む
- 修正や拡張が頻繁に発生する
ため、
「どちらを使うか」は設計そのものになります。
この記事では、Excel VBA初心者〜中級者の方を対象に、
SubとFunctionの違いを「文法・役割・設計・実務」の視点から徹底解説します。
最後まで読むことで、
- 迷わず使い分けられる
- 他人のコードが読みやすくなる
- 設計に自信が持てる
状態になることを目指します。
目次
- ✅ そもそもSubとFunctionは何者なのか
- ・Subとは何か
- ・Functionとは何か
- ・最大の違いを一言で言うと
- ✅ SubとFunctionの基本構文の違い
- ・Subの基本構文
- ・Functionの基本構文
- ・構文上の違いまとめ
- ✅ 初心者がSubとFunctionで混乱する理由
- ・Subで値を返しているように見える例
- ・なぜこれはFunctionではないのか
- ✅ SubとFunctionを分ける最大の判断基準
- ・基準は「戻り値が主役かどうか」
- ・Functionに向いている処理
- ・Subに向いている処理
- ✅ SubとFunctionの役割をコードで比較する
- ・Subの例:処理を実行する
- ・Functionの例:結果を返す
- ✅ 呼び出し方の違いが設計に与える影響
- ・Subの呼び出し
- ・Functionの呼び出し
- ・この違いが重要な理由
- ✅ Functionは「部品」、Subは「動作」
- ・部品としてのFunction
- ・動作としてのSub
- ✅ Functionを使うことで得られるメリット
- ・メリット① 可読性が上がる
- ・メリット② テストしやすい
- ・メリット③ 再利用性が高い
- ✅ Subでまとめるべき処理の特徴
- ・Subに向いている処理の共通点
- ・例:メイン処理
- ✅ Functionにしてはいけない処理
- ・NG例
- ・なぜNGなのか
- ✅ ユーザーフォームとSub / Functionの関係
- ・やってはいけない例
- ・正しい設計例
- ・Functionはどこで使うか
- ✅ SubとFunctionの使い分けでよくある誤解
- ・Functionの方が上級者っぽい?
- ・すべてFunctionにした方が良い?
- ✅ 実務での判断フロー(迷ったらこれ)
- ✅ まとめ:SubとFunctionの違いは「役割」
✅ そもそもSubとFunctionは何者なのか
最初に、SubとFunctionを正しく定義しておきましょう。
ここが曖昧だと、以降の説明がすべてぼやけます。
・Subとは何か
Subは、
処理を実行するためのプロシージャです。
- 何かをする
- 動作を起こす
- 状態を変える
といった「行動」を担当します。
・Functionとは何か
Functionは、
処理を行い、結果を返すプロシージャです。
- 計算する
- 判定する
- 値を生成する
といった「結果」を返す役割を持ちます。
・最大の違いを一言で言うと
- Sub:処理を実行する
- Function:値を返す
この違いがすべての判断基準になります。
✅ SubとFunctionの基本構文の違い
まずは、文法的な違いを整理します。
・Subの基本構文
Sub SampleSub()
MsgBox "処理を実行します"
End Sub
・Functionの基本構文
Function SampleFunc() As Long
SampleFunc = 10
End Function
・構文上の違いまとめ
| 項目 | Sub | Function |
|---|---|---|
| 戻り値 | なし | あり |
| 呼び出し | Call / 直接 | 式の中で使用可 |
| 目的 | 処理 | 値の取得 |
✅ 初心者がSubとFunctionで混乱する理由
多くの初心者がこう思います。
「Subでも変数を返せるのでは?」
確かに、
Subでも引数を使えば値を“変更”できます。
しかし、これが混乱の原因です。
・Subで値を返しているように見える例
Sub GetValue(ByRef result As Long)
result = 10
End Sub
・なぜこれはFunctionではないのか
- 値を返しているように見える
- しかし実際は「引数を書き換えている」だけ
👉 設計としては非常に分かりづらい状態です。
✅ SubとFunctionを分ける最大の判断基準
ここで、最重要ポイントを示します。
・基準は「戻り値が主役かどうか」
- 結果(値)が欲しい → Function
- 処理そのものが目的 → Sub
これだけで、ほとんどのケースは判断できます。
・Functionに向いている処理
- 計算結果を返す
- 最終行を取得する
- 条件判定を行う
・Subに向いている処理
- シートをクリアする
- ファイルを保存する
- メッセージを表示する
✅ SubとFunctionの役割をコードで比較する
・Subの例:処理を実行する
Sub ClearSheet(ws As Worksheet)
ws.Cells.Clear
End Sub
👉 戻り値は不要
👉 実行することが目的
・Functionの例:結果を返す
Function GetLastRow(ws As Worksheet) As Long
GetLastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
End Function
👉 値が主役
👉 他の処理で使い回せる
✅ 呼び出し方の違いが設計に与える影響
SubとFunctionは、
呼び出し方が大きく異なります。
・Subの呼び出し
Call ClearSheet(Sheet1)
・Functionの呼び出し
lastRow = GetLastRow(Sheet1)
・この違いが重要な理由
Functionは、
- 式の中で使える
- 他のFunctionと組み合わせられる
という強力な特徴を持ちます。
✅ Functionは「部品」、Subは「動作」
設計的に分かりやすい考え方です。
- Function:部品
- Sub:動作
・部品としてのFunction
If IsEven(num) Then
MsgBox "偶数です"
End If
・動作としてのSub
Sub ExecuteProcess()
Call ClearSheet(Sheet1)
Call OutputData
End Sub
👉 Functionは組み合わせる
👉 Subは流れを作る
✅ Functionを使うことで得られるメリット
・メリット① 可読性が上がる
If IsValidInput(value) Then
→ 何をしているか一目で分かる
・メリット② テストしやすい
Functionは、
- 入力
- 出力
が明確なため、
単体テストが容易です。
・メリット③ 再利用性が高い
同じFunctionを、
複数のSubから呼び出せます。
参考:【VBA】プロシージャの分ける基準とは?|迷わない設計ルールと実務での考え方を徹底解説
✅ Subでまとめるべき処理の特徴
・Subに向いている処理の共通点
- 状態を変更する
- 副作用がある
- 複数の処理をまとめる
・例:メイン処理
Sub MainProcess()
Call ValidateInput
Call CalculateData
Call OutputResult
End Sub
👉 MainはSubで作るのが基本です。
✅ Functionにしてはいけない処理
初心者がやりがちな失敗です。
・NG例
Function SaveFile() As Boolean
' 保存処理
End Function
・なぜNGなのか
- 副作用が大きい
- 処理が重い
- 意図が分かりにくい
👉 保存処理は Subが適切 です。
参考:【VBA】メソッドの戻り値(返り値)とは?取得方法と活用例
✅ ユーザーフォームとSub / Functionの関係
フォームを使う場合、
使い分けが非常に重要になります。
・やってはいけない例
Private Sub CommandButton1_Click()
' 全処理を直書き
End Sub
・正しい設計例
Private Sub CommandButton1_Click()
Call ExecuteRegister
End Sub
・Functionはどこで使うか
- 入力チェック
- 計算処理
- 判定処理
👉 フォームは Subの呼び出し役 に徹します。
参考:【VBA】ユーザーフォームの基本構造と仕組みを初心者向けに徹底解説
✅ SubとFunctionの使い分けでよくある誤解
・Functionの方が上級者っぽい?
→ 誤解です
設計に合っていなければ逆効果です。
・すべてFunctionにした方が良い?
→ NO
副作用のある処理はSubにすべきです。
✅ 実務での判断フロー(迷ったらこれ)
- 戻り値が必要か
- 副作用があるか
- 再利用するか
この3点で判断すると、
ほぼ迷わなくなります。
✅ まとめ:SubとFunctionの違いは「役割」
- Sub:処理を実行する
- Function:値を返す
- 戻り値が基準
- 副作用の有無を意識
- 設計の分かれ道になる
SubとFunctionの違いを理解することは、
VBAを「書く」から「設計する」段階へ進むための必須条件です。
この考え方が身につくと、
- プロシージャ分割
- モジュール設計
- 大規模マクロ
すべてが一気につながります。