和風スパゲティのレシピ

日本語でコーディングするExcelVBA

日付から「年度」を求める関数

日本企業でエクセルを使う場合、「年度」で日付を管理したい場面が非常に多いです。
ですが、残念ながらタイトルの関数は、デフォルトでは用意されていません。

と言うことで作りましょう。

ソースコード

' 年度の取得
Function Year年度(ByVal 日付 As Date) As Long
    If Month(日付) >= 4 Then
        Year年度 = Year(日付)
    Else
        Year年度 = Year(日付) - 1
    End If
End Function

' 実行例
MsgBox Year年度("2020/01/01") ' ← 2019が表示されます。

使い方

For R = 2 To 100
    If Year年度(Cells(R, 1)) = 2019 Then ' ← A列が2019.4~2020.3の日付の行
    
        2019年度のレコードを集計する処理

    End If
Next

コードの解説

関数の仕組みについては、ほとんど解説不要ですね。
1~3月のときは、Year関数の答えから1を引いているだけです。


非常にシンプルですが、とても便利な関数です。

簡単な計算なので、計算を楽にしてくれるような利便性はないですが、
真価を発揮するのは「コードの可読性(読みやすさ)」です。


2019.4.1~2020.3.31を1本のIf文で表現できていますからね。
違いは一目瞭然です↓

' 関数化しないでがんばる
If (Year(Cells(R, 1)) = 2019 And Month(Cells(R, 1)) >= 4) _
Or (Year(Cells(R, 1)) = 2020 And Month(Cells(R, 1)) <= 3) Then

' 今回の関数を使う
If Year年度(Cells(R, 1)) = 2019 Then


年度への変換をメインのSubプロシージャ内に書こうとすると、
大した処理じゃないのに5行くらいになったり、
yとy+1の違いだけで同じコードを複製するはめになったりします。


そいういうコードがあふれると、
本来の目的を処理しているメインコードがどうでもいい処理に埋もれて、
見えにくくなってしまいます。

こういった「たいして意味はないけど必要なIf文」を関数に隠し、
「メインコードを重要な処理だけに保つ」ことが、関数の大きな役割です。

「年度」関連の処理はこういった邪魔なIf文がとても多いので、
積極的に関数にしていきましょう。

 ・関連関数:「年度」を使って日付を求めるDateSerial関数
 ・関連関数:4月から3月を連番に変換してコードを整理する

関数名について

関数名をむりやり「Year」から始めているのは、
↓がやりたいからです。
Yearの選択肢

気持ち悪かったら、「Get年度」とか、「年度を取得する」とかに変えてください。


もし「GetNendo」なんていう、アメリカ人にも日本人にもわからない、
誰のためにもなっていない関数名を思いついてしまった方は、
「プログラムは半角病」に罹っています。


英語にすること、日本語にすること、どちらにも大きなメリットがありますが、
半角にすることには何にも意味がありません。

↓の記事を読んで治療に励んでください。

www.limecode.jp


ちなみに、本当にアメリカ人のために英語名の関数にするときは、

企業に納品するシステムなら、会計年度

GetJapaneseFiscalYear
GetJapaneseFinancialYear

学校に納品するシステムなら、学年度

GetJapaneseSchoolYear

あたりですかね?
※ 厳密には学年度は4月2日スタートのためご注意ください。

日本でしか使わないシステムなら、Japaneseはとっていいです。


ちゃんと「年度」って関数を使ってあげないと、外人さんは

If m <= 3 Then

この「3」がなんの3だかわからない国の出身かもしれません。

そういう意味でも関数化は可読性を向上してくれますので、
積極的に活用していきましょう。