VBAテクニック集 VBA一覧 文法・構文 関数・イベント

【VBA】SubとFunctionの違いとは?役割・使い分け・設計基準を徹底解説

Excel VBAを学習していると、
ほぼ確実に次のような疑問に直面します。

  • 「SubとFunctionって何が違うのか分からない」
  • 「どちらを使えば正解なのか判断できない」
  • 「Functionにした方が良さそうだが、Subでも動く」
  • 「他人のVBAを読むと設計がバラバラに見える」

VBA初心者の多くは、
SubとFunctionの違いを“動作の違い”だけで理解しようとしてしまいます。
しかし、それでは必ず限界がきます。

実務で扱うVBAは、

  • 処理が長くなる
  • 複数のプロシージャが絡む
  • 修正や拡張が頻繁に発生する

ため、
「どちらを使うか」は設計そのものになります。

この記事では、Excel VBA初心者〜中級者の方を対象に、
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

・構文上の違いまとめ

項目SubFunction
戻り値なしあり
呼び出し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にすべきです。


✅ 実務での判断フロー(迷ったらこれ)

  1. 戻り値が必要か
  2. 副作用があるか
  3. 再利用するか

この3点で判断すると、
ほぼ迷わなくなります。




✅ まとめ:SubとFunctionの違いは「役割」

  • Sub:処理を実行する
  • Function:値を返す
  • 戻り値が基準
  • 副作用の有無を意識
  • 設計の分かれ道になる

SubとFunctionの違いを理解することは、
VBAを「書く」から「設計する」段階へ進むための必須条件です。

この考え方が身につくと、

  • プロシージャ分割
  • モジュール設計
  • 大規模マクロ

すべてが一気につながります。

参考:【VBA】モジュールの【種類・役割・特徴】とは何か|正しい使い分けと実務設計を徹底解説

    -VBAテクニック集, VBA一覧, 文法・構文, 関数・イベント