和風スパゲティのレシピ

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

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

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

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

ソースコード

' 年度の取得
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」なんていう、アメリカ人にも日本人にもわからない、
誰のためにもなっていない関数名を思いついてしまった方は、
「プログラムは半角病」に罹っています。


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

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

www.limecode.jp


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

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

GetJapaneseFiscalYear
GetJapaneseFinancialYear

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

GetJapaneseSchoolYear

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

関数名がちょっと長くてめんどくさく感じるけど、

If m <= 3 Then

↑この「3」が、日本人以外にとって解読不能の謎数値になりかねないので、
関数化による意図の明示は、英語にするなら必須だと思います。

※ 厳密にはJapaneseSchoolYearは4月2日スタートのため、↑の関数では求まりません。