【VBA入門】SubとFunctionの違い|戻り値・呼び出し方法を徹底解説
VBAのSubプロシージャとFunctionプロシージャの最大の違いは、Functionは戻り値(処理の結果)を返せることです。
[VBAコードブロック — WordPress管理画面のリビジョン機能から復元してください]
処理の結果を受け取りたい場合は Function、処理を実行するだけなら Sub を使います。
この記事では、SubとFunctionの違い、Functionプロシージャの書き方、引数と戻り値の使い方、実務での活用例までを、VBA初心者にもわかりやすく解説します。

VBAを学び始めると「SubとFunctionって何が違うの?」と迷う方が多いです。実はとてもシンプルな違いなので、この記事で一緒に理解していきましょう。
この記事でわかること
- VBAのプロシージャ(Sub / Function)とは何か
- SubとFunctionの違い(比較表付き)
- Functionプロシージャの書き方(引数・戻り値)
- Functionをワークシート関数(ユーザー定義関数)として使う方法
- VBA Functionの実務活用例3選
- ByRefとByValの違い(引数の渡し方)
- よくあるエラーと対処法
プロシージャとは
VBAのプロシージャとは、一連の処理をまとめた単位のことです。プログラミング言語でいう「関数」や「メソッド」に相当します。
VBAには主に以下の3種類のプロシージャがあります。
| プロシージャ | 説明 | 戻り値 |
|---|---|---|
| Sub | 処理を実行する | なし |
| Function | 処理の結果を返す | あり |
| Property | オブジェクトのプロパティを操作する | あり/なし |
この記事では、最もよく使う Sub と Function の2つに絞って解説します。

「プロシージャ」という言葉は聞き慣れないかもしれませんが、要は「処理のまとまり」のことです。Sub = やること、Function = やって結果を返すこと、と覚えれば大丈夫です。
SubとFunctionの違い【比較表】
| 項目 | Subプロシージャ | Functionプロシージャ |
|---|---|---|
| 戻り値 | なし | あり(処理結果を返せる) |
| キーワード | Sub ... End Sub | Function ... End Function |
| マクロ実行画面に表示 | される | されない |
| ワークシート関数として使用 | 不可 | 可能(ユーザー定義関数) |
| Callステートメントで呼び出し | 可能 | 可能 |
| 数式内で呼び出し | 不可 | 可能 |
| 主な用途 | マクロ実行、一連の操作自動化 | 計算処理、値の変換、ユーザー定義関数 |
いつSubを使い、いつFunctionを使うか
| 場面 | 使うべきプロシージャ |
|---|---|
| ボタンを押したら処理を実行したい | Sub |
| セルに値を入力・書式を変更したい | Sub |
| 計算結果を受け取りたい | Function |
| ワークシートの数式で使いたい | Function |
| 他のプロシージャから結果を受け取りたい | Function |
| マクロ画面から直接実行したい | Sub |
Subプロシージャの基本
書き方
[VBAコードブロック — WordPress管理画面のリビジョン機能から復元してください]
基本的な例
[VBAコードブロック — WordPress管理画面のリビジョン機能から復元してください]
実行方法
Subプロシージャは以下の方法で実行できます。
| 方法 | 手順 |
|---|---|
| マクロ画面 | Alt + F8 → プロシージャ名を選択 → 実行 |
| VBEから直接 | F5 キーを押す(カーソルがSub内にある状態で) |
| ボタンから | シート上のボタンにマクロを割り当てる |
Functionプロシージャの基本
書き方
[VBAコードブロック — WordPress管理画面のリビジョン機能から復元してください]
ポイント: プロシージャ名 = 値 の形で戻り値を設定します。
基本的な例1: 税込金額を計算する
[VBAコードブロック — WordPress管理画面のリビジョン機能から復元してください]
呼び出し方(VBAから):
[VBAコードブロック — WordPress管理画面のリビジョン機能から復元してください]
基本的な例2: 引数なしのFunction
[VBAコードブロック — WordPress管理画面のリビジョン機能から復元してください]
基本的な例3: 複数の引数を持つFunction
[VBAコードブロック — WordPress管理画面のリビジョン機能から復元してください]

