月の最初の日曜日(または任意の曜日)の日付を求める

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

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


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

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

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

月最初日曜日: DateSerial(Year([日付]),Month([日付]),8-Weekday(DateSerial(Year([日付]),Month([日付]),0)))

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


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

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


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

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

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

月最初金曜日: DateSerial(Year([日付]),Month([日付]),8-Weekday(DateSerial(Year([日付]),Month([日付]),0),6))

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

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


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

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