MENU

【初心者向け】VBAのSubとFunctionの違いとは?構文と使い分け・実例まで徹底解説

VBAを学び始めたとき、「SubとFunctionって何が違うの?」と疑問に感じた方は多いはず。この2つの違いが分からず、なんとなく使っている方も多いのではないでしょうか?

この記事では、SubとFunctionの違い、使い分けの基準、初心者がつまずきやすいポイント、実務的な活用例をわかりやすく解説します。

目次

SubとFunctionの違いをざっくり説明

VBAにおけるSubは“手続き(Procedure)”を意味し、Functionは“関数(Function)”を意味します。どちらも一連の処理をまとめるために使いますが、最も大きな違いは戻り値があるかどうかです。

項目SubFunction
戻り値なしあり
呼び出し方法マクロとして実行セルや他のプロシージャ内で利用可能
主な用途一連の処理をまとめて実行計算や処理をしてその結果(値)を返す
セル関数としての使用×○(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プロシージャ。

この記事を参考に、目的に応じてSubFunctionを使い分けて、効率的なマクロを作成していきましょう!

この記事を書いた人

めんどくさがりでズボラ。
某自動車メーカーで、VBAやRPAを用いた業務効率化を行っております。

目次