[[20061011165149]] 『祝日』(ばんばん) ページの最後に飛ぶ

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

 

『祝日』(ばんばん)
 いつもお世話になります。

 今回は数式の解説をお願いしたいのですが、よろしくお願いします。
勤怠表の祝日テーブルに関数を入れて、条件付書式で塗りつぶしをしているのですが、
Excelでは間違いなく結果が出てくると思うのですが、その人はオープンオフィスというのを使用していて、
それだとエラーになるそうです。それでこの数式を使えば、
オープンオフィスでもエラーにならないと言われました。
数式を紐解いてみたのですが、わからないので、ご解説頂ければ幸いです。

 教えてもらった式
=IF(WEEKDAY(DATEVALUE(D32&"/1/1"),2)=1,
1/1が月曜日だったら
DATEVALUE(D32&"/1/8"),
1/8
DATEVALUE(D32&"/1/14")-WEEKDAY(D32&"/1/1",2)+1)
1/14-月曜日??
この式が何を意味しているかが、わかりません。
ご教授よろしくお願い致します。

 おそらく成人の日を返す関数を作っていると思われますが、
DATEVALUE(D32&"/1/14")-WEEKDAY(D32&"/1/1",2)+1)
                                             ~2では?
(ROUGE)

 ROUGEさん、いつもお世話になります。
そうです、成人の日を返す関数です。なのですが、3段目の関数の意味が
理解できず。。。
ROUGEさんにご指摘頂いた、"・・・~2では?"の意味もわかっておりません。。。
2を加えるとすると、、、火曜日??
すみません、数式の意味を教えて下さい。
相変わらず、頭がカチカチな(ばんばん)

 それぞれを分解して確認してみて下さい。
 最後の+1は+2の間違いだと思って書き込みました。
 こんなのでもよさそうです。
 =DATE(D32,1,15)-TEXT(WEEKDAY(DATE(D32,1,1),3),"0;;7")
 IF関数不要です
 (ROUGE)

 >DATEVALUE(D32&"/1/14")-WEEKDAY(D32&"/1/1",2)+1)
 >1/14-月曜日??
 「なんで月曜日を引くの?」でお悩みのようですが
 その前の条件で「1日が月曜日で無い場合」が入っていますよ。
 1/1が月曜日以外で各曜日の場合、実際にWEEKDAY関数が返す数値と
 その時の成人の日の日付と1/14との関係を確認してみるのはどうですか?

 (HANA)

 お返事遅くなりました。
 >1/14-月曜日??
 この考え方がマズかったのですね。。。

 DATEVALUE(D32&"/1/14")-WEEKDAY(D32&"/1/1",2)+2)
1/14                  -各曜日の戻り値(2〜7)+2と考えると、
1/1(火)の場合は、1/14-2+2=1/14が成人の日
1/1(水)の場合は、1/14-3+2=1/13が成人の日
1/1(木)の場合は、1/14-4+2=1/12が成人の日
1/1(金)の場合は、1/14-5+2=1/11が成人の日
1/1(土)の場合は、1/14-6+2=1/10が成人の日
1/1(日)の場合は、1/14-7+2=1/09が成人の日
となりました。
確かにROUGEさんの仰るとおり、+2にしないと正確な成人の日が返りませんでした。
でも、なぜ、+2としなくてはいけないのでしょうか?
WEEKDAY関数の種類を1にした時は+3を、2にした時は+2を、3にした時は+1をしないと
正確な日にちが返らないことはわかったのですが。。。
引き続きご教授下さい。
(ばんばん)


 >WEEKDAY関数の種類を2にした時は+2をしないと
 >正確な日にちが返らないことはわかったのですが。。。
 と言う事が分かっていて、何が分からないのかよく分からないのですが?

 「1/14から引いているから」と言う事が分からないのではないのですよね。
 何故、「1/14から引いているのか?」が分からないのですかね?
 推測ですが、成人の日が1/8〜1/14の何処かに収まるからではないでしょうか。
 (1/16からWEEKDAY関数の戻り値を引いても同じ日になりますよね。
  そうせずに、14日を基準にしてつじつま合わせの+2をしている理由。)
 ここの所は作った人の思いが現れている所なのだと思います。
 作った本人以外は推測しか出来ないでしょう。

 他の月のハッピーマンデーを計算する式はどうなっていますかね?
 例えば、9月の敬老の日(第3月曜日)なんてどうでしょう。
 21日が基準になってないですか?
 (14日は固定でWEEKDAY関数の戻り値がプラスされてるかな?
  となると、上の推測は外れで、先にこっちの式を作って、
  それを元に第2月曜日を割り出す式を作った・・・ですかね。)

 (HANA)


 HANAさん、コメントありがとうございます。
 >成人の日が1/8〜1/14の何処かに収まるからではないでしょうか。
