日本企業でエクセルを使う場合、「年度」で日付を管理したい場面が非常に多いです。
ですが、残念ながらタイトルの関数は、デフォルトでは用意されていません。
と言うことで作りましょう。
ソースコード
' 年度の取得 Function Year年度(ByVal 日付 As Date) As Long If Month(日付) >= 4 Then Year年度 = Year(日付) Else Year年度 = Year(日付) - 1 End If End Function ' 実行例 ?Year年度("2020/01/01") ' = 2019
使い方
For R = 2 To 100 If Year年度(Cells(R, 売上データの列.購入日)) = 2019 Then ~今年度を集計する処理など~ ' 2019.4.1~2020.3.31を、1本のIf文で表現できる End If Next
コードの解説
関数の仕組みについては、ほとんど解説不要ですね。
1~3月のときは、Year関数の答えから1を引いているだけです。
非常にシンプルですが、とても便利な関数です。
簡単な計算なので、計算を楽にしてくれるような利便性はないですが、
真価を発揮するのは「コードの可読性(読みやすさ)」です。
↑のIf文の意味が、「購入日が2019年度」っていうのが、眺めるだけで分かります。
2019.4.1~2020.3.31を、1本のIf文で表現できているわけですね。
' 関数化しないでがんばる If (Year(Cells(R, 売上データの列.購入日)) = 2019 And Month(Cells(R, 売上データの列.購入日)) >= 4) _ Or (Year(Cells(R, 売上データの列.購入日)) = 2020 And Month(Cells(R, 売上データの列.購入日)) <= 3) Then ' 年度の関数を作る If Year年度(Cells(R, 売上データの列.購入日)) = 2019 Then
年度への変換を、メインのSubプロシージャ内に書こうとすると、大した処理じゃないのに5行くらいになったり、yとy+1の違いだけで同じコードを複製するはめになったりします。
そいういうコードがあふれると、本来の目的を処理しているメインコードが、どうでもいい処理に埋もれて、見えにくくなってしまいます。
こういった、「たいして意味はないが、システム上必要なIf文」を関数に隠し、
「メインコードを意味のある処理だけに保つ」ことが、関数の大きな役割です。
「年度」関連の処理は、こういった邪魔なIfがとても多いので、積極的に関数にしていきましょう。
・関連関数:「年度」を使って日付を求めるDateSerial関数
・関連関数:4月から3月を連番に変換してコードを整理する
関数名について
関数名がちょっと不自然ですが、むりやり「Year」から始めているのは、→がやりたいからです。
気持ち悪かったら、「Get年度」とか、「年度を取得する」とかに変えてください。
もし「GetNendo」なんていう、アメリカ人にも日本人にもわからない、
誰のためにもなっていない関数名を思いついてしまった方は、
「プログラムは半角病」に罹っています。
英語にすること、日本語にすること、どちらにも大きなメリットがありますが、
半角にすることには何にも意味がありません。
↓の記事を読んで治療に励んでください。
ちなみに、本当にアメリカ人のために英語名の関数にするときは、
企業に納品するシステムなら、会計年度
GetJapaneseFiscalYear GetJapaneseFinancialYear
学校に納品するシステムなら、学年度
GetJapaneseSchoolYear
あたりですかね?
日本でしか使わないシステムなら、Japaneseはとっていいです。
関数名がちょっと長くてめんどくさく感じるけど、
If m <= 3 Then
↑この「3」が、日本人以外にとって解読不能の謎数値になりかねないので、
関数化による意図の明示は、英語にするなら必須だと思います。
※ 厳密にはJapaneseSchoolYearは4月2日スタートのため、↑の関数では求まりません。