7月の最後の金曜日の求め方

職場の勉強会に、こんなテーマが寄せられました。

 指定月の最終金曜日の日付を知りたい

最終金曜日に月次処理を行う業務があって、その日付を Excel で求められないか?というものでした。

早速二つのグループに分かれて、メンバーで討議しながらその場でマクロを作成します。オブザーバの私は基本的に発言しないルールなので、最初は黙って討論の様子を見ていました。

  • Format(Date,aaa) で「金」かどうか調べたらどうか。
  • 日付をループさせて、翌月になるまで調べたらどうか。
  • 最終金曜日なので、後ろから調べたほうが楽ではないか?
  • その月の最終日って、どうやって求めるの?

様々な意見があって、実に興味深い。自分たちで意見を出し合いながらマクロを作成するため、単なる座学より学習効果も高く、参加者からは好評です。

さて、最終的には幾つかアドバイスしてしまいましたが、二つのグループは同じような結論に達しました。清書すると、こんな感じです。

Function GetLastFriday(target_date As Date) As Date
    Dim NextMonthFirstDay As Date
        NextMonthFirstDay = DateSerial(Year(target_date), Month(target_date) + 1, 1)
        GetLastFriday = NextMonthFirstDay - Weekday(NextMonthFirstDay, vbSaturday)
End Function

手法としては単純です。

  1. 翌月の1日を求める。
  2. 翌月の1日が、土曜始まりで1週間の何日目かを求め、それを翌月1日から引く。

f:id:Infoment:20180730063936p:plain

8/1 ⇒ Weekday = 5 ⇒ 8月1日の5日前は7/27(金)
9/1 ⇒ Weekday = 1 ⇒ 9月1日の1日前は8/31(金)
10/1 ⇒ Weekday= 3 ⇒ 10月1日の3日前は9/30(金)

確かに手法としては単純ですが、独力で思いつくのは難しいかもしれません。
(私も教わった口です)。

参考まで。