Excel VBAを使って、自分だけの関数を作りたいと思ったことはありませんか?
こんな関数があったら便利なのに…。

当サイトでは、他にもExcelで業務効率・作業効率を上げる記事を投稿しています。興味があればそちらも合わせてご覧いただけると幸いです。


それではいってみましょー。
ユーザー定義関数の基本
Excel VBAには、値を返さないSubプロシージャと、値を返すFunctionプロシージャがあります。値を返すFunctionプロシージャをユーザー定義関数と呼びます。
例えば、「=Func1(123)」のようにセルに入力することで、SUM関数などと同じように使うことができます。
SUM関数だと「=SUM(A1:A100)」のように使えばA1セルからA100の合計を指定したセルに出すことができますよね?
それと同じで「=Func1(123)」もSUM関数と同じ機能をするVBAコードを作成すれば同じことが可能です。
また、ExcelのVBAでユーザー定義関数を作る基本的な手順は下記のとおりになります。
- Excelを開き、VBAエディタを起動します。
- 「挿入」メニューから「モジュール」を選択して、新しいモジュールを追加します。
- 新しいモジュールのコードウィンドウにコードを書きます。
- VBAエディタを閉じ、Excelのシートに戻ります。
ExcelでVBAエディタを起動ショートカットキーは「Windowsの場合: Alt + F11 キーを同時押し。」「Macの場合: Fn + Option + F11 キーを同時に押し。」なので覚えておくと作業が早くなりますよ。
引数の取り扱い
ユーザー定義関数で大切になるのが「引数」をどうするかです。
はい!引数って言われてもよくわかりませんよね?
ちょっと具体的なVBAコードを使って解説しますね。
'aとbを足す関数
Function myFunction(a As Integer, b As Integer) As Integer
myFunction = a + b
End Function
上記のコードは、引数aとbをシンプルに足し算して返すものです。引数とは、関数名の後ろに括弧で囲んで指定する関数に渡す値のことです。上記で作った独自関数である、「myFunction」を実際に使う時は、myFunction(1, 2)と使います。a=1、b=2が代入されて数字の3が答えとして返ってきます。
どんな関数を作るのかは、この引数の取り扱いを具体的にどうするのかということが非常に重要になってきます。
じゃあ具体的に引数をどのように設定し取り扱っていけばいいのかについては以下の4つの観点を抑えておく必要があります。

- 数字を引数として受け取る。
- セルまたはセル範囲を引数として受け取る。
- 引数の数が不定の場合。
- 省略可能な引数。
それでは1つ1つ詳しく説明したいと思います。
数字を引数として受け取る
数値型を指定して引数を受け取るように関数を設定することができます。
数字を引数として受け取る場合は、関数の引数に変数を指定し、その変数に数字を代入します。例えば、以下のようになります。
'2倍にするコード
Function myFunction(number As Integer) As Integer
myFunction = number * 2
End Function
セルまたはセル範囲を引数として受け取る
セルまたはセル範囲を引数として受け取る場合は、関数の引数にRangeオブジェクトを指定します。例えば、以下のようになります。
'セルの個数を数える関数
Function myFunction(rng As Range) As Integer
myFunction = rng.Cells.Count
End Function
rngという部分が、Excelの範囲を示すRangeオブジェクトになります。
引数の数が不定の場合
引数の数が不定の場合は、ParamArrayキーワードを使用します。例えば、以下のようになります。
'指定されたすべての数値の合計を出す関数
Function myFunction(ParamArray args() As Variant) As Integer
Dim i As Integer
For i = LBound(args) To UBound(args)
myFunction = myFunction + args(i)
Next i
End Function
ParamArray args()という部分で(可変長の引数)複数の数値を指定できます。
ちなみに、上記の関数は、「1, 2, 3, 4」という4つの数値を渡した場合、これらの数値の合計である10を出してくれるコードです。
省略可能な引数
Optionalキーワードを付けて省略可能にします。省略された場合の対応には、初期値を設定する方法と、省略されたかどうかを判定する方法があります。例えば、以下のようになります。
'文字列をくっつける(連結)関数
Function myFunction(Optional arg1 As Integer = 0, Optional arg2 As String = "") As String
myFunction = arg1 & arg2
End Function
ちなみに上記の関数に「Pen-Pineapple」と「-Apple-Pen」という2つの引数を渡した場合、これらの引数を連結した「Pen-Pineapple-Apple-Pen」という文字列を返します。
便利なVBAの独自関数コード例
VBAでユーザー定義関数を作ると業務に便利な関数を作ることができます。
別の記事で、実際に作ってみた関数を紹介していますので、業務効率化したい方はぜひご覧ください。



ユーザー定義関数ではできないこと
Excel VBAのユーザー定義関数は非常に便利で、多くのカスタム計算や操作を実行することができますが、ユーザー定義関数では、セルの挿入/削除、他セルの値の変更、アクティブセルや選択範囲の変更、シートの挿入/削除や名前の変更、Excelの設定の変更などの動作はできません。
別の記事でもっとわかりやすく解説していますのでそちらもあわせてご覧ください。

まとめ
Excel VBAでのユーザー定義関数の作り方について解説しました。関数の基本から引数の取り扱い、制限事項まで、幅広く学ぶことができました。
- ユーザー定義関数の作り方と基本的な設定方法について解説しました。
- 引数の取り扱い方について解説しました。
- 関数作成の際の制限事項をさらっと解説しました。
Excel VBAを使った関数作成は、データ処理を効率化する強力なツールです。ぜひ、今回学んだ知識を活用して、自分だけの関数を作ってみてください。
この記事を気に入っていただけたら、コメントやシェアをしていただけるととても励みになります!これからも、パソコンの作業効率を上げる方法やパソコンのちょっとした疑問や困ったを解決情報を発信していきますので、たまにサイトをチェックしていただけると、とっても嬉しいです(‘ω’)ノ。
SNSのフォローボタンを、ポチってくれるとめっちゃ嬉しいです👍
ではでは、最後までご覧いただきありがとうございました。
Twitter:@Uriuri_writer
Follow @Uriuri_writer
Instagram:@uriuri_writer
Instagram
コメント