シフト部分の5回目、最終回となります。
今回は、月初の処理について紹介します。
前月が31日まである月は通常週の方法で良いのですが、前日となる左隣のセルを参照しているため30日や29日が空欄になってしまう月は正常に表示されません。
1日と2日のセルに対策をします。
もくじ
1日の処理
1日の処理は、31日が空欄のときは30日を、前月が2月の場合は30日と29日が空欄になるため28日を参照しないといけません。また、うるう年にも対応させる必要があります。
上段の処理
セルに表示させる文字列の判定方法は通常週と同じですが、空欄になっているかを判定させる要素を加えます。
前日が空欄セルなのかを判別して、空欄であれば更にその前日の値を参照し、判断させます。
1日のセル”O10”に、以下の関数を入力します。
=IF(O9=1,"○",IF(N10="",IF(M10="",IF(L10="",IF(AND(K10="A",O9=7),"A",IF(AND(K10="B",O9=7),"○",IF(AND(K10="○",J10="○"),"A",IF(O9=2,"B",K10)))),IF(AND(L10="A",O9=7),"A",IF(AND(L10="B",O9=7),"○",IF(AND(L10="○",K10="○"),"A",IF(O9=2,"B",L10))))),IF(AND(M10="A",O9=7),"A",IF(AND(M10="B",O9=7),"○",IF(AND(M10="○",L10="○"),"A",IF(O9=2,"B",M10))))),IF(AND(N10="A",O9=7),"A",IF(AND(N10="B",O9=7),"○",IF(AND(N10="○",M10="○"),"A",IF(O9=2,"B",N10))))))
前日が空欄になっている場合は更にその前日を参照するため、31日の表示があったときの関数、30日があったときの関数とそれぞれに判定条件を入れ子構造で繰り返しています。
かなり複雑になってしまいました。
コード | 意味 |
---|---|
IF(O9=1 | もし O9=1(日曜日) ならば |
“○” | 真のとき ○ |
IF(N10=”” | 偽のとき もし N10=””(空欄) ならば |
IF(M10=”” | 真のとき もし M10=””(空欄) ならば |
IF(L10=”” | 偽のとき もし L10=””(空欄) ならば |
IF(AND(K10=”A”,O9=7) | 真のとき もし K10=”A” かつ O9=7(土曜日) ならば |
“A” | 真のとき A |
IF(AND(K10=”B”,O9=7) | 偽のとき もし K10=”B” かつ O9=7(土曜日) ならば |
“○” | 真のとき ○ |
IF(AND(K10=”○”,J10=”○”) | 偽のとき もし K10=”◯” かつ J10=”◯” ならば |
“A” | 真のとき A |
IF(O9=2 | 偽のとき もし O9=2(月曜日) ならば |
“B” | 真のとき B |
K10)))) | 偽のとき K10 |
IF(AND(L10=”A”,O9=7) | 偽のとき もし K10=”A” かつ O9=7(土曜日) ならば |
“A” | 真のとき A |
IF(AND(L10=”B”,O9=7) | 偽のとき もし L10=”B” かつ O9=7(土曜日) ならば |
“○” | 真のとき ○ |
IF(AND(L10=”○”,K10=”○”) | 偽のとき もし L10=”◯” かつ K10=”◯” ならば |
“A” | 真のとき A |
IF(O9=2 | 偽のとき もし O9=2(月曜日) ならば |
“B” | 真のとき B |
L10)))) | 偽のとき L10 |
IF(AND(M10=”A”,O9=7) | 偽のとき もし M10=”A” かつ O9=7(土曜日) ならば |
“A” | 真のとき A |
IF(AND(M10=”B”,O9=7) | 偽のとき もし M10=”B” かつ O9=7(土曜日) ならば |
“○” | 真のとき ○ |
IF(AND(M10=”○”,L10=”○”) | 偽のとき もし M10=”◯” かつ L10=”◯” ならば |
“A” | 真のとき A |
IF(O9=2 | 偽のとき もし O9=2(月曜日) ならば |
“B” | 真のとき B |
M10)))) | 偽のとき M10 |
IF(AND(N10=”A”,O9=7) | 偽のとき もし N10=”A” かつ O9=7(土曜日) ならば |
“A” | 真のとき A |
IF(AND(N10=”B”,O9=7) | 偽のとき もし N10=”B” かつ O9=7(土曜日) ならば |
“○” | 真のとき ○ |
IF(AND(N10=”○”,M10=”○”) | 偽のとき もし N10=”◯” かつ M10=”◯” ならば |
“A” | 真のとき A |
IF(O9=2 | 偽のとき もし O9=2(月曜日) ならば |
“B” | 真のとき B |
N10 | 偽のとき N10の値を表示 |
)))))) | 閉じる |
入れ子構造が複雑すぎて分かり難くなりました。わかりやすく説明する方法、誰か教えてください。
下段の処理
下段は、上段を参照して判断しているため通常週と同じです。
入力している関数は、以下の通り。”O14”セルへ入力します。
=IF(AND(O9=7,O10="○"),"A",IF(AND(O9=7,O10="A"),"○",IF(O9=1,"○",IF(O10="A","B","A"))))
2日の処理
2日の処理も前日の1日と更にその前日を参照して判断するため、空欄のときの対策が必要です。
上段の処理
すぐ隣の前日1日のセルと、更にその前日である31日のセル、空欄であれば更にその前日の値を参照し、判断させます。
2日のセル”P10”に、以下の関数を入力します。
=IF(O9=1,"○",IF(N10="",IF(M10="",IF(L10="",IF(AND(K10="A",O9=7),"A",IF(AND(K10="B",O9=7),"○",IF(AND(K10="○",J10="○"),"A",IF(O9=2,"B",K10)))),IF(AND(L10="A",O9=7),"A",IF(AND(L10="B",O9=7),"○",IF(AND(L10="○",K10="○"),"A",IF(O9=2,"B",L10))))),IF(AND(M10="A",O9=7),"A",IF(AND(M10="B",O9=7),"○",IF(AND(M10="○",L10="○"),"A",IF(O9=2,"B",M10))))),IF(AND(N10="A",O9=7),"A",IF(AND(N10="B",O9=7),"○",IF(AND(N10="○",M10="○"),"A",IF(O9=2,"B",N10))))))
1日と同じ様に空欄になっている場合は更にその前日を参照しますが、1日が固定で参照できますので判定条件の入れ子構造は
半分ほどで済みます。
1日の関数と比べると比較的わかりやすくなっています。
コード | 意味 |
---|---|
IF(P9=1 | もし P9=1(日曜日) ならば |
“○” | 真のとき ○ |
IF(AND(O10=”A”,P9=7) | 偽のとき もし O10=”A” かつ P9=7(土曜日) ならば |
“A” | 真のとき A |
IF(AND(O10=”B”,P9=7) | 偽のとき もし O10=”B” かつ P9=7(土曜日) ならば |
“○” | 真のとき ○ |
IF(N10=”” | 偽のとき もし N10=””(空欄) ならば |
IF(M10=”” | 真のとき もし M10=””(空欄) ならば |
IF(L10=”” | 偽のとき もし L10=””(空欄) ならば |
AND(O10=”○”,K10=”○”) | 真のとき もし O10=”◯” かつ K10=”◯” ならば |
AND(O10=”○”,L10=”○”)) | 偽のとき もし O10=”◯” かつ L10=”◯” ならば | AND(O10=”○”,M10=”○”)) | 偽のとき もし O10=”◯” かつ M10=”◯” ならば |
AND(O10=”○”,N10=”○”)) | 偽のとき もし O10=”◯” かつ N10=”◯” ならば |
“A” | 真のとき A |
IF(P9=2 | 偽のとき もし P9=2(月曜日) ならば |
“B” | 真のとき B |
O10 | 偽のとき O10の値を表示 | ))))) | 閉じる |
下段の処理
2日も下段は、上段を参照して判断しているため通常週と同じで構いません。
入力している関数は、以下の通り。”P14”セルへ入力します。
=IF(AND(P9=7,P10="○"),"A",IF(AND(P9=7,P10="A"),"○",IF(P9=1,"○",IF(P10="A","B","A"))))
これで、年月と最初のシフトを入力するだけで、シフトの自動表示ができるようになりました。
次回からは、祭日などの休日のセルを色を変えてわかりやすくする方法を紹介します。
【Excel2010】最小限の入力で自動作成するシフト表 第1回【関数】
【Excel2010】最小限の入力で自動作成するシフト表 第2回 日付Part1【関数】
【Excel2010】最小限の入力で自動作成するシフト表 第3回 日付Part2 月末処理【関数】
【Excel2010】最小限の入力で自動作成するシフト表 第4回 曜日Part1 平常日【関数】
【Excel2010】最小限の入力で自動作成するシフト表 第5回 曜日Part2 月末処理【関数】
【Excel2010】最小限の入力で自動作成するシフト表 第6回 シフトPart1 通常週【関数】
【Excel2010】最小限の入力で自動作成するシフト表 第7回 シフトPart2 月度始め【関数】
【Excel2010】最小限の入力で自動作成するシフト表 第8回 シフトPart3 月末処理1【関数】
【Excel2010】最小限の入力で自動作成するシフト表 第9回 シフトPart4 月末処理2【関数】
【Excel2010】最小限の入力で自動作成するシフト表 第10回 シフトPart5 月初処理【関数】
【Excel2010】最小限の入力で自動作成するシフト表 第11回 休日表示Part1【関数】
【Excel2010】最小限の入力で自動作成するシフト表 第12回 休日表示Part2【関数】
【Excel2010】最小限の入力で自動作成するシフト表 第13回 休日表示Part3【関数】
【Excel2010】最小限の入力で自動作成するシフト表 第14回 休日表示Part4【関数】
【Excel2010】最小限の入力で自動作成するシフト表 第15回 休日表示Part5 最終回【関数】