ボジョレーヌーボーは11月の第3木曜日です。
今年はまさに今日です。
毎年のヌーボーの日付をExcelのVBAで求める方法を考えてみます。
「第3木曜日」は言い換えると「15日から21日の間にある木曜日」です。
15日の曜日が木曜日であれば15日が第3木曜日
15日の曜日が水曜日であれば16日が第3木曜日
と考えます。
Weekday関数を使うと日曜日が1、月曜日が2、、土曜日が7となります。
15日が1(日曜日)ならば4日後の19日
15日が2(月曜日)ならば3日後の18日
15日が3(火曜日)ならば2日後の17日
15日が4(水曜日)ならば1日後の16日
15日が5(木曜日)ならば0日後の15日
15日が6(金曜日)ならば6日後の21日
15日が7(土曜日)ならば5日後の20日
これを式で表わすと
Weekdayが5以下の場合、15+(5-Weekday)
Weekdayが5超の場合、15+(12-Weekday)
となります。
ユーザー定義関数にまとめると次のようになります。
年を与えるとボジョレーヌーボーの解禁日である11月の何日かが返ります。
Function Nouveau(nen)
w = Weekday(DateSerial(nen, 11, 15))
If w <= 5 Then
d = 15 + (5 - w)
Else
d = 15 + (12 - w)
End If
Nouveau = d
End Function
w = Weekday(DateSerial(nen, 11, 15))
If w <= 5 Then
d = 15 + (5 - w)
Else
d = 15 + (12 - w)
End If
Nouveau = d
End Function
剰余を表す「Mod」を使うと場合分けが不要になり次のようにシンプルに。
Function Nouveau(nen)
w = Weekday(DateSerial(nen, 11, 15))
Nouveau = 15 + (12 - w) Mod 7
End Function
w = Weekday(DateSerial(nen, 11, 15))
Nouveau = 15 + (12 - w) Mod 7
End Function
こうなると、もはやユーザー定義関数でなく、ワークシートでも簡単に計算できます。
次のように入力すればOKです。「2011」のところに年を入力します。
=15+MOD(12-WEEKDAY(DATE(2011,11,15)),7)
コメント