これは私にもわかっています。ただ、+2にする理由がわからなかったので、
引き続きご教授をお願いした次第です。
私情を挟んではいけないのかもしれませんが、式の作成者に"作った人の思い"を聞けていれば、
こちらに投稿させていただく必要はありませんでした。
それが無理なので、こちらの先生方に式の意味を教えて頂こうと思いました。

 因みに、
 >何故、「1/14から引いているのか?」が分からないのですかね?
これってどういう意味ですか?
(ばんばん)


 あれっ。今Jakaさんからのスレッドを読んでいたのですが、更新してしまったら、
Jakaさんのがなくなってしまいました??
(ばんばん)


 すみません。
 間違っていたので、消させてもらいました。
 一応URLだけ(独自発想ですが)
http://www.vbalab.net/vbaqa/c-board.cgi?cmd=ntr;tree=37;id=FAQ

 追加
 あたふたしているので、間違っているかも
 =DATEVALUE(年 & "/" & 月 & "/" & IF(2>=WEEKDAY(DATEVALUE(年 & "/" & 月 & "/" &1),1),2-WEEKDAY(DATEVALUE(年 & "/" & 月 & "/" &1),1)+((週-1)*7)+1,8-WEEKDAY(DATEVALUE(年 & "/" & 月 & "/" &1),1)+((週-1)*7)+曜日番号))

 Date関数をDATEVALUEき置き換えただけですが...。
 (Jaka)

 ご自分の書き込みの中に、答えがあるような気が・・・
 >1/1(火)の場合は、1/14-2+2=1/14が成人の日
 >1/1(水)の場合は、1/14-3+2=1/13が成人の日
 >1/1(木)の場合は、1/14-4+2=1/12が成人の日
 >1/1(金)の場合は、1/14-5+2=1/11が成人の日
 >1/1(土)の場合は、1/14-6+2=1/10が成人の日
 >1/1(日)の場合は、1/14-7+2=1/09が成人の日
                  ~~~~ = ?  ____
^^^^は、成人の日を導き出す基準日を1/14に固定。
   =は、1/1の曜日により変動。
____は、1/1の曜日別での実際の成人の日の日付
この3要素を使って、試行錯誤された結果、?部分に+2 すれば、全曜日に応用できる!と考えられたのでは?
よって、この考えを、関数式にした場合、
 DATEVALUE(D32&"/1/14")-WEEKDAY(D32&"/1/1",2)+2)
                         ~~ としなければならない。
と考えられては、いかがでしょうか?
仮に1/14でなく、1/15だったら、?=+1 、1/16だと ?=0  としていたでしょう。
 意図と違う事を書いてたら、ポイっとして下さい。 しかもヨコからだし。。。
(sin) 

 久しぶりの登校……そして衝突しまくり。

 >>何故、「1/14から引いているのか?」が分からないのですかね?
 >これってどういう意味ですか?

 私的にちょっと意図を汲み取ると

 >「何故1/14から引いているのか?」が分からないのですかね?

 と言う意味と捕らえました。
で、本題の

 >>成人の日が1/8〜1/14の何処かに収まるからではないでしょうか。
 >これは私にもわかっています。ただ、+2にする理由がわからなかったので、

 に対してHANAさんが示された見解

 >推測ですが、成人の日が1/8〜1/14の何処かに収まるからではないでしょうか。
 >(1/16からWEEKDAY関数の戻り値を引いても同じ日になりますよね。
 > そうせずに、14日を基準にしてつじつま合わせの+2をしている理由。)
 >ここの所は作った人の思いが現れている所なのだと思います。

 これによって納得はされましたか?

 HANAさんのおっしゃるように、要は「見た目分かりやすくするため」でしょうね、おそらく。
数式として「1/14」から引いている形にしたから、ばんばんさんは
「あぁ、1/8〜1/14のどこかに収まるからこう書いているのだな」
と数式の意味を推測できたわけです。

 これがもし「1/14+2」ではなく「1/16」だったとしたら、今度は
「なんで1/16から引いているの?」
と言う疑問をもたれたでしょう。
全ては固定値が随所にあるために、数式が語る意味が理解しにくかったって所なんでしょうね。

 もうちょっと成人の日を求める為の噛み砕いて考えて見ます。
結局のところ「成人の日」を求めると言うことは、ハッピーマンデー法に従うと
「1月の第2月曜日」を求めれば良いと言う事になるわけなので、そういう数式を考えてみます。

	A	B	C	D	E
