Excel VBAでマクロを書き始めた方の中には、「SubとFunctionの違いがよくわからない」「Functionって何のために使うの?」と感じたことがある方も多いのではないでしょうか。
筆者も初心者の頃は、すべてをSubで書いてしまい、同じような処理を何度もコピペして非効率なコードになっていた経験があります。
Functionは、「処理の結果を値として返す」ための仕組みです。
自作関数のように使えるため、コードの再利用性が高まり、保守・管理がしやすくなるという大きなメリットがあります。
本記事では、VBA初心者向けに「Subとの違い」から「Functionの書き方」「引数や戻り値の使い方」「配列の扱い」まで、基本から順を追って解説します。
はじめてFunctionに触れる方でも安心して読めるように、実例を交えて丁寧に説明していきますので、ぜひ最後までご覧ください。
SubとFunctionの違いとは?
VBAでマクロを書くときによく出てくる「Sub(サブ)」と「Function(ファンクション)」。
どちらも処理をまとめるための構文ですが、目的や使い方には明確な違いがあります。
ここでは、初心者がつまずきやすい「SubとFunctionの違い」についてわかりやすく解説します。
Subとは?(処理をまとめて実行する)
Sub
は、一連の操作や処理をまとめて実行するための命令ブロックです。
例えば、セルにデータを入力したり、範囲をクリアしたりするような「処理系マクロ」はSubで作成するのが基本です。
例:
Sub データをクリアする()
Range("A2:A10").ClearContents
End Sub
Functionとは?(処理の結果を返す)
一方でFunction
は、何らかの値を処理して「結果(戻り値)」を返すための構文です。
関数として他のプロシージャから呼び出したり、セルの中で使うこともできます。
例:
Function total(範囲 As Range) As Double
total = WorksheetFunction.Sum(範囲)
End Function
→ 合計 = 合計を求める(Range("B2:B10"))
のように、値を受け取って戻すことができます。
※Function名やSub名には日本語を使うと「名前が適切ではありません」などのエラーが出る場合があります。関数名には英数字とアンダースコアのみを使うようにしましょう(例:CalcWithTax
など)。
一方、引数や変数名には日本語も使用可能ですが、他人との共有や再利用を考える場合は、英数字で統一しておくのが安全です。
SubとFunctionの使い分けの目安
種別 | 向いている処理 | 戻り値 | 呼び出し方法 |
---|---|---|---|
Sub | 操作・手続き | なし | マクロ実行・Call等 |
Function | 計算・値の取得 | あり | 他のマクロやセル内 |
「処理だけしたいならSub」「値を返したいならFunction」
これがシンプルな使い分けの基準です。
Functionの基本構文と使い方
Functionは、処理結果を「値」として返す仕組みです。
VBAの中で繰り返し使いたい計算や変換処理をまとめることで、コードの見通しが良くなり、修正もしやすくなります。
ここでは、Functionの基本的な構文と、呼び出し方を解説します。
Functionの書き方の基本形
Function 関数名(引数 As 型, …) As 戻り値の型
' 処理
関数名 = 戻したい値
End Function
具体例:
Function CalcWithTax(税抜価格 As Double) As Double
CalcWithTax = 税抜価格 * 1.1
End Function
→ このFunctionを呼び出すと、税抜価格に10%の消費税を加えた価格が返されます。
※Function名やSub名には日本語を使うと「名前が適切ではありません」などのエラーが出る場合があります。関数名には英数字とアンダースコアのみを使うようにしましょう(例:CalcWithTax
など)。
最近では一部環境で日本語の関数名も動作することがありますが、他のPCやバージョンでエラーが発生する可能性もあるため、英数字で統一する方が安全です。
一方、引数や変数名には日本語も使用可能ですが、他人との共有や再利用を考える場合は、英数字で統一しておくのが安全です。
SubからFunctionを呼び出す
Functionは単体で実行されるのではなく、Subの中などから呼び出して使うのが基本です。
Sub テスト実行()
Dim 金額 As Double
金額 = CalcWithTax(1000)
MsgBox "税込価格は " & 金額 & " 円です"
End Sub
セル関数として使うことも可能
Functionは、条件を満たせばワークシート関数としてセルでも使えます。
※対象のFunctionがPublicで、標準モジュールにあることが条件です。
セル関数として使いたい時にもFunction名に日本語を使ってしまうと認識されずエラーになるため、「セルで使うならなおさら英数字が無難」と示しても良いかもしれません。
Functionを使うことで、**「処理の結果だけを受け取りたい」**というニーズに柔軟に対応できます。
次は、**複数の値を渡したいときの「引数の使い方」**について見ていきましょう。
Functionで引数を使う方法
Functionをより実用的に使うためには、引数(ひきすう)を活用することがポイントです。
引数を使うことで、処理対象のデータを関数の外から渡すことができ、汎用性が高まります。
ここでは、引数の基本的な使い方から、複数引数の指定方法まで解説します。
引数とは?
関数に渡す「値」や「範囲」のことです。
例えば「税抜価格」を関数に渡して「税込価格」を返す場合、税抜価格が引数になります。
例(1つの引数):
Function CalcWithTax(税抜 As Double) As Double
CalcWithTax = 税抜 * 1.1
End Function
複数の引数を渡すには?
(対応キーワード:vba function 引数 複数)
カンマ区切りで、複数の引数を定義することができます。
例:
Function 割増価格(基本価格 As Double, 割増率 As Double) As Double
割増価格 = 基本価格 * (1 + 割増率)
End Function
呼び出し側の例:
Dim 結果 As Double
結果 = 割増価格(2000, 0.2) ' 20%増し → 結果 = 2400
ByValとByRefの違い(補足)
-
ByVal
(省略時):値をコピーして渡す(元の値は変わらない) -
ByRef
:引数として渡した元の変数に直接影響を与える
例:
Function 倍にする(ByRef x As Double)
x = x * 2
End Function
この場合、呼び出し元の変数 x 自体が変更されます。
初心者のうちは基本的に ByVal(または省略)で問題ありません。
戻り値を使って結果を返す
Functionは、Subと違って処理の結果(戻り値)を呼び出し元に返すことができます。
この「戻り値」があることで、関数としての役割を果たし、再利用性の高いコードが書けるようになります。
戻り値の基本的な書き方
戻り値とは、関数の実行結果として**「これが答えです」と返す値**のことです。
VBAでは、関数名そのものに値を代入することで、戻り値を指定します。
例:
Function Consumption_tax_amount(税抜価格 As Double) As Double
Consumption_tax_amount = 税抜価格 * 0.1
End Function
→ この関数は、税抜価格の10%を「消費税額」として返します。
呼び出し例(戻り値を受け取る)
Sub 計算テスト()
Dim 税額 As Double
税額 = Consumption_tax_amount(1000)
MsgBox "消費税は " & 税額 & " 円です"
End Sub
戻り値の型は自由に指定できる
-
As String
→ 文字列を返す -
As Boolean
→ 真偽値(True / False)を返す -
As Long
/Double
→ 数値を返す
例(条件判定のFunction):
Function Pass_judgment(点数 As Integer) As Boolean
'合格判定
Pass_judgment = (点数 >= 60)
End Function
戻り値の使い方のポイント
-
戻り値は必ず1つ(ただし配列などで複数データをまとめて返すことは可能)
-
Function名 = 値
を忘れると、何も返されない関数になってしまう -
戻り値の型と代入する値の型は必ず一致させるか、自動変換に注意
配列を戻すFunctionの書き方
通常のFunctionは1つの値を返しますが、複数の値をまとめて返したい場合には「配列」を使うことで対応できます。
配列を戻すことで、ひとつの処理で複数の結果を得られる柔軟な関数が作れます。
配列を戻すFunctionの基本構文
Function return_array() As Variant
'配列を返すテスト
Dim arr(1 To 3) As String
arr(1) = "りんご"
arr(2) = "バナナ"
arr(3) = "ぶどう"
return_array = arr
End Function
ポイント:
-
配列を返すFunctionでは、戻り値の型を
Variant
にするのが基本 -
VBAでは、配列そのものを直接戻すには
Variant
型が最も扱いやすい
呼び出し側での使い方(Subから受け取る)
Sub 配列テスト()
Dim 結果() As String
Dim i As Integer
'return_array()から配列を受け取る
結果 = return_array()
'繰り返し処理で受け取った配列をイミディエイトウィンドウで表示
For i = LBound(結果) To UBound(結果)
Debug.Print 結果(i)
Next i
End Sub
→ 実行結果(イミディエイトウィンドウ):
配列を戻す関数の活用例
-
期間ごとの売上や件数を一括で返す
-
セル範囲から特定の値だけを抽出して返す
-
フィルターや条件判定の結果一覧を返す
注意点
-
配列 = Function名(...)
の形で戻すため、受け取り側でも配列の準備が必要 -
戻り値型を
Variant()
と書くと構文エラーになるため注意(戻り値はAs Variant
)
配列の戻り値はやや上級者向けのテクニックですが、うまく使えば処理の効率化や整理に大きく貢献します。
最後に、Functionのまとめとして活用ポイントを整理しておきましょう。
まとめ|処理の再利用にはFunctionが便利!
VBAのFunctionは、「値を返す」ことに特化した便利な仕組みです。
今回ご紹介したように、Functionを使うことで処理を整理し、再利用性の高いコードを書くことができます。
本記事で解説したポイントのおさらい
-
SubとFunctionの違いを理解し、「値を返す処理はFunctionで」整理できるようにする
-
引数を使って処理対象を柔軟に変更できるようにすると、1つの関数でさまざまなパターンに対応可能
-
戻り値を活用することで、結果を他の処理に渡すことができる
-
配列の戻り値を使えば、複数データをまとめて扱える強力な関数が作れる
VBAに慣れていないうちは、すべてSubで書いてしまうことも多いですが、関数化しておくと後々の修正や使い回しが非常に楽になります。
「よく使う処理はFunctionにまとめる」ことを意識するだけでも、コードの見通しと保守性はぐっと向上します。
Functionは、VBAを“道具”として使いこなすための強力なパーツです。ぜひ実際の業務や学習の中で、少しずつ活用していってみてください。
VBAコードを組む際に「あとから見返して困らない書き方」も意識しておくと安心です。
→VBAの書き方で失敗しないために|読みやすくて修正しやすい変数・コメント・構造のコツ