Excelには多くの関数が用意されています。
SUMやAVERAGEなどは有名なので誰でも知っているでしょうが、CONCATやCHOOSE、UNIQUE関数あたりになると知っている人もだいぶ限られてくるでしょう。
すでに用意された関数を組み合わせることで大抵の動作は実現できますが、非常に複雑になることもありますし、中にはどうしても実現できない動作もあります。
実は、そうしたニーズのためにエクセルでは自分でワークシート関数を作成することが可能です。

せっかくなので、今回は自作のワークシート関数を作ってみましょう。
今回のお題
いきなりですが、下記の例題を実装することを考えてみましょう。
テストの点数でクラス分けするExcelシートを作ります。
クラス分けの条件は以下の通りです。
- 30点未満:Cクラス
- 30点以上70点未満:Bクラス
- 70点以上:Aクラス
点数からクラスを表示するために、あなたはどのような計算式を書きますか?
IF文が重なると読みづらい
Excel関数のIF文を使うならば、だいたい以下の感じになります。=IF(C2<30,"Cクラス",IF(C2<70,"Bクラス","Aクラス"))
この程度ならまだシンプルですが、それでもこんなエラーになったりしませんか?
このエラーはカンマの数や括弧の対応が間違っている場合に出るので、落ち着いて直せば大丈夫ですが……。
そもそも、IF文が重なると読みづらいし、読みづらいので間違えるのですよね。
ストレスが溜まります。



IF文など関数を入れ子構造をネストと呼ぶこともあります。
ワークシート上の数式でもVBAのプログラムでも、出来るだけネストを少なくすることが読みやすさアップにつながります。
VBAで複雑な計算式をスッキリまとめる
さっそく本題ですが、このIF文と同じ機能のユーザー関数を作ってみましょう。
- [開発]タブの「VisualBasic」を選択し、「Microsoft Visual Basic for Applications」を起動。
- [挿入]-「標準モジュール」を選択
- 関数(Function)を作る
今回のFunctionであれば、以下のコードを入力すればOKです。
Function yourClass(score As Integer)
' 30点未満ならCクラス
If score < 30 Then
yourClass = "Cクラス"
' 70点未満ならBクラス
ElseIf score < 70 Then
yourClass = "Bクラス"
' 70点以上はAクラス
Else
yourClass = "Aクラス"
End If
End Function
作った関数は、Excelの他の関数と同じように呼び出せるようになります。
(修正前)=IF(C2<30,"Cクラス",IF(C2<70,"Bクラス","Aクラス"))
(修正後)=yourClass(C2)



非常にスッキリしましたね!
見やすいだけじゃない、こんな効果も
VBAの関数にしておくと、途中でクラス分けのルールが変わった時に、関数の中身だけ修正すれば良くなります。
計算式を修正して、それをコピペしなくて済むので非常に楽ですし、万が一のコピペ漏れも防ぐことができます。
ユーザー関数の作成方法まとめ
- VBAを使えば自分で関数を作ってExcel関数と同じように呼び出すことができます。
- セルの計算式が複雑な場合に、VBAの関数にするとスッキリ見やすくなります。
- 計算式に仕様変更があった場合でも、VBAの関数だけを修正すれば良いので、保守性も高くなります。
コメント