Chiquilin Site■11.07.25_Excel:曜日指定の WORKDAY関数

その1:WORKDAY関数を他の数式で表現する
その2:曜日変動に対応させる
その2:特別出勤日に対応させる
ChiquilinSite
2011年は特に休日が土日以外に変動している会社が多いと思いますが 残念なことに Excel2010で追加された WORKDAY.INTL関数は下位のバージョンでは使えません。2003以下では WORKDAY関数自体がアドイン関数になっていて使いにくいところもありますので いっそ他の関数だけで対応させてみるのも有意義だろうと判断しました。休日が連日でない会社もあるでしょうしね。

その1:WORKDAY関数を他の数式で表現する

まずはWORKDAYと同じ働きをさせる数式を考えます。とはいえ WOKDAY関数にどこまで対応させるかによって数式の長さが全然違ってきます。完全に一緒にしようと思うと数式が長くなります。ひとまずは「日数が1〜50日まで」限定の「WORKDAY関数もどき」で考えてみましょう。なにはともあれ祝日リストは必要なので 別のシートにデータを入れて「祝日一覧」と名前定義しているものとします。祝日の作り方については「Excel:祝祭日を計算する」を参考にして下さい。インターネットで検索して一覧表を探してきてもいいと思います。名前の定義の仕方については「Excel:カレンダーを作る1」を参考にして下さい。
 
A2セル:開始日/B2セル:日数
■C2セル
=A2+SMALL(((WEEKDAY(A2+ROW($1:$100),2)>5)+COUNTIF(祝日一覧,A2+ROW($1:$100)))*100+ROW($1:$100),MAX(1,B2))
Ctrl + Shift + Enterで確定
はい。今回の場合 全て配列計算になります。「INDEX(配列,0)」で挟んで Enter確定にしてもいいですが この最も単純な計算でこの状態ですから 古いバージョンの Excelではネスト制限が心許なくなります。後で式を名前定義すればいいだけなので 今回はこの状態でいきます。
続いて「日数−50日〜50日前後」の場合の方法を書きます。
■C2セル
=A2+SMALL((WEEKDAY(A2+ROW($1:$100)*SIGN(B2),2)>5)*100+COUNTIF(祝日一覧,A2+ROW($1:$100)*SIGN(B2))*100+ROW($1:$100),MAX(1,B2*SIGN(B2)))*SIGN(B2)
Ctrl + Shift + Enterで確定
これで対応がきくはずです。対応させる日数を増やしたければ「100」のところを増やせばいい訳ですが その分重くなっていきます。ここまではあくまで「土日祝」が休みの時のパターンですのでここから特殊な休日設定に対応させていきます。
ページの一番上へ

その2:曜日変動に対応させる

では仮に 水曜日と日曜日と祝日のみを除いて計算したい場合を考えてみましょう。日数は「1〜50日」を前提とします。
■C2セル
=A2+SMALL((ISNUMBER(FIND(TEXT(WEEKDAY(A2+ROW($1:$100)),"aaa"),"水日"))+COUNTIF(祝日一覧,A2+ROW($1:$100)))*100+ROW($1:$100),MAX(1,B2))
Ctrl + Shift + Enterで確定
「"水日"」となっているとこで曜日を調整できます。土曜日と日曜日なら「"土日"」と入れればいいです。例によって負の日数にも対応させようと思うと
■C2セル
=A2+SMALL((ISNUMBER(FIND(TEXT(WEEKDAY(A2+ROW($1:$100)*SIGN(B2)),"aaa"),"水日"))+COUNTIF(祝日一覧,A2+ROW($1:$100)*SIGN(B2)))*100+ROW($1:$100),MAX(1,ABS(B2)))*SIGN(B2)
Ctrl + Shift + Enterで確定
更に日数の縛りを取り除くと
■C2セル
=A2+SMALL((ISNUMBER(FIND(TEXT(A2+ROW(A$1:INDEX($A:$A,ABS(B2)*2+7))*SIGN(B2),"aaa"),"土日"))+COUNTIF(祝日一覧,A2+ROW(A$1:INDEX($A:$A,ABS(B2)*2+7))*SIGN(B2)))*10^6+ROW(A$1:INDEX($A:$A,ABS(B2)*2+7)),MAX(1,ABS(B2)))*SIGN(B2)
Ctrl + Shift + Enterで確定
長い式になります。さてこれで大体の計算には対応できるはずですが まだ対応しないといけない可能性があります。
ページの一番上へ

その3:特別出勤日に対応させる

例えば第二・第四土曜日のみ休みだった場合。もしくは計算上は休みなのに振替日として出社日になった場合などなど。この場合「祝日一覧」に対して「出社日一覧」を作らなければなりません。 「祝日 一覧」同様 「出社日一覧」を名前定義した上で 日数は「1〜50日」なら
■C2セル
=A2+SMALL((ISNUMBER(FIND(TEXT(WEEKDAY(A2+ROW($1:$100)),"aaa"),"土日"))+COUNTIF(祝日一覧,A2+ROW($1:$100)))*(COUNTIF(出社日一覧,A2+ROW($1:$100))=0)*100+ROW($1:$100),MAX(1,B2))*SIGN(B2)Ctrl + Shift + Enterで確定
例によって負の日数対応。
■C2セル
=A2+SMALL((ISNUMBER(FIND(TEXT(WEEKDAY(A2+ROW($1:$100)*SIGN(B2)),"aaa"),"土日"))+COUNTIF(祝日一覧,A2+ROW($1:$100)*SIGN(B2)))*(COUNTIF(出社日一覧,A2+ROW($1:$100)*SIGN(B2))=0)*100+ROW($1:$100),MAX(1,ABS(B2)))*SIGN(B2)
Ctrl + Shift + Enterで確定
やる必要があるかどうかは別として 日数の縛りを取り除くと
■C2セル
=A2+SMALL((ISNUMBER(FIND(TEXT(A2+ROW(A$1:INDEX($A:$A,ABS(B2)*2+7))*SIGN(B2),"aaa"),"土日"))+COUNTIF(祝日一覧,A2+ROW(A$1:INDEX($A:$A,ABS(B2)*2+7))*SIGN(B2)))*(COUNTIF(出社日一覧,A2+ROW(A$1:INDEX($A:$A,ABS(B2)*2+7))*SIGN(B2))=0)*10^6+ROW(A$1:INDEX($A:$A,ABS(B2)*2+7)),MAX(1,ABS(B2)))*SIGN(B2)
Ctrl + Shift + Enterで確定
はい 以上。第二・第四土曜日出社などの場合は きちんと条件指定してやる手もあるでしょうが ひとまず基本的なやり方さえ分かれば 後の対応はできるはずです。色々試してみて下さい。
→参考ファイル(049.xls)
ページの一番上へ
ChiquilinSite トップページへ  Copyright(C) Chiquilin_site. All Rights Reserved.
inserted by FC2 system