• ベストアンサー

EXCELで作ったカレンダーで仕事の管理(VLOOKUP?)

仕事の種類が15ほど(仕事1、仕事2、など)あります。 エクセルで1年間の年月日を入力します。 仕事は、仕事1は40日ごと・仕事2は35日ごと・仕事3は50日ごと。。といったように周期で決まっております。それを仕事をやる最初の日付を入れると、それぞれの日付にあわせて、例えば仕事1の最初の日付が2006/8/4だとすると、その40日後の日付の横のセルに「仕事1」というようにそれぞれ表示させたいのです。 Vlookupで考えたのですが、ネストが7つまでしか出来ませんでしたので、断念しました。 何かよい関数や案など、どんなことでもよいので教えていただけませんか?

質問者が選んだベストアンサー

  • ベストアンサー
noname#64582
noname#64582
回答No.3

2番で回答した者です。 書き忘れました。 先ほどの形式ですと、 仕事1はB列、仕事2はC列、・・・仕事15はP列までとなります。 また、仕事の周期(40日とか35日)を指定するセルを作って、さきほどのMOD関数の第2引数に当てはめると、周期が変更になったときにも対応しやすいかもしれません。 例)さっきの表形式から1行下げて、周期を入力する行(2行目)を作るということです。具体的には、 A3:A367 を2006/1/1~2006/12/31 とする。 B1  には、その年初めてその仕事をする日 B2 には、周期 B3  には、IF(MOD($B$1-A3,$B$2)=0,"仕事1","") それでB3から一番下まで。

botanbotan
質問者

お礼

すごいです!!まさに希望通りでした。 周期が変わったときにも簡単に対応できるというところがすごいです。 このようなことを考えられるのがうらやましいです・・・ どうもありがとうございました。

その他の回答 (4)

  • Nouble
  • ベストアンサー率18% (330/1783)
回答No.5

考え方として配列関数を用いる方法が挙げられると思います。 WEEKDAY関数を利用して平日に1を、休日に0を配列内で割り付けます さらに此にセルナンバーを掛け合わせます。 これの配列は「休日は0」ですからセルナンバーを掛けても0ですね、 LRAGE関数やSMALL関数でソートすると 0とそれ以外に分かれますので 即ちは平日と休日にセルナンバーが分けられますよね この状態の配列からINDEX関数なので 40番目・80番目… などに位置する配列要素を取り出せられれば 即ちそれが該当するセル位置の情報なので、 各位置のセルに設定された構文が 「自らのセル位置が該当するか?」を識別し判断することが可能になると思いますよ。 配列の扱いについては参考URLを参照頂ければ 至極容易く習得できると思いますので宜しくですよ 如何でしょうか? 参考になりましたでしょうか? ところで 3つの仕事を一つの関数で表現しようとした場合、 任意の2つの仕事周期の最小公倍数で 仕事が必ずダブルブッキングしますよね? 「仕事がかぶった場合はどうするのか?」 という問題を解決する必要があると思いますよ

参考URL:
http://pc.nikkeibp.co.jp/pc21/special/hr/index.shtml
botanbotan
質問者

お礼

配列関数はちょうど勉強しようと思っていたので、とてもわかりやすい URLを教えていただき、大変助かります。 こちらを見て、もっと勉強したいと思います。 どうもありがとうございました。

  • Cupper
  • ベストアンサー率32% (2123/6444)
回答No.4

もう1つ力技 A列に日付、B列に曜日、C列に仕事の表示・・・と考えたとき以下のようにする。 ・D列に仕事1を入力 ・そのセルのその日を含めて縦40日分の行を選択 ・40日目の右下のマークを12月31日の行までドラッグしてフィル  (40セル分の内容を繰り返しフィルされます) ・仕事1の横、E列に仕事2を入力 ・そのセルのその日を含めて縦35日分の行を選択 ・35日目の右下のマークを12月31日の行までドラッグしてフィル ・(以下仕事の数だけ繰り返し) ・C2に次の関数式を入力   =CONCATENATE(D2,E2,F2,G2,H2,I2,J2,K2,L2,M2,N2,O2,P2,Q2,R2) ・C2を12月31日の行までフィル C列に仕事のテキストが表示されます。

botanbotan
質問者

お礼

CANCATENATEという関数を初めて知りました! こんな関数があったんですね。 これは他にも使えそうです。。。 この関数を使えば、仕事が重なったとしても、ちゃんと表示されるので、ぜひ使いたいと思います。 どうもありがとうございました。

noname#64582
noname#64582
回答No.2

しろうとです。 あなたのシートの形式とあってるかわかりませんが、私はこうしてみました。 A2:A366 に「2006/1/1」から「2006/12/31」の日付を入れます。 B2セルには、 =IF(MOD($B$1-A2,40)=0,"仕事1","") これをB366までドラッグ。 B1セルに、その年に初めてその仕事を行う日を入力。 B2セルの意味としては、 $B$1-A2・・・ その日が、その年に初めてその仕事を行う日から何日経ってるか。 MOD($B$1-A2,40)・・・MOD関数は割り算の余りを返します。したがって、$B$1-A2で求めた値を40で割ると、40日周期で回ってきたところが割り切れる。すなわち余りは0。 0になった日に「仕事1」を表示させる。そうでない日は空欄。 お察しのとおり、35日周期で表示したいなら、MOD(x,y) のyを35にするだけです。 いちおう試作して、お求めの結果が出るかご確認ください。 お役に立ててれば幸いです。シートの形式が違うようならすみません。

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.1

VBAでは簡単なのだが、関数では難しい。あるセルめがけてデータを投げるイメージの処理はできない。VBAならCells(i,"A")=”ABCD" の i に最初の行を5として、5+40にして実行、5+40*2として実行で、5、45、85行・・・に行事文字列ABCDを代入できる。同じ日に2行事が重なっても、”ABCD" &”EFGE"をセットできる。 多分良い回答は原理的に出ないのではないかな。

botanbotan
質問者

お礼

私もVBAでないと無理なのかなと思ったんです。 今後、VBAを組むことを考えようと思っていたので、教えていただいて 大変ためになりました。 どうもありがとうございました。

関連するQ&A

専門家に質問してみよう