月の最後の日曜日(あるいは任意の曜日)を求める

f:id:accs2014:20160924231227p:plain:right:w200

 指定した月の最後の日曜日(またはその他の曜日)の日付を求めます。「最初」の方を求める方法についてはこちらをご覧ください。
 月をどう指定するかを決める必要がありますが、ここでは右のようなテーブルを用いて、それぞれの日付が属する月の最後の日曜日(またはその他の曜日)を求めるものとします。


最後の日曜日を求める場合

f:id:accs2014:20160924231228p:plain:right:w400

 まず月の最後の日曜日を求めるケースです。
 クエリで次のような列を設けます。
(画像にある「月最後日曜日の曜日」列は確認のためであり、必要はありません)

月最後日曜日: DateSerial(Year([日付]),Month([日付])+1,1-Weekday(DateSerial(Year([日付]),Month([日付])+1,0)))

 何をやっているのかというと、右側(内側)のDateSerial関数により日付の属する月の末日を求め、その日が日曜だったら翌月1日の1日前(1-Weekday関数の結果が0となるため。つまり日付の属する月の末日そのもの)、月曜だったら翌月1日の2日前、…、土曜だったら翌月1日の7日前の日付を求めています。


f:id:accs2014:20160924231229p:plain:right:w400

 データシートビューです。
 求められた日付はいずれも日曜日であり、求める結果が得られていることが分かります。


その他の曜日を求める場合

f:id:accs2014:20160924231230p:plain:right:w400

 例として月の最後の金曜日を求めます。
 クエリで次のような列を設けます。
(画像にある「月最後金曜日の曜日」列は確認のためであり、必要はありません)

月最後金曜日: DateSerial(Year([日付]),Month([日付])+1,1-Weekday(DateSerial(Year([日付]),Month([日付])+1,0),6))

 日曜日を求める例と何が違うかというと、Weekday関数の第2引数として「6」を指定しています。
 全体としては、まず右側(内側)のDateSerial関数で日付の属する月の末日を求め、その日が金曜だったら翌月1日の1日前(1-Weekday関数の結果が0となるため。つまり日付の属する月の末日そのもの)、月曜だったら翌月1日の2日前、…、木曜だったら翌月1日の7日前の日付を求めています。

 月の最後の何曜日を求めるかは、このWeekday関数の第2引数を変えることで決められます。日曜日を求めるなら1とするか省略し(省略すれば最初の例と同じになります)、月曜日を求めるなら2とし、…、土曜日を求めるなら7を指定すればOKです。


f:id:accs2014:20160924231231p:plain:right:w400

 データシートビューです。
 求められた日付はいずれも金曜日であり、求める結果が得られていることが分かります。