1	年	月	週	曜日	結果
2	2006 	1	2	1	

 E2セルに以下の数式を埋め込んで見てください。

 =TEXT(DATEVALUE(A2&"/"&B2&"/1")+(7*(C2-IF(WEEKDAY(DATEVALUE(A2&"/"&B2&"/1"),2)=D2,1,0)))-WEEKDAY(A2&"/"&B2&"/1",2)+D2,"yyyy/mm/dd")

 調べたい年をA2、月をB2に。 第何週かをC2に、
曜日にはWEEKDAY関数の戻り値にあわせた曜日を示す値を入れる形とします。
やってる事は
「その月の1日から何週先の該当曜日の日付を返す。ただし1日が該当曜日なら1週前とする」
って感じです。

 最初に質問にあった式
 >=IF(WEEKDAY(DATEVALUE(D32&"/1/1"),2)=1,DATEVALUE(D32&"/1/8"),DATEVALUE(D32&"/1/14")-WEEKDAY(D32&"/1/1",2)+2)
を
 >=IF(WEEKDAY(DATEVALUE(D32&"/1/1"),2)=1,DATEVALUE(D32&"/1/8"),DATEVALUE(D32&"/1/15")-WEEKDAY(D32&"/1/1",2)+1)
と読み替えて見比べてみると、どういうことをしたいのか、固定値の意味は何なのか、ってのが見えてくるんじゃないかしら。
みたいな。
(ご近所PG)コメント入力欄が出来てたのね

 DATEVALUE(D32&"/1/14")-WEEKDAY(D32&"/1/1",2)+2)
1/14                  -各曜日の戻り値(1〜7)+2と考えると、
1/1(月)の場合は、1/14-1+2=1/15が成人の日
1/1(火)の場合は、1/14-2+2=1/14が成人の日
1/1(水)の場合は、1/14-3+2=1/13が成人の日
1/1(木)の場合は、1/14-4+2=1/12が成人の日
1/1(金)の場合は、1/14-5+2=1/11が成人の日
1/1(土)の場合は、1/14-6+2=1/10が成人の日
1/1(日)の場合は、1/14-7+2=1/09が成人の日
となりますね。
8日〜14日にはずれができますね。
 よって下記に
 =DATEVALUE($A1&"/1/14")-(WEEKDAY(DATEVALUE($A1&"/1/7"),3))
 もしくは
 =DATEVALUE($A1&"/1/14")-(WEEKDAY(DATEVALUE($A1&"/1/7"),2))+1
 +2では15日が 「 1/1(月)の場合は、1/14-1+2=1/15が成人の日 」
+1 とか +2とかは ずれ調整(weekday関数で出た値に対する)

 これもx
 =DATEVALUE($A6&"/1/14")-WEEKDAY(DATEVALUE($A6&"/1/7"),1)+2 

 (WEEKDAY(DATEVALUE($A1&"/1/7"),3))  単純に 7"),3)) の3を 1 2 と
置き換え +1 +2 +3 すればよい では??? です。
(UUU) 


 >「何故1/14から引いているのか?」が分からないのですかね?
基準を14日に持ってきてるからだけ (作成者の意図するところ)
WEEKDAY(D32&"/1/1",2)+1) も DATEVALUE($A1&"/1/7"),基準にもとずけば
1/1 だろうが 1/7 だろうが いいわけですよ。
(UUU)
1/14から引いているのか   下記はDATEVALUE($A1&"/1/7")+8 から
=DATEVALUE($A1&"/1/7")+8-(WEEKDAY(DATEVALUE($A1&"/1/7"),2))
どうにでも


 みなさん、毎度!!

 む〜ん、私の書き込みわかりにくかったですかね。
 しかも余計な反感をかってしまったようで。
 >>ここの所は作った人の思いが現れている所なのだと思います。
 >>作った本人以外は推測しか出来ないでしょう。
 >式の作成者に"作った人の思い"を聞けていれば、
 >こちらに投稿させていただく必要はありませんでした。
 私は別に「作った人に聞いてくれ」なんて書いたつもりは無いんですけどね。
 「推測しか出来ないから本当のところは分からないよ」と書いたつもりでした。
 紛らわしい書き方をしたようでごめんなさいね。

 +2の理由は他の方がご説明して下さっているので私が今更言うことは無いでしょう。

 ばんばんさんが、どの様な意図で書かれたのか分からないのですが
 >WEEKDAY関数の種類を2にした時は+2をしないと
 >正確な日にちが返らないことはわかったのですが。。。
 >なぜ、+2としなくてはいけないのでしょうか?
 この文章は、例えば
 「女の子が文房具屋で150円のペンを1本買おうと思いました。
   ポケットの中に100円有ったので出しました。
   ペンを買うためには後50円出さないといけません。
   女の子はさらに財布の中から50円出して、そのペンを買いました。
   何故女の子が財布の中から50円出したのか分からないので教えて下さい」
 ・・・・と聞いているようなものですよ。
 50円出したら150円になるからですよね?
 +2をする理由は、+2をすると成人の日(第2月曜日)が求まるからです。
 ただ、これだけの文章だと「財布から出した」と言う部分に疑問を持っている
 と言う可能性もありますよね。
 そこで、
 >>何故、「1/14から引いているのか?」が分からないのですかね?
 と言う書込をしたわけです。
