コード日進月歩

しんくうの技術的な小話、メモ、つれづれ、など

WORKDAY関数を駆使して人日工数の稼働開始日から終了日を割り出す

昨日の発展編。WORKDAYに関してはこちら参照のこと

WORKDAY関数の仕様

WORKDAY関数の仕様は以下

  • 経過日数を設定する「日数」の数値を0にすると休日判定かかわらず「開始日」の値になる
  • 日数のカウントは当日が含まれない。そのため、1を指定すると翌日の値になる。
  • 土日の場合は当日が含まれないので明けの日数からカウントされた日付になる

工数換算の仕様

対して工数見積もりとしてスタンダードそうな仕様は以下

  • 開始日は1日とみなし、作業終了日を見積もりたい
  • 土日を含めた祝日は工数として入れない

2つの要件を満たす方法

  • WORKDAYに指定する日数は原則人日工数から-1した数値を指定する
  • ただし開始日が土日と祝日の場合は-1すると開始日になってしまうので-1しない。

このような形で関数を組み合わせればOK

例と解説

  • 開始日がB1
  • 人日工数の値がB2
  • L列が祝日の日付が並んでる

とすれば以下のようにする

=WORKDAY(B1,IF(OR(WEEKDAY(B1,2)>5,COUNTIF($L:$L,B1)>0),B2,B2-1),$L:$L)

分かりづらい部分を解説する

対象が土日か

WEEKDAY(B1,2)>5

WEEKDAY関数の2つ目で 2 を指定すると 月曜日が1となり順番に曜日が進む毎にカウントされ、土曜日が6,日曜日が7となる。

対象が祝日か

COUNTIF($L:$L,B1)>0

L列が日付の羅列になっているので、それと合致するものが0個以上あればその日は祝日とみなすことができる

土日か祝日の場合はB2の値そのまま、それ以外はB2から-1の数値を出す

IF(OR(WEEKDAY(B1,2)>5,COUNTIF($L:$L,B1)>0),B2,B2-1)

上2つをORで囲んで、土日かを比較する

参考リンク