Functionプロシージャのキモは プロシージャ名 = 値 の行です。ここで戻り値を設定しないと、何も返されないので注意してくださいね。
Functionをワークシート関数として使う方法【ユーザー定義関数】
Functionプロシージャの大きな特徴は、Excelのセル内で関数として使えることです。これをユーザー定義関数と呼びます。
使い方
- VBEで標準モジュールにFunctionプロシージャを記述
- ワークシートのセルに
=関数名(引数)と入力
例: 税込金額をセルで計算
VBEに以下を記述:
[VBAコードブロック — WordPress管理画面のリビジョン機能から復元してください]
ワークシートのセルに入力:
[VBAコードブロック — WordPress管理画面のリビジョン機能から復元してください]
| A列(税抜金額) | B列(数式) | B列(結果) |
|---|---|---|
| 1000 | =税込(A1) | 1100 |
| 2500 | =税込(A2) | 2750 |
| 980 | =税込(A3) | 1078 |

ユーザー定義関数を使えば、Excelに標準で用意されていない独自の計算をセルの数式で実行できます。よく使う計算をFunctionにしておくと、作業効率がかなり上がりますよ。
VBA Functionの実務活用例3選【コピペOK】
例1: 税込金額を計算するFunction
[VBAコードブロック — WordPress管理画面のリビジョン機能から復元してください]
ポイント: Optional キーワードで税率をオプション引数にしています。省略すると10%(0.1)が適用されます。
セルでの使い方:
[VBAコードブロック — WordPress管理画面のリビジョン機能から復元してください]
例2: 文字列から数値を抽出するFunction
[VBAコードブロック — WordPress管理画面のリビジョン機能から復元してください]
使いどころ: 「商品A-123」→「123」、「売上500万円」→「500」のように、文字列から数値だけを取り出す場合に便利です。
例3: 全角を半角に変換するFunction
[VBAコードブロック — WordPress管理画面のリビジョン機能から復元してください]
使いどころ: データクレンジングで全角数字・全角英字を半角に統一する場合に活用できます。
LINEでExcelを気軽に学べる
VBA引数の渡し方:ByRefとByValの違い
Functionの引数には、ByRef(参照渡し)とByVal(値渡し)の2つの渡し方があります。
| 項目 | ByRef(デフォルト) | ByVal |
|---|---|---|
| 動作 | 元の変数を直接参照 | 値のコピーを渡す |
| 元の変数への影響 | 変更される可能性あり | 変更されない |
| メモリ使用 | 少ない | 多い(コピーを作成) |
| おすすめ | 意図的に元の値を変更したい場合 | 安全に使いたい場合(推奨) |
コード例
[VBAコードブロック — WordPress管理画面のリビジョン機能から復元してください]

