OpenOfficeで第三日曜日は何日かを、計算する

第二月曜日にミーティング、第三金曜日に飲み会、などのスケジュールを組むとき何日だったかと計算しなければいけないことがあるでしょう。
そんなときに役に立つ数式を紹介します。

使う関数 数式の構成 セルのアドレスに当てはめる サンプルファイル

ここで使う関数

関数名:DATE関数
書式:=DATE(年;月;日)
何ができる:指定した日付に対応するシリアル値が求められる
平たく書くと:=DATE(2009;12;24)で2009年12月24日のシリアル値が求められ、日付に対して足し算引き算ができるようになります。

関数名:WEEKDAY関数
書式:=WEEKDAY(日付のシリアル値;種類)
何ができる:指定した日付の曜日番号が求められる
平たく書くと:=WEEKDAY(DATE(2009;12;24);1)で2009年12月24日の曜日番号が、種類1の場合について、求められます。

種類を変えると、下のように変わります。
種類→ 1 2 0

日曜日 1 7 6
月曜日 2 1 0
火曜日 3 2 1
水曜日 4 3 2
木曜日 5 4 3
金曜日 6 5 4
土曜日 7 6 5
種類を選択することで、作業にあった番号を曜日に割り当てることができます。

ここでは、曜日番号を求める種類を1に設定して数式の作成を進めます。

数式の構成

ここでは、2011年9月の第四金曜日を求めてみます。

4回目の曜日を求めるので4に7を掛けます。
これは、4週目に求める曜日が登場すると仮定した計算です。_____1

次に、求める年と月、ここでは2011年9月の初日(1日)の曜日番号から、求める曜日番号(金曜日の場合:6)を引き、その値を_____1で得た値から引きます。
これは、初日と求める曜日番号のズレを修正する計算です。_____2

2011年9月1日の曜日番号は、=WEEKDAY(DATE(2011;9;1);1)で5と分かります。

ここまでを整理すると、4*7-(WEEKDAY(DATE(2011;9;1);1)-6)

この値に1を加えます。1を加えるのは9月1日を計算内に含めるためです。
4*7-(WEEKDAY(DATE(2011;9;1);1)-6)+1_____3

ここまでを計算すると、28-(5-6)+1で30が求められます。
この計算は、間違っています。30日は、第五金曜日です。
なぜでしょう?
それは、求める曜日番号が、2011年9月1日の曜日番号より大きいためです。
求める曜日番号が、1日の曜日番号よりも大きいということは、カレンダーの一週目に求める曜日番号が登場するということです。
そこで、4週目に登場する前提で4を掛けたのを、3に修正します。
その処理のために、4*7-(WEEKDAY(DATE(2011;9;1);1)-6)+1から7を引きます。_____6

ここまでを数式に整理すると、
=IF(6セルのアドレスを当てはめる

送信者 OpenOffice

上の画像では、

  • 対象の年はE1
  • 対象の月はE2
  • 求める曜日番号はE3に入力されています。求める曜日に対応する番号を左の表から選択することができます。
  • 何回目の曜日を求めるかをE4
  • にそれぞれ入力しています。

=IF(E3;E4*7-(WEEKDAY(DATE(E1;E2;1);1)-E3)+1;E4*7-(WEEKDAY(DATE(E1;E2;1);1)-E3)+1-7)
さらにE4セルが空白の場合は、空白のままにしておくように、
=IF(E4="";"";IF(E3;E4*7-(WEEKDAY(DATE(E1;E2;1);1)-E3)+1;E4*7-(WEEKDAY(DATE(E1;E2;1);1)-E3)+1-7))
この数式は、エクセルでも使用可能です。ただし、エクセルの場合、セミコロン(;)をコンマ(,)に変更する必要があります。

サンプルファイル

第四金曜日を求めるサンプルファイルは、calc064.odsをダウンロードしてください。


参考:
OpenOfficeで曜日を扱う
OpenOfficeで日付の扱いを極める-3  『特定の日から何ヶ月何日後の日付を求める』