[[20050531094918]] 『有給休暇の付与日数の計算式』(ケー子) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『有給休暇の付与日数の計算式』(ケー子)

お世話になります。

有給休暇の付与日数の計算式についてお尋ねします。

2004年4月1日入社の方は2005.4.1に11日、 2006.4.1に12日、 2007.4.1に14日、 2008.4.1に16日、 2009.4.1に18日、2010.4.1以降は毎年20日与えられます。

タイムカードの日付がN7:N37まで、11日から始まって翌月10日迄入っています(3月11日〜4月10日は4月分、4月10日〜5月10日は5月分…)。

セルW4に次の式をいれて付与日数を出すようにしました。

=IF(COUNTIF(N7:N37,"4/1"),CHOOSE(YEAR(N7)-2004,11,12,14,16,18,20),CHOOSE(YEAR(N7)-2004+1,11,12,14,16,18,20))

4月分はセルN7の年が2005年になると"11"となり5月分のタイムカードの付与日数が翌年(2006年)の付与日数の"12"になりうまくいくのですが、

N7を2006年にすると4月のシートが"14"になってしまい、なるべき数字の"12"になりません。

2006年にしても5月のシートで翌年(2007年)に与えられる数字の"14"で問題ないようです。

上の式のどこがおかしいのか判りません。ご教示お願いいたします。


 上の式はCOUNTIF(N7:N37,"4/1") の部分がTRUEになることはないので、
 必ず、CHOOSE(YEAR(N7)-2004+1,11,12,14,16,18,20)で算出されてしまいます。
 別案の式ですが、以下の式で合ってますか。

 =LOOKUP(N28,{38078;38443;38808;39173;39539;39904;40269},{10;11;12;14;16;18;20})

 式中の5桁の数値は各年度の4月1日のシリアル値です。
 38078	2004/4/1
 38443	2005/4/1
 38808	2006/4/1
 39173	2007/4/1
 39539	2008/4/1
 39904	2009/4/1
 40269	2010/4/1

 (川野鮎太郎)

 日付はシリアル値で入力されているものと思われますが、
 =IF(COUNTIF(N7:N37,"4/1")・・・
 この部分の"4/1"は、本年の"4/1"と認識されているようです。
 したがって、来年になればこの式で正しい結果が得られると思います。
 ためしに、システムの日付を来年にして試してください。
 再計算した時点で、値が変わることが確認できると思います。
 (Excel2003での確認)

 ちなみに4月1日の判定の部分をを、=IF(MONTH(N28)=4,・・・のようにすれば、
 システムの日付に関係なく計算できます。
 ケー子さんのレイアウトでは、年度替りの月は必ず3月11日からスタートし、
 N28セルに4月1日になりますね。
 また、翌月はN28セルは常に5月2日になりますから、
 この式でも大丈夫だと思いますがいかがでしょうか
 (sato)

川野さま、Satoさま、ありがとうございました。LOOKUPを使う場合シンプルですが日付のチェックが判りにくいため、4月1日の判定を以下のように書き改めうまくいきました。
=IF(COUNTIF(N7:N37,DATE(YEAR(N7),4,1)),CHOOSE(YEAR(N7)-2004,11,12,14,16,18,20),CHOOSE(YEAR(N7)-2004+1,11,12,14,16,18,20))
おふたかたの解答、大変参考になりました。ありがとうございました。(ケー子)

川野鮎太郎
いつもお世話になりありがとうございます。再度の質問ですみません。勉強のためお聞きしたいのですが、COUNTIF(N7:N37,"4/1") の部分がTRUEになることはないというようなことは、頭で考えないで、なにかDebugツールのようなものでCOUNTIFの値がどうなっているかを目で見ることはできないでしょうか?よろしくお願いいたします。(ケー子)


 失礼しました。
 >COUNTIF(N7:N37,"4/1") の部分がTRUEになることはない
 これは間違いですね。 satoさんのおっしゃるように、今年の分と言う事でTrueになるようですね。

 ※ただ、CHOOSE関数を使う場合は、引数で条件を増やさないと、エラーが出ませんか?
 2004/3/11以前や、2010/1/11以降の場合などです。

 Debugツールというのは判りませんが、数式バーで該当部分をドラッグして
 ファンクションキー(F9)を押すことで、計算式の検証が出来ます。

 (川野鮎太郎)


川野鮎太郎さま おっしゃるとおり2010以降になると引数が足りなくなります。そこまで考えられませんでした。MAXが20なので後は何年になっても20となるようにできないでしょうか?MAX関数やMIN関数を使うと思うのですがわかりません。前に戻ることはありませんので2004年を基準にそのあとということで作りたいと思います。(ケー子)


 それもあってLOOKUP関数で代替案をお出ししたんですがね・・・(^_^A;

 CHOOSE関数の引数で YEAR(N7)-2004 を最大6にすれば良いわけですから、
 MIN(YEAR(N7)-2004,6) でいけると思います。

 (川野鮎太郎)


はやばやとご解答ありがとうございます。MIN関数うまく使えました。感激です。ただ、LOOKUP関数の代替案が見つかりません。ここにコピーしていただけませんか?よろしくお願いいたします。(ケー子)


 あれ・・・?
 上のほうで書いていましたけど、日にちのチェックがわかり難いってことで、
 却下されましたけど・・・(^_^A;

 (川野鮎太郎)

川野様 そのとおりです。勘違いしておりました。無視してください。もう一点勉強のため初歩的な質問させてください。最大を出すのがなぜMIN関数なのでしょうか?エクセルでそのようになっているからだと思いますがわたしにはちょっと覚えにくいのです。MAXなら感覚的に納得できるのですがどのように考えればよろしいのでしょうか?シツコクてすみません。(ケー子)


 こう考えてください。
 YEAR(N7)-2004 の場合、2010年で6になりますよね。
 とすれば、
 2009年以前は、5より少なくなり、2011年で6より大きくなる。

 6より大きい数値がCHOOSEの引数に入るとエラーになるので、
 MIN(6より大きい,6) で6が返ることになり、
 2010年以降は、必ず6になるってことです。

 (川野鮎太郎)

鮎太郎さま 6より大きい場合は、最小(Min)でも返る値が6と言うことでMinが使われているのだなと納得できました。大変ありがとうございました。(ケー子)


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.