日本企業でエクセルを使う場合、「年度」で日付を管理したい場面が非常に多いです。
ですが、残念ながらタイトルの関数は、デフォルトでは用意されていません。
と言うことで作りましょう。
ソースコード
' 年度の取得 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」から始めているのは、
↓がやりたいからです。
気持ち悪かったら、「Get年度」とか、「年度を取得する」とかに変えてください。
もし「GetNendo」なんていう、アメリカ人にも日本人にもわからない、
誰のためにもなっていない関数名を思いついてしまった方は、
「プログラムは半角病」に罹っています。
英語にすること、日本語にすること、どちらにも大きなメリットがありますが、
半角にすることには何にも意味がありません。
↓の記事を読んで治療に励んでください。
ちなみに、本当にアメリカ人のために英語名の関数にするときは、
企業に納品するシステムなら、会計年度
GetJapaneseFiscalYear GetJapaneseFinancialYear
学校に納品するシステムなら、学年度
GetJapaneseSchoolYear
あたりですかね?
※ 厳密には学年度は4月2日スタートのためご注意ください。
日本でしか使わないシステムなら、Japaneseはとっていいです。
ちゃんと「年度」って関数を使ってあげないと、外人さんは
If m <= 3 Then
この「3」がなんの3だかわからない国の出身かもしれません。
そういう意味でも関数化は可読性を向上してくれますので、
積極的に活用していきましょう。