(鍵括弧の開始場所が、こちらも紛らわしかったようですが・・・)

 何故14日から引いているのか私も興味がありますので
 同じ作者で、第3月曜日の日付を求める関数が有りましたら是非教えて下さい。

 (HANA)

 作成者(提示された数式)ではありませんが、
 {=MAX((WEEKDAY(DATE(A1,1,ROW(B8:B14)),2)=1)*ROW(B8:B14))}    日のみ
 {=DATE(A1,1,MAX((WEEKDAY(DATE(A1,1,ROW(B8:B14)),2)=1)*ROW(B8:B14)))}

 =DATEVALUE($A1&"/1/7")+8-(WEEKDAY(DATEVALUE($A1&"/1/7"),2))

 3式比較では (UUU)

 =DATEVALUE($A1&"/1/7")+8-(WEEKDAY(DATEVALUE($A1&"/1/7"),2))
から考察
DATEVALUE($A1&"/1/7")+8→DATEVALUE($A1&"/1/15")
 =DATEVALUE($A1&"/1/15")-(WEEKDAY($A1&"/1/7",2))
でよいのでは
(SS  )
(WEEKDAY($A1&"/1/7",2))
の1/7もしくは1/1は WEEKDAY関数によって出る値は
1〜7もしくは0〜6の数字しかでないので 
1/7(もしくは1/1)に7の倍数を加えた日であればいつでもよい事になります。

 =DATEVALUE($A1&"/1/15")の "/1/15" は基準日とすれば +1 +2 が
必要なくなります。
ようは日設定の問題ですね

 >いろんな数式が出来ると思います
 ◆いろんな数式の一つです、参考までに
     =DATE(A1,1,7*2-WEEKDAY(DATE(A1,1,0),3))
                ↓
 成人の日は1月の第2週目の月曜日
(Maron)

http://otd9.jbbs.livedoor.jp/AddinBox/bbs_tree?base=2815&range=1
http://www.h3.dion.ne.jp/~sakatsu/CalendarTopic.htm

 あら・・・説明したページがあったのですね・・・
 恥ずかしいから削除します。m(_ _)m  (Hatch)


 お返事遅くなってしまい、すみませんでした。
ご教授頂いた皆さま、ありがとうございます。
そして、HANAさん私のとんだ早とちりで、嫌な気分にさせてしまい、本当にごめんなさい。。。
取り急ぎ、
 >第3月曜日の日付を求める関数が有りましたら是非教えて下さい。は、↓です。
=IF(WEEKDAY(DATEVALUE($A$2&"/9/1"),3)=0,
DATEVALUE($A$2&"/9/15"),
DATEVALUE($A$2&"/9/21")-WEEKDAY($A$2&"/9/1",3)+1)

 こちら↓
http://www.h3.dion.ne.jp/~sakatsu/CalendarTopic.htm
拝見させていただきました。 
少し、わかった気がします。
もう少し、勉強してみます。。
(ばんばん)

 >私のとんだ早とちりで、嫌な気分にさせてしまい、本当にごめんなさい。。。
 いえいえ、全然問題ないですよ。
 誤解を訂正しようと試みただけですから。

 第3月曜日の日付を求める関数、教えていただきありがとうございました。
 やっぱり21日が基準になっていますね。

 ばんばんさんが分からない部分が分からないので
 もしまた分からなければ、どの部分が分からないのか
 分かるように書いてみて下さいね。
     自分の分からない部分が自分で分かれば
     分からないことでは無くなる事が多いと思いますが。

 (HANA)

 おはようございます。HANAさんがおっしゃるように、
     >自分の分からない部分が自分で分かれば
     >分からないことでは無くなる事が多いと思いますが。
まさにそうなんですよね。。。
えっと、私が疑問に思ったことは、(くどいですが、)
初めは、なぜ、この式の               ここで↓2が足されていたのか?
DATEVALUE(D32&"/1/14")-WEEKDAY(D32&"/1/1",2)+2)           でした。

 ご近所PGさんのご教授を受け、今は、なぜ、基準値を1/14にした場合、+2を、1/15にした場合、+1をするのか?
なぜに、基準値を16にするのか?と言うことです。
 単純に月曜日を求めたければ、その曜日番号を足さなければいけない。と思っていれば、いいのでしょうか?
いろんな数式があればあるほど、更に頭がゴチャゴチャに((+_+))
皆さんにご教授頂いた事が理解できておらず、本当にすみません。

