VBAを学び始めたとき、「SubとFunctionって何が違うの?」と疑問に感じた方は多いはず。この2つの違いが分からず、なんとなく使っている方も多いのではないでしょうか?
この記事では、SubとFunctionの違い、使い分けの基準、初心者がつまずきやすいポイント、実務的な活用例をわかりやすく解説します。
SubとFunctionの違いをざっくり説明
VBAにおけるSub
は“手続き(Procedure)”を意味し、Function
は“関数(Function)”を意味します。どちらも一連の処理をまとめるために使いますが、最も大きな違いは戻り値があるかどうかです。
項目 | Sub | Function |
---|---|---|
戻り値 | なし | あり |
呼び出し方法 | マクロとして実行 | セルや他のプロシージャ内で利用可能 |
主な用途 | 一連の処理をまとめて実行 | 計算や処理をしてその結果(値)を返す |
セル関数としての使用 | × | ○(Public指定でセル関数として使用可能) |
Subプロシージャは、処理を実行するためのもので、戻り値はありません。
一方で、Functionプロシージャは、計算や処理結果を返すためのもので、戻り値はあります。
FunctionプロシージャをPublic指定することで、Excelのセル関数として使用することも可能です。
SubとFunctionの基本構文
Subの基本構文
Sub ShowMessage()
' メッセージボックスを表示
MsgBox "Hello!"
End Sub
このSubプロシージャは、実行すると「Hello!」というメッセージボックスを表示します。
処理を実行するだけで、値を返す必要がない場合に使用します。
Functionの基本構文
Function CalculateTax(price As Double) As Double
' 消費税を計算して返す
CalculateTax = price * 0.1
End Function
このFunctionプロシージャは、引数として受け取った価格に対して10%の消費税を計算し、その結果を返します。
戻り値を必要とする計算や処理に使用します。
SubとFunctionの使い分けポイント
- 処理だけをしたい場合 → Subプロシージャ
- 値を返したい場合 → Functionプロシージャ
- セルで関数として使いたい場合 → Functionプロシージャ(Public指定)
例えば、ボタンを押してメッセージを表示する場合はSubプロシージャ、セルで合計を自動計算したい場合はFunctionプロシージャが適しています。
実務でよく使うパターン
Functionで計算 → Subで表示
Function GetTotal(price As Long, qty As Long) As Long
' 合計金額を返す
GetTotal = price * qty
End Function
Sub ShowTotal()
Dim total As Long
total = GetTotal(1000, 3)
' 合計をメッセージで表示
MsgBox "Total: " & total & " yen"
End Sub
この例では、Functionプロシージャで合計金額を計算し、その結果をSubプロシージャでメッセージボックスに表示しています。
計算処理と表示処理を分けることで、コードの再利用性(使い回しやすくなる)と可読性(機能が分かりやすい)が向上します。
セルで使えるFunction
Public Function WithTax(price As Double) As Double
' 税込価格を返す
WithTax = price * 1.1
End Function
このFunctionプロシージャは、引数として受け取った数値に対して10%を加算し、その結果を返します。
Public指定されているため、下図のようにExcelのセルに =WithTax(2000)
と入力すると、2200
が返ります。

よくあるミスと注意点
Function内でセルを書き換えてしまう
Function WrongWay()
' セル操作はFunctionでは非推奨
Range("A1").Value = 100
End Function
このようにFunctionプロシージャ内でセルの値を直接変更することは避けましょう。
Functionは値を返すためのものであり、副作用を持たせると予期しない動作やエラーの原因となります。
まとめ
- Subプロシージャ:処理を実行するためのプロシージャで、値を返さない。
- Functionプロシージャ:計算や処理結果を返すためのプロシージャで、値を返す。
- 使い分けのポイント:
- 結果を返す必要がない場合は
Sub
プロシージャ。 - 計算結果や特定の値を返す必要がある場合は
Function
プロシージャ。 - セルで関数として使いたい場合は、Public指定の
Function
プロシージャ。
- 結果を返す必要がない場合は
この記事を参考に、目的に応じてSub
とFunction
を使い分けて、効率的なマクロを作成していきましょう!