こんにちは、Ryoです。
Excelを扱う中でワークシート関数を使うことはとても多いですが、VBAのFunctionプロシージャを使用することでオリジナル関数(ユーザー定義関数)を作ることができます。今回はサンプルとして西暦から干支を求める関数を作成してみましたので、その内容について書いていきます。
1.サンプル概要
以下画像の表に示す適当に割り振った西暦に対応する干支を表示させたいと思います。表示させる関数はサンプルとして作成したZod関数(ユーザー定義関数)を使います。

今回サンプルとして作成したユーザー定義関数は表内の干支欄に=Zod(西暦)として使用するので、一番上の欄は=Zod(B3)になります。

入力すると干支の欄が” 申「さる」”になります。同様に他の欄も入力すると、この通り西暦に対応した干支が表示されます。

ちなみに関数ウィザードを使用してユーザー定義関数を指定すれば扱うこともできます。その際にわかりやすいように引数名には日本語を表示させるようにしています。


直近の年は覚えていられるのですが、数年前や数年先、十数年前などの干支は??となることが多いので作ってみました。では、次にサンプルコードについて書いていきます。
2.サンプルコード
Function Zod(西暦 As Long) As String
'引数に「西暦」を設定
'日本語にすることで関数ウィザードがわかりやすくなる
Dim AD As Long
'変数ADに引数「西暦」の数値を代入
AD = 西暦
'変数ADの数値が1以上であれば処理実行
If AD > 0 Then
'干支は(西暦 + 9)/12の「余り」で判定することが可能
'「Mod」は「余り」のみを求める演算子
AD = (AD + 9) Mod 12
Select Case AD
Case 0
Zod = "亥「いのしし」"
Case 1
Zod = "子「ねずみ」"
Case 2
Zod = "丑「うし」"
Case 3
Zod = "寅「とら」"
Case 4
Zod = "卯「うさぎ」"
Case 5
Zod = "辰「たつ」"
Case 6
Zod = "巳「へび」"
Case 7
Zod = "午「うま」"
Case 8
Zod = "未「ひつじ」"
Case 9
Zod = "申「さる」"
Case 10
Zod = "酉「とり」"
Case 11
Zod = "戌「いぬ」"
End Select
Else
'「西暦」の値が0や空白の場合は#VALUE!の
'エラー値を表示させる
Zod = CVErr(xlErrValue)
End If
End Function
このようにユーザー定義関数を作成するにはFunctionプロシージャを使用します。
Function name [(arglist)][As type]
[statements]
[name=expression]
End Function
構文のnameが本サンプルのZodでarglistが(西暦 As Long)になります。この引数に日本語の西暦を使用しているのは、上のサンプル概要で示した通り、関数ウィザードで日本語表示するためです。
Function Zod(西暦 As Long) As String
引数だけ日本語にしてしまえばウィザード表示上はOKなので、変数ADに西暦の値を代入して、以後の処理を行っていきます。ここは西暦のままでも良いのですが、個人的に日本語と英数字の混合は入力しにくいのもあって置換しています。
Dim AD As Long
AD = 西暦
次は対象とするAD(西暦)の値が0や空白の際にセルにエラー表示させるため、If文で分岐処理を行っています。値が1以上であれば干支を判定させる計算処理を実行します。
干支は西暦+9を12で割り、その余り値によって判定することができますので、「余りのみ」を求める演算子Modを使用して計算結果により判明した干支をセルに表示させます。
AD = (AD + 9) Mod 12
Select Case AD
Case 0 ➡ Zod = “亥「いのしし」”
Case 1 ➡ Zod = “子「ねずみ」”
Case 2 ➡ Zod = “丑「うし」”
Case 3 ➡ Zod = “寅「とら」”
Case 4 ➡ Zod = “卯「うさぎ」”
Case 5 ➡ Zod = “辰「たつ」”
Case 6 ➡ Zod = “巳「へび」”
Case 7 ➡ Zod = “午「うま」”
Case 8 ➡ Zod = “未「ひつじ」”
Case 9 ➡ Zod = “申「さる」”
Case 10 ➡ Zod = “酉「とり」”
Case 11 ➡ Zod = “戌「いぬ」”
End Select
後はAD(西暦)の値が0や空白の場合にセルへエラー表示させるため、CVErr関数を使用し「#VALUE!」を表示させます。
Else
Zod = CVErr(xlErrValue)
End If

参考までにCVErr関数の引数に設定するXlCVErrorクラスの定数は以下の通りです。
| 定数 | 値 | エラー値 |
| xlErrDiv0 | 2007 | #DIV/0! |
| XlErrNA | 2042 | #N/A |
| xlErrName | 2029 | #NAME? |
| XlErrNull | 2000 | #NULL! |
| XlErrNum | 2036 | #NUM! |
| XlErrRef | 2023 | #REF! |
| XlErrValue | 2015 | #VALUE! |
≪参考:イミディエイトウィンドウ≫
ユーザー定義関数を作成していると計算結果の確認をおこなったりテストしたくなるものと思います。その時はVBEのイミディエイトウィンドウでチェックすることができます。
本サンプルの場合は「?Zod(2019)」のように「?」に続けて関数名を入力し、引数を括弧でくくって指定すれば処理結果が表示されます。

このイミディエイトウィンドウは他にも「?2*5」と入力すれば「10」が表示され、「?Range(”C5″).Value」と入力すればセルC5の値が表示されますから、なにかと役に立ちますので覚えておくと良いと思います。

3.まとめ
Excelを扱っていると独自に計算式などを作成して使っていることも多いかと思いますので、今回のサンプルのようにユーザー定義関数化して利用しやすくするのも良いと思います。
あまりオリジナル関数化しすぎるのも後々困りますが、利用頻度が高くて且つ知っておくと便利な計算式などは関数化しても有効活用できると思いますので、機会があればご検討くださいませ。
以上、【VBA】ユーザー定義関数を作成する方法についてでした!今回の記事が何かの参考になれば幸いです。
Ryo

