VBAでは Function プロシージャを使って、自分だけのオリジナル関数を作ることができます。作った関数はExcelのセルから =関数名(引数) で呼び出せるので、標準の関数では対応しにくい計算やチェック処理を簡単に追加できます。
この記事では、次の内容を順番に解説します。
- Functionプロシージャの基本的な書き方
- 複数の引数を持たせる方法
- 関数の中でIf文を使う方法
- SubプロシージャとFunctionプロシージャの違い
Functionプロシージャの基本的な書き方は?
まずは税込価格を計算するシンプルな関数を作ってみます。
Function AddTax(price As Double) As Double
AddTax = price * 1.1
End Function
この関数を標準モジュールに書けば、Excelのセルに =AddTax(1000) と入力するだけで「1100」が返ってきます。
コードのポイント
Function AddTax:「AddTax」が自作の関数名です。好きな名前をつけられます。(price As Double):引数です。関数に渡す値を指定します。As Double:戻り値(結果)の型です。小数を含む数値を返すという意味です。AddTax = price * 1.1:関数名に値を代入すると、それが結果として返されます。
複数の引数を持たせるには?
引数はカンマで区切ることで、いくつでも追加できます。たとえば、割引後の価格を計算する関数です。
Function DiscountPrice(price As Double, rate As Double) As Double
DiscountPrice = price * (1 - rate)
End Function
Excelで =DiscountPrice(1000, 0.2) と入力すると「800」が返ってきます。価格と割引率の2つを引数として受け取り、割引後の金額を計算しています。
実務では、商品単価と割引率から請求金額を出す場面や、手当の支給率から支給額を計算する場面などで使えます。
関数の中でIf文を使うには?
Functionプロシージャの中ではIf文も使えます。条件に応じて異なる結果を返す関数が作れます。
Function CheckLength(txt As String) As String
If Len(txt) > 10 Then
CheckLength = "長すぎます"
ElseIf Len(txt) = 0 Then
CheckLength = "未入力です"
Else
CheckLength = "OK"
End If
End Function
この関数は文字列の長さをチェックして、10文字を超えていたら「長すぎます」、空欄なら「未入力です」、それ以外なら「OK」を返します。
顧客コードの文字数チェックや、コメント欄の未入力チェックなどに活用できます。
SubプロシージャとFunctionプロシージャの違いは?
普段マクロで使っている Sub と、今回の Function の一番の違いは「値を返すかどうか」です。
- Subプロシージャ:処理を実行するだけ。値は返さない。マクロの実行ボタンから直接実行できる。
- Functionプロシージャ:処理を実行して、結果(値)を返す。Excelのセルから
=関数名()で呼び出せる。
' Sub:値を返さない(処理するだけ)
Sub ShowMessage()
MsgBox "こんにちは"
End Sub
' Function:値を返す(セルから呼び出せる)
Function AddTax(price As Double) As Double
AddTax = price * 1.1
End Function
Functionプロシージャはマクロの実行ボタンからは直接実行できません。セルに入力するか、他のSubプロシージャから呼び出して使います。
まとめ
- 基本構文:
Function 関数名(引数) As 型で自作関数を定義する。 - セルから呼び出せる:標準モジュールに書けば
=関数名(引数)で使える。 - 複数の引数:カンマで区切っていくつでも追加できる。
- If文も使える:条件分岐を組み込んだ判定関数も作れる。
- Subとの違い:Functionは値を返す。Subは処理するだけ。
よくある質問
自作関数はどこに書けばいい?
VBE(Alt+F11)の「標準モジュール」に書いてください。シートモジュールやThisWorkbookモジュールに書くと、セルから呼び出せないことがあります。標準モジュールがない場合は、「挿入」→「標準モジュール」で追加できます。
自作関数がセルに表示されない場合は?
関数名を入力しても候補に出てこないことがありますが、直接 =AddTax(1000) のように入力すれば使えます。また、ファイルがマクロ有効ブック(.xlsm)で保存されているか確認してください。.xlsx形式ではマクロが無効になります。
引数を省略できるようにするには?
引数の前に Optional をつけると省略可能になります。たとえば Function AddTax(price As Double, Optional taxRate As Double = 0.1) と書くと、税率を省略した場合は10%として計算されます。
自作関数の中からセルに値を書き込める?
Functionプロシージャからセルの値を直接書き換えることはできません。Functionはあくまで「値を返す」ための仕組みです。セルの書き換えが必要な処理はSubプロシージャで行いましょう。
自作関数を別のブックでも使いたい場合は?
アドイン(.xlam)として保存すると、どのブックからでも呼び出せるようになります。通常のブック(.xlsm)に書いた場合は、そのブックが開いている間だけ使えます。
動画で学びたい方へ
「記事を読んでも、実際に自分で書けるか不安…」という方には、動画で基礎からじっくり学べる講座がおすすめです。
VBAが初めての方を前提に、つまずきやすいポイントを先回りして解説しています。サンプル動画は無料でご覧いただけます。



