« L319 | メイン | 迷惑メールその2 »

エクセルで営業日判定

 同僚がエクセルで一ヶ月の予定表・チェックリストを作っていた。土日等の休業日には横線を引いているのだが、図形描画でやっているので大変そうだ。自動で営業日判定が出来ないかなと思い試してみた。土日の判定ぐらいはあっという間に出来そうだが、ワシの勤務先は第二土曜は出勤なのだ。条件付き書式で「土日は網掛け」という訳にはいかなそうである。グーグルで検索してみたが、「エクセル 第二土曜」で検索しても求人情報の勤務条件がヒットするばかり。

 まずは基準日(その表の中の1日)の取得。今日の日付を元に来月の表を・・・と思ったが、この作業は月末に行う時もあれば、月初にずれ込んでしまうこともある。手入力(エクセルではCTRL+;[セミコロン]で当日の日付が入力できる。ちなみにCTRL+:[コロン]で現在時刻)とも思ったが、後々の運用を考えて、年と月をそれぞれ別のセルに入力して、それを元に日付を生成して基準日とする形にした。それに1を足す式を入れていけば1日から31日まで並ぶ。これをA列にした。

 次に曜日を表示させてみた。B列にA列の内容を持ってきて(「=A8」など)、書式を"aaa"にするだけ。更に隣のC列にはWEEKDAY関数を使って曜日を数字で表示させる。日曜日が1、土曜日が7となった。

 更にIF関数を使って、D列には土日だったら1が入るようにし、E列に「土曜日だったら1」と表示させ、F列にE列の累計を計算させてみた。これで「土曜日だけ1が入っている列」と「第何土曜日から始まる週(ただし土曜日始まりで他の曜日にも1が入っている)」が並んだ。

 この二つの列を見比べて、第二土曜だけ標識が立てばいいんだよなと思いつつ、「二つの列を足して3だったら第二土曜(土曜日の標識1と第二土曜の週の2の和が3)」としてみた。しかしこれでは第三週の平日も3になってしまう。失敗だ。

 しばし考え、平日は0なのでかけ算にすればいいとひらめいた。二つの列を掛けて、2だったら第二土曜日ということになる。IF関数を使い、「第二土曜日だったら1」がG列に入るようにした。H列に「D列-G列」を入れれば、「第二土曜日以外の土日」になった。

 だいたいうまく行った。日付列の隣に「もしH列が1だったら"-------------"」と式を入れて、休業日には取消線もどきが表示されるようにした。ついでに一番左に一列挿入し、臨時休業だったら1を入れるようにした。その列とH列との合計を最終の休業日として使えばいいだろう。臨時営業の時は-1を入れればいい。あとは列を入れ替えたりして計算用の列は右の端の方に追いやり、印刷範囲を指定して、余計なところが印刷されないようにして終了。

 後から気付いたが、単純に土曜日が8~14日だったら第二土曜日というのでも大丈夫そうだな(普通はそうするか・・・)。構想なしにいきなり作り始めたからなあ・・・まあ、結果は一緒だし、一応正しく動くみたいだからいいことにしておこう。

 30分程だったがなかなか楽しめた。あとはこの手の表を使いそうな人、エクセルが好きそうな人に配ってお終い。エクセルを方眼紙としてしか使っていない人も多く、「へー、エクセルって計算も出来るんですか」という声を聞いたこともある。仕事に使う表としてはまだまだ不完全だが、誰か一人ぐらいは使ってくれるだろう。でも、「今までの表の方が使いやすい」とか「線を引き直すのはそんな手間じゃないし」とか「今日は忙しい」とかで終わっちゃう可能性も大だな・・・

コメントを投稿