特に理由がなければ ByVal を使うことをおすすめします。元の変数が意図せず変更されるバグを防げますよ。
Functionの呼び出し方法
VBAのコードから呼び出す
[VBAコードブロック — WordPress管理画面のリビジョン機能から復元してください]
ワークシートのセルから呼び出す
[VBAコードブロック — WordPress管理画面のリビジョン機能から復元してください]
他のFunctionから呼び出す(ネスト)
[VBAコードブロック — WordPress管理画面のリビジョン機能から復元してください]
よくあるエラーと対処法
| エラー | 原因 | 解決方法 |
|---|---|---|
| 戻り値が0やEmpty | Function名 = 値 の行がない | Function名に戻り値を代入する行を追加 |
| #VALUE! エラー(セル) | 引数のデータ型が不一致 | 引数のデータ型を確認(Long, String等) |
| コンパイルエラー | End FunctionがないまたはSubと混在 | Function ... End Function の対応を確認 |
| ユーザー定義関数がリストに出ない | モジュールの種類が不正 | 標準モジュールに記述しているか確認(シートモジュール不可) |
| 関数が更新されない | 自動計算がオフ | 数式タブ → 計算方法 → 自動に変更 |
Functionプロシージャの動作をデモで確認
Functionプロシージャが値を返す仕組みを、下のインタラクティブデモで確認できます。
VBAマクロの実行結果は記事冒頭のインタラクティブデモで確認できます。ボタンを押すとアニメーションで動作をシミュレーションします。
よくある質問(FAQ)
Q: VBAのSubとFunctionの違いは何ですか?
A: 最大の違いは戻り値の有無です。Subプロシージャは処理を実行するだけで値を返しませんが、Functionプロシージャは処理の結果を戻り値として返すことができます。また、Functionはワークシートのセル内で関数として使える(ユーザー定義関数)という特徴もあります。
Q: VBAのFunctionプロシージャで戻り値を返すにはどうすればいい?
A: Function内で Function名 = 値 の形で代入します。例: Function 税込(金額 As Long) As Long の場合、税込 = 金額 * 1.1 と記述すれば、計算結果が戻り値として返されます。
Q: VBAのFunctionプロシージャをワークシート関数として使えますか?
A: はい、使えます。VBEの標準モジュールにFunctionプロシージャを記述すれば、ワークシートのセルに =関数名(引数) と入力して使用できます。これをユーザー定義関数と呼びます。
Q: VBAのプロシージャには何種類ありますか?
A: VBAには主に3種類のプロシージャがあります。Subプロシージャ(処理を実行)、Functionプロシージャ(値を返す)、Propertyプロシージャ(オブジェクトのプロパティを操作)です。通常のVBA開発ではSubとFunctionの2つを使うことがほとんどです。
Q: Functionプロシージャの引数に配列を指定できますか?
A: はい、可能です。引数の型を Variant にするか、() As データ型 の形で配列を受け取れます。例: Function 合計(arr() As Long) As Long
Q: VBAでFunctionプロシージャを呼び出す方法は?
A: 3つの方法があります。(1) 戻り値を変数に代入: result = 関数名(引数) (2) 直接使用: MsgBx 関数名(引数) (3) Callステートメント: Call 関数名(引数) — ただしCallでは戻り値を受け取れません。
Q: ByRefとByValの違いは何ですか?
A: ByRef(参照渡し)は元の変数を直接参照するため、Function内で値を変更すると元の変数も変わります。ByVal(値渡し)は値のコピーを渡すため、元の変数は影響を受けません。意図しないバグを防ぐため、通常はByValの使用を推奨します。
Q: SubとFunctionのどちらを使うべきですか?
A: 処理の結果を受け取る必要がある場合はFunction、処理を実行するだけ(セルへの入力、ファイル操作、メッセージ表示等)ならSubを使ってください。迷ったら、まずSubで書き始めて、戻り値が必要になったらFunctionに変更するのがおすすめです。
VBA学習のロードマップ
VBAを段階的に学ぶための推奨順序です。
| ステップ | 学ぶこと | 関連記事 |
|---|---|---|
| 1 | マクロの記録と実行 | マクロと関数の違い |
| 2 | Subプロシージャの基本 | この記事 |
| 3 | 変数宣言(Dim) | VBA Dim の使い方 |
| 4 | Functionプロシージャ | この記事 |
| 5 | 条件分岐(If/Select Case) | – |
| 6 | ループ処理(For/Do) | – |
| 7 | 実務活用(PDF印刷等) | VBA PDF印刷 |

VBAは最初は難しく感じるかもしれませんが、SubとFunctionの違いさえ理解すれば、あとはパターンの組み合わせです。私もVBAを学んで年間240時間の残業削減を実現できたので、ぜひチャレンジしてみてください。
まとめ
SubとFunctionの違いを一言でまとめると、Functionは戻り値を返す、Subは返さないです。
| ポイント | Sub | Function |
|---|---|---|
| 戻り値 | なし | あり |
| マクロ画面に表示 | される | されない |
| セル内で使用 | 不可 | 可能(ユーザー定義関数) |
| 主な用途 | 操作の自動化 | 計算処理、値の変換 |
| 使い分け | 処理を実行するだけ | 結果を受け取りたい場合 |
まずはSubプロシージャで簡単な処理を書いてみて、慣れてきたらFunctionプロシージャで戻り値の使い方を学びましょう。
VBA・Excelスキルを活かしてSNS運用も自動化しませんか?
VBAでマクロを書けるあなたなら、Googleスプレッドシート×GAS(Google Apps Script)を使ったSNS自動化ツールもすぐに使いこなせます。X(Twitter)やThreadsの予約投稿を、月額0円で自動化する方法をまとめています。
→ SNS予約投稿ツール完全ガイド|無料&買い切りツールを徹底比較
関連記事
- Excelおすすめ関数一覧|初心者が覚えるべき関数を完全ガイド — Excel関数の全体像
- マクロと関数の違いを解説 — VBA学習の入口
- VBA Dim — 変数宣言の方法 — VBA基礎
- VBA Today — 今日の日付を取得 — VBA実用テクニック
- VBA 改行 — コード内での改行 — VBA基礎テクニック
- VBA PDF印刷 — PDFファイルの自動出力 — VBA実務活用
- Excel×ChatGPT ノーコードで効率化 — コードを書かない自動化
- Excel勉強法 — 効率的なExcel学習のコツ