(ばんばん)


 えっと、またまた忘れそうなので一番最初に・・・

 (ご近所PG)さん
 遅くなりましたが
 >私的にちょっと意図を汲み取ると
 くみ取っていただきありがとうございました。
 将にその通りのことを主張したかったのです。
 >久しぶりの登校……
 と言うことですので、もう気づいて貰えないかもしれませんが
 大変感謝していると言う意思表示だけ残させて頂きます。

 そして、ばんばんさんへ。
 >えっと、私が疑問に思ったことは、(くどいですが、)
 とりあえず、問題は「疑問」なので分からない部分をくどくど言ってみるのが良いと思います。
 「あんまり変わらない文章だな」と思っても、前後のニュアンスから何かが
 受け取れることだって有るかもしれませんのでね。

 まずは、最新の書込から私の気になった部分を・・・・。
 >単純に月曜日を求めたければ、その曜日番号を足さなければいけない。
 >と思っていれば、いいのでしょうか?
 曜日番号って、WEEKDAY関数が返す数字の事ですよね。
 問題の数式を言葉にすると
 DATEVALUE(D32&"/1/14")-WEEKDAY(D32&"/1/1",2)+2
           1月14日 - 1月1日の曜日番号 +2
 ですので、曜日番号はむしろ引いていると思うのですが。
 それとも、この「曜日番号」はWEEKDAY関数の引数の一つである
 「種類」に入れる数字の事ですかね?

 >ご近所PGさんのご教授を受け、
 これ以降の文章に関して
 今度は私的にちょっとご近所PGさんの意図を汲み取ると
   基準値を14日にした場合 → +2
           15日にした場合 → +1
           16日にした場合 →  +0
 WEEKDAY関数の種類を変えなかった場合、矢印の右側の日付分調整が必要です。
 矢印の左側の日付と、右側の数字を見比べてみると、左側が+1になると右側が-1
 になっていますよね。
 つまり、
「たまたま基準を14日にしたから+2をしているだけだよ。
  だって、基準が16日だったら、そのままの値でいいことがわかるでしょ」
 ・・・・と言う事だと思うのですが。

 >今は、なぜ、基準値を1/14にした場合、+2を、1/15にした場合、+1をするのか?
 >なぜに、基準値を16にするのか?と言うことです。
 「分からない部分」が分からないので、ちょっと質問して見ようと思います。
 Q1.分からないのは「基準日が14日である」と言う事ですか?
 Q2.基準日が14日とした場合、「何故+2をしなくてはならないのか」と言う事ですか?

 おそらく「卵が先か、鶏が先か」と言うレベルになってしまっていると思いますが
 よく考えて、まずどちらが不思議に思うのか結論を出してみて下さい。

 (HANA)


 あい、見てますよぅ。色々と疎通図れてよかったよかった。

 で、ちと横槍になりますが私の言いたかったのは〜、そうだなぁ。
「14日,15日,16日のどれかを基準とするか選べ」と言うなら「15を選ぶ」って事です。
何でかって言うと、
1に7足すと8ですよね。
8に7足すと15ですよね。
もうちょい言うと
1に7足して、もっかい7足すと15ですよね。
って事ですねん。

 つまり15と言う数字なら意味がある。それ以外は都合よくあわせただけ。
と言う風に見えるんですょ。

 なんて事を踏まえて、最初に提示いただいている式の14を15にした以下の式と
 =IF(WEEKDAY(DATEVALUE(D32&"/1/1"),2)=1,DATEVALUE(D32&"/1/8"),DATEVALUE(D32&"/1/15")-WEEKDAY(D32&"/1/1",2)+1)
自分があげた第何、何曜日を求める長ったらしい式(から、比較しにくいかもなのでTEXTを取っ払い)
 =DATEVALUE(A2&"/"&B2&"/1")+(7*(C2-IF(WEEKDAY(DATEVALUE(A2&"/"&B2&"/1"),2)=D2,1,0)))-WEEKDAY(A2&"/"&B2&"/1",2)+D2
