シート1のA1セルに2011/1/24と入力して、土日祭日を抜いた3日前をB1セルに表示させるとしたら、その前にその年の祭日(会社の休日などを含む)の日付を例えばシート2のA2セルからA29セルまでに入力するとします。2011年の祝日を入力する場合には、シート2のA1セルには2011/1/1と入力し、セルの表示形式でユーザー定義でyyyy”年" として2011年と表示させます。
これらの作業が済んだ後でシート1のB1セルには次の式を入力します。
=WORKDAY(A1,-3,Sheet2!A$2:A$29)
なお、セルの表示形式はユーザー定義で m"月"d"日"(aaaa) と入力します。これで1月19日(水曜日)と表示されますね。
次に、毎月休日を指定できるようにしたいとのことですが、指定した月の休日を表示させるためには結構面倒な計算になりますので次のようにしてはどうでしょう。
シート2のA30セルには次の式を入力してA136セルまでオートフィルドラッグします。なお、A130セル以降でエラー表示が出る場合にはそれらの行は削除してA列にはエラー表示が出ないようにしてください。
=IF(MOD(ROW(A1),2)=1,IF(YEAR(A$1+IF(WEEKDAY(A$1,2)<7,6-WEEKDAY(A$1,2),13-WEEKDAY(A$1,2))+INT(ROW(A1)/2)*7)<>YEAR(A$1),"",A$1+IF(WEEKDAY(A$1,2)<7,6-WEEKDAY(A$1,2),13-WEEKDAY(A$1,2))+INT(ROW(A1)/2)*7),IF(YEAR(INDIRECT("A"&ROW()-1)+1)<>YEAR(A$1),"",INDIRECT("A"&ROW()-1)+1))
これでその年の土曜日と日曜日の日付が表示されます。なお、シート2のA2セルから下方の日付はセルの表示形式で日付から選んで表示させるようにします。
次にシート2のB2セルには次の式を入力してB136セルまでオートフィルドラッグします。
=IF(AND(A2>=Sheet1!C$1,A2<=DATE(YEAR(Sheet1!C$1),MONTH(Sheet1!C$1)+1,0)),A2,"")
この式ではシート1のC1セルに表示させたい月を、例えば今年の2月の休日を表示させたい場合には、シート1のC1セルに2011/2/1と入力して、セルの表示形式をユーザー定義で m"月" として2月と表示させます。
このようにシート1のC1セルで指定した月の休日になる日付がシリアル値の形でシート2のB列に表示されることになります。
そこでシート1のC1セルで指定した月の休日をシート1のC2セルから下方に表示させるためにはC2セルに次の式を入力して下方にオートフィルドラッグします。
=IF(ISERROR(SMALL(Sheet2!B:B,ROW(A1))),"",SMALL(Sheet2!B:B,ROW(A1)))
表示形式を日付にすることでその月の休日が並んで表示されます。
お礼
いろいろありがとうございました。関数が、難しいですね。もっと勉強します。