Excel上級者

【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の違い(引数の渡し方)
  • よくあるエラーと対処法
この記事の目次
  1. プロシージャとは
  2. SubとFunctionの違い【比較表】
  3. Subプロシージャの基本
  4. Functionプロシージャの基本
  5. Functionをワークシート関数として使う方法【ユーザー定義関数】
  6. VBA Functionの実務活用例3選【コピペOK】
  7. LINEでExcelを気軽に学べる
  8. VBA引数の渡し方:ByRefとByValの違い
  9. Functionの呼び出し方法
  10. よくあるエラーと対処法
  11. Functionプロシージャの動作をデモで確認
  12. よくある質問(FAQ)
  13. VBA学習のロードマップ
  14. まとめ
  15. 関連記事

プロシージャとは

VBAのプロシージャとは、一連の処理をまとめた単位のことです。プログラミング言語でいう「関数」や「メソッド」に相当します。

VBAには主に以下の3種類のプロシージャがあります。

プロシージャ説明戻り値
Sub処理を実行するなし
Function処理の結果を返すあり
Propertyオブジェクトのプロパティを操作するあり/なし

この記事では、最もよく使う SubFunction の2つに絞って解説します。

「プロシージャ」という言葉は聞き慣れないかもしれませんが、要は「処理のまとまり」のことです。Sub = やること、Function = やって結果を返すこと、と覚えれば大丈夫です。

SubとFunctionの違い【比較表】

SubプロシージャとFunctionプロシージャの違い比較図
SubとFunctionの違い
項目SubプロシージャFunctionプロシージャ
戻り値なしあり(処理結果を返せる)
キーワードSub ... End SubFunction ... 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のセル内で関数として使えることです。これをユーザー定義関数と呼びます。

使い方

  1. VBEで標準モジュールにFunctionプロシージャを記述
  2. ワークシートのセルに =関数名(引数) と入力

例: 税込金額をセルで計算

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管理画面のリビジョン機能から復元してください]

使いどころ: データクレンジングで全角数字・全角英字を半角に統一する場合に活用できます。

期間限定でChatGPT✖︎Googleスプレットシートのコンテンツ配布中!

LINEでExcelを気軽に学べる

しんたろ。
しんたろ。
Excel歴10年以上 → アプリ開発者
Profile
大手メーカーに15年以上勤務。製造部門で海外拠点の立ち上げ支援や、現場責任者として採算管理・納期管理・設備オペレートを経験。 2023年にDX人材育成プログラム第1期生として活動後、現在は製造現場のスケジュール運用を支えるアプリの企画・開発をメインに活動中。工程表示表作成の内製化SaaSを構築し、年間1,300万円のコスト改善を実現。 Excelによる業務改善で年間240時間の残業削減を達成した経験を活かし、ブログやSNSでも情報発信しています。
プロフィールを読む

VBA引数の渡し方:ByRefとByValの違い

Functionの引数には、ByRef(参照渡し)ByVal(値渡し)の2つの渡し方があります。

項目ByRef(デフォルト)ByVal
動作元の変数を直接参照値のコピーを渡す
元の変数への影響変更される可能性あり変更されない
メモリ使用少ない多い(コピーを作成)
おすすめ意図的に元の値を変更したい場合安全に使いたい場合(推奨)

コード例

[VBAコードブロック — WordPress管理画面のリビジョン機能から復元してください]

特に理由がなければ ByVal を使うことをおすすめします。元の変数が意図せず変更されるバグを防げますよ。

Functionの呼び出し方法

VBAのコードから呼び出す

[VBAコードブロック — WordPress管理画面のリビジョン機能から復元してください]

ワークシートのセルから呼び出す

[VBAコードブロック — WordPress管理画面のリビジョン機能から復元してください]

他のFunctionから呼び出す(ネスト)

[VBAコードブロック — WordPress管理画面のリビジョン機能から復元してください]

よくあるエラーと対処法

エラー原因解決方法
戻り値が0やEmptyFunction名 = 値 の行がない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マクロの記録と実行マクロと関数の違い
2Subプロシージャの基本この記事
3変数宣言(Dim)VBA Dim の使い方
4Functionプロシージャこの記事
5条件分岐(If/Select Case)
6ループ処理(For/Do)
7実務活用(PDF印刷等)VBA PDF印刷

VBAは最初は難しく感じるかもしれませんが、SubとFunctionの違いさえ理解すれば、あとはパターンの組み合わせです。私もVBAを学んで年間240時間の残業削減を実現できたので、ぜひチャレンジしてみてください。

まとめ

SubとFunctionの違いを一言でまとめると、Functionは戻り値を返す、Subは返さないです。

ポイントSubFunction
戻り値なしあり
マクロ画面に表示されるされない
セル内で使用不可可能(ユーザー定義関数)
主な用途操作の自動化計算処理、値の変換
使い分け処理を実行するだけ結果を受け取りたい場合

まずはSubプロシージャで簡単な処理を書いてみて、慣れてきたらFunctionプロシージャで戻り値の使い方を学びましょう。


VBA・Excelスキルを活かしてSNS運用も自動化しませんか?

VBAでマクロを書けるあなたなら、Googleスプレッドシート×GAS(Google Apps Script)を使ったSNS自動化ツールもすぐに使いこなせます。X(Twitter)やThreadsの予約投稿を、月額0円で自動化する方法をまとめています。

SNS予約投稿ツール完全ガイド|無料&買い切りツールを徹底比較

VBAの次に学ぶならGAS入門 →

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

ABOUT ME
しんたろ。
しんたろ。
Excel歴10年以上 → アプリ開発者
大手メーカーに15年以上勤務。製造部門で海外拠点の立ち上げ支援や、現場責任者として採算管理・納期管理・設備オペレートを経験。 2023年にDX人材育成プログラム第1期生として活動後、現在は製造現場のスケジュール運用を支えるアプリの企画・開発をメインに活動中。工程表示表作成の内製化SaaSを構築し、年間1,300万円のコスト改善を実現。 Excelによる業務改善で年間240時間の残業削減を達成した経験を活かし、ブログやSNSでも情報発信しています。
記事URLをコピーしました