双方を見て頂くと、どこが共通しているのかとか、見えやすいんじゃないかなーと。
A2は何?B2は何?そしてC2とD2には何が入っている?

 1日の2週間後を求めると15日じゃないですか。
    DATEVALUE(A2&"/"&B2&"/1")+(7*(C2
で、15日って1日と必ず同じ曜日ですよね。
てことは15日から1日の曜日分前にさかのぼると、
    -WEEKDAY(A2&"/"&B2&"/1",2)
その日より前の日曜日になりますよね。
そこから求める曜日分先に進むと、
    +D2
求める日付になるですよ。
だけどもし1日が既に求める曜日だった場合って、
既にカウントが1増えてる状態なんで1週間戻る必要
    C2-IF(WEEKDAY(DATEVALUE(A2&"/"&B2&"/1"),2)=D2,1,0))
があるんですよ。
みたいな。そういう考え方で先の式に近い第何、何曜日の出し方を書いてみたわけです。

 ここに成人の日のルールである1月の第2月曜日を当てはめただけで。
あ、あと2007年とかでも試してみてもいいかも。
(ご近所PG)眠いからなんか変なこと書いてないかな

 ご近所PGさん
 時季はずれの私の書き込み発見して頂いてありがとうございました。
 (ちょっと安心出来ました。)
 そして、私の方は意図をくみ取れなかったようで・・・。
 ばんばんさんが混乱しないと良いのですが。

 と言うことで、ばんばんさんに。
 私の書込は、「基準日も調整値も固定のものではないですよ」と言う
 事を説明したかった私の主張に基づいたものでした。

 ばんばんさんの質問から受ける印象として
 「Aが分からないからB分からなくてCが分からない。」
 と言う流れなのに、「AもBもCもわからない」(確かにそうなんですが)
 と全部が等しく疑問に思っているように感じます。
 どこがAにあたるのか分かりませんが、Aが分かれば全ての謎は
 解けそうな印象があります。
 とりあえず、疑問を箇条書きにするのが良いかもしれません。

 (HANA)

 ばんばんです。。
 ずいぶんと、長いスレッドになってしまいました。。
 そろそろ、打ち止めにしないとですね。。
 お返事、大変遅くなりました。。

 ご近所PGさんがご教授くださった、
 >つまり15と言う数字なら意味がある。それ以外は都合よくあわせただけ。
 >と言う風に見えるんですょ。
 と言う、コメントと一日にらめっこしてました。で、ある結論(ハズレかもですが)に辿り着いたので、とりあえず書いていいでしょうか?
 基準値を1/14にした時の+2は、
 =IF(WEEKDAY(DATEVALUE(A2&"/1/1"),2)=1,DATEVALUE(A2&"/1/8"),DATEVALUE(A2&"/1/14")+1-WEEKDAY(A2&"/1/1",2)+1)
                                                                                ~~~                     ~~~
 って事なんでしょうか。
 そこを、+2と一纏めにされてしまった為、私の頭で+2の意味が理解できなかったんでしょうか?
(ばんばん)


 コメント入力中に衝突してしまい、その方のコメントは消されてしまいましたが、
私が疑問に思っていた事は、意味も何もない事にこだわっていた様なので、
 これ以上長くしても他の方にもご迷惑になると思いますので、失礼させていただきます。
 今までお付き合いくださった先生方、意味不明な質問ばかりしてしまいすみませんでした。
 ご教授頂いた事が理解できず、貴重な時間を無駄にしてしまい、申し訳ありませんでした。
(ばんばん)

 基準日を何日にするか、という点が論じられましたが、
WEEKDAY関数の第二引数をどう選択するか、によってもこの「辻褄合わせ」の数値は
変化してくるのではないですか?
その数式を作った方は、基準日を 1/14に「決めた」
WEEKDAY関数の第二引数を 2とすることに「決めた」
その結果、補正をする数値が    +2に「なった」
 
+2はそのほかの要件で行った意思決定の結果、必要となった処理であって、
それを分解することで意味が発生するようには思えないのです。
他の要件の変化で+1でもあるいは加算しなくても良くなるような要件なので、
あまり悩まない方が良いですよ。
(みやほりん)(-_∂)b

 どんな書込があったのかよく分かりませんが、このスレでは
 ばんばんさんの疑問が解決することに意味があるのだとおもいます。

 と言うことで、ばんばんさんがもしこの文章をご覧になったとき
 未だ解決しない疑問を考える為の何かの足しになればと思い投稿します。

 私は「+2」は単なる辻褄合わせの数字ですよ。
 と主張しました。
 1/1がある曜日だった場合、求めたい日付を得ようと思ったら
 +2をする必要があるから+2をしているのだ・・・・と。

 ただ、「逆算して+2しなくてはいけないから+2である」
 と言う結論ではお気に召していただけないようなので
 辻褄合わせの+2に対して、このようなこじつけをしてみるのはどうでしょうか?

 基準日を1/14とした場合
[1]	[2]	[3]	[4]	[5]
1/1	成人	基準日	1/1の	[4]-[3]
の曜日	の日	との差	曜日番号	
火	14日	0	2	2
水	13日	1	3	2
木	12日	2	4	2
金	11日	3	5	2
土	10日	4	6	2
日	9日	5	7	2
 [1]は、1/1の曜日です
 [2]は、その時の成人の日の日付
 [3]は、基準日14日と実際の成人の日との差
 [4]は、1/1の曜日番号(WEEKDAY関数で種類が2の時)
 [5]は、曜日番号−基準日との差 
 です。

 つまり、1/1が火曜日だった場合 その曜日番号を「0」と返してくれる関数
 (例えばWEEKDAY関数の種類に(4)が有って、0 (火曜) 〜 6 (月曜) の範囲の整数を返す)
 が有ればいいのですが、そんな関数は存在しませんよね。
 WEEKDAY関数の種類を(2)とした場合、1 (月曜) 〜 7 (日曜) の範囲の整数をかえす
 と言った関数なら存在し、これだと火曜日だった場合「2」になります。

 基準日との差が「0」で有るにも関わらず「2」を引いてしまうので
 元に戻すために「+2」をする必要がある。

 と考えると「+2」と言う数字を探し出すことは出来ます。

 スレが伸びてしまうのは、
 「ばんばんさんがスッキリする書込を出来る人が居ないため」か
 「この題材がおもしろいからみんなが書き込むため」
 だと思っていますが。

 (HANA)


 HANAさん、みやほりんさんコメントありがとうございました。
 昨日は、失礼しました。最新の書き込みを拝見したところ、ものすごい書かれ方をされてしまったので、
 どうしていいかわからなくなってしまいました。もう終わりにして、ここに来るのも止めようと思っていたのですが、
 今後、Excelで困った時に頼るところがなくなってしまうと寂しいので、きちんとお礼をしたいと思います。
 冷静になれば、そのコメントそのままの結果だった訳ですが。

 みやほりんさんも仰ってくれてますが、
 >あまり悩まない方が良いですよ。
 との事ですので、これでこの件は終わりにします。

 HANAさん、こんなわからんちんの質問に最後までご回答くださって、ありがとうございます。心から感謝しています。
 そして、HANAさんの言いたかったことを理解できずにご迷惑をおかけしてしまい、
 本当にすみませんでした。

 次回、質問させていただく時には読解力をつけてから質問しに来ます。
 皆さま、本当にありがとうございました。
(ばんばん)

 締められているようですが一応返事的なものって事で。
ちと長ったらしく書きます。

 >=IF(WEEKDAY(DATEVALUE(A2&"/1/1"),2)=1,DATEVALUE(A2&"/1/8"),DATEVALUE(A2&"/1/14")+1-WEEKDAY(A2&"/1/1",2)+1)
 >                                                                               ~~~                     ~~~
 
上記考え方は自分が思った事に近づいてきてます。
最後って事で出来るだけ詳しく、先の私の書き込みと照らし合わせて見ます。

 ここから思考回路〜
 
 今私は第2月曜日を求めたいと思っています。
 成人の日は第2月曜日だからです。
 第2なので1日の2週間先の週を見てみます。
 
1日の2週間後を求めると15日じゃないですか。
=IF(WEEKDAY(DATEVALUE(A2&"/1/1"),2)=1,DATEVALUE(A2&"/1/8"),DATEVALUE(A2&"/1/14")+1-WEEKDAY(A2&"/1/1",2)+1)
 
 ここで固定値15日(14日の1日後)が突然出ているように思いますが、
 上記のような思考で読み替えると1日+7日×2週と言う理由の15日なんです。
 
で、15日って1日と必ず同じ曜日ですよね。
てことは15日から1日の曜日分前にさかのぼると、
=IF(WEEKDAY(DATEVALUE(A2&"/1/1"),2)=1,DATEVALUE(A2&"/1/8"),DATEVALUE(A2&"/1/14")+1-WEEKDAY(A2&"/1/1",2)+1)
その日より前の日曜日になりますよね。
 
 上記の考えがなぜ必要かというと、
 1日の曜日が何であれ、確実に同じ基準日を得たいからなんですよ。
 ここで考える基準日と言うのは、日曜日のことです。
 基準日は8日?15日?とこだわってますが、本当の意味で基準日って言うのは
 上記の結果得られる日曜日なんだと。いえると思うですよ。
 
 ここまでの事を別の書き方にするならば、
 「1日より前の日曜日を求めて、その2週間後の日曜日を求める」
 とも言えます。
 
 ここまでの流れにより、今私は求める週の日曜日に居ます。
 ここを基準とします。
 
 と踏まえて続き。
 
そこから求める曜日分先に進むと、
=IF(WEEKDAY(DATEVALUE(A2&"/1/1"),2)=1,DATEVALUE(A2&"/1/8"),DATEVALUE(A2&"/1/14")+1-WEEKDAY(A2&"/1/1",2)+1)
求める日付になるですよ。
 
 私は今、第2月曜日を求めていますので、+1します。
 なぜプラス1かと言うと、今居る基準の日曜日の翌日が月曜日だからです。
 ここでもし火曜日を求めるならば+2になるでしょう。
 
 ここまでの日付の動きをカレンダーを指で辿りながら確認してみてください。
 多分、何をしたいのかが良く分かると思います。
 
 今年、2006年ならここまでの考え方で成り立っている事が分かると思います。
 2005年でも、2004年でも大丈夫でしょう。
 けどもし来年、2007年だと以下のような事も考えないといけない。
 
だけどもし1日が
=IF(WEEKDAY(DATEVALUE(A2&"/1/1"),2)=1,DATEVALUE(A2&"/1/8"),DATEVALUE(A2&"/1/14")+1-WEEKDAY(A2&"/1/1",2)+1)
既に求める曜日すなわち月曜日だった場合って、
=IF(WEEKDAY(DATEVALUE(A2&"/1/1"),2)=1,DATEVALUE(A2&"/1/8"),DATEVALUE(A2&"/1/14")+1-WEEKDAY(A2&"/1/1",2)+1)
既にカウントが1増えてる状態なんで1週間戻る必要
=IF(WEEKDAY(DATEVALUE(A2&"/1/1"),2)=1,DATEVALUE(A2&"/1/8"),DATEVALUE(A2&"/1/14")+1-WEEKDAY(A2&"/1/1",2)+1)
があるんですよ。
 
 ここでまた固定値として8日が登場しましたが、これも言い換えると
 15日の7日前だから8日なんですよ。
 (ある意味こここそがこの数式上での辻褄合わせと言えるか)

 以上、と。
長々書きましたが結局私が書いたのは、
「多分、元の式を考えた人って、こういう思考だったんじゃない?」
って事です。
んでその人は多分考えてる途中で「あれ?なんか変だな?」と嵌ってしまって、
「とりあえず14日にしとけ」
「とりあえず+2しとけ」
になったんだろうなぁって思うですよ。
ここが悲しいかな、整然とされていなかった為に作成者ではない他者、
今回の場合ばんばんさんに疑問を抱かせるに至ったんだろうと。

 そこをもうちょい整理して、数式として汎用的に組み上げたとすると、
私が先に示す式になるんでない?って言う提示をしてみたのね。
モチロンそれが唯一絶対ではなく、他にも書き方はあるんだろうけども、
元の数式を意識して近い形にすると、あーなるのかなぁ。と。
それを元に双方比較して、何か見えてくれると嬉しいなと思ったわけです。
こんだけ長々ってのもアレだし。

 てことで私的結論。
この数式において「14日と+2」の組み合わせは確かにつじつまあわせ。
元の人の意向を汲み取って数式として意味を見出すならば
「15日と+1」と読み替えると、この数式の意図が見えるものがある。
その結果出てきた「+1」とは何ぞや、と言うと、
この数式においては
日曜日を基準と考えた場合の「月曜日」を求めているから登場した数値である
(ご近所PG)んじゃないかなぁなんてね。

 ちょっと違うな……
 
元の作成者は14と言う数字でよいと思っていた。
ばんばんさんはそれについてなぜ?と疑問を持った。
それについて納得のいく解説をするために、
私が勝手に「15日ならこう考えることが出来るんでない?」
と言う一案を示した。
(ご近所PG)ってだけか

 ご近所PGさん。こんな遅い時間にお返事頂き、ありがとうございました。
 お返事遅くなってしまい、すみません。
 ご近所PGさんに丁寧に教えて頂けたおかげで第何週何曜日の求め方(考え方)、バッチリわかりました。
 そもそも、第何週何曜日の求め方(考え方)を知らずに、既成の式を意味も分からず使用していた事に問題があるんですよね。
 休日が求められればどんな数式でもよかったし、あまり深く考えていませんでした。
 だから、皆さんの言っている意味が理解できず、見ている皆さんをイライラさせてしまったんですね。。。
 でも、
 >上記考え方は自分が思った事に近づいてきてます。
 こう言って頂けただけで、ほっとしました。
 てゆうか、特別な関数は一切使っていないから、小学生がちょっと考えればできそうなレベルでしょうか。。。
 しかし、ここまで細かく説明してもらえないと理解できない私の脳みそは一体何の為にあるのか?今はそれが疑問です…
 貴重な時間を割いて頂き、本当にありがとうございました。おかげさまで、すっきりしました。
 何度感謝してもしきれません。。。
 (ばんばん)


 今さらですが、 
14日を基準日とした根拠=推測
第一月曜日でもっとも遅いのは、7日が月曜日の場合。(1日が火曜日)
という事は、+7した14日がもっとも遅い第二月曜日。
だったら、14から、1日の曜日に応じて引き算すればいいんでないの?
1日が火曜日の場合は、-0でいいんだけどWEEKDAY関数では、上手く0が返らないから+2しとくか!
(sin) こじつけ...

コメント返信:

[ 一覧(最新更新順) ]


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