[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『在籍管理計算』(Uyan)
在籍終了年月日−在籍開始年月日=在籍年月の計算をしています。
H29.8.28−H28.5.25=1年4月などのです。
終了年月日をa
開始年月日をb
a-b=c として
Year(c) month(c) で在籍期間がもとめられますが、
H29.12.31−H28.7.1の答がなぜか
1年7月になります。
H29.12.31−H28.7.2 は、1年6月になるのに。
なぜですか?
終了年月日が7月1日でも答がでません。
教えてください。
< 使用 Excel:Excel2010、使用 OS:unknown >
H29.12.31−H28.7.2 = 1901/6/30
年と月だけで見りゃそりゃそうなる
(白痴) 2017/10/13(金) 09:01
Datedif関数のご使用を提案します.
詳細説明してる時間無いのでご紹介だけ.
(tata改めtatara) 2017/10/13(金) 10:20
↑ その記事の中の「回避策」とは何なのですかねぇ。
>既知の問題 >"MD" 引数は、負の値、ゼロ、または不正確な結果を返すことがあります。 >1 か月が過ぎた後で、残りの日数を計算するには、こちらの回避策をお試しください。
MDとmdの違い? でも、相変わらずマイナスになりますけども・・・
(1) C1セル =DATEDIF(A1,B1,"md") (2) D1セル =DATEDIF(A1,B1,"MD")
行 ____A____ ____B____ _C_ _D_ 1 2014/1/1 2016/5/6 5 5 2 2010/1/30 2010/3/1 -1 -1
(半平太) 2017/10/13(金) 10:42
英文で見ると画像の中の数式が違うんで翻訳ミスですかね?
(白痴) 2017/10/13(金) 11:24
Uyanさん >なぜですか? >教えてください なぜ,思った通りの結果にならないか,は,
>a-b=c として >Year(c) month(c) で在籍期間がもとめられます ここの考え方が間違っているからです.
a-b で求められる,エクセル上の値は, 「開始日と終了日との差の【日数】」です. H29.12.31−H28.7.1 = 【548】日
でも,2月1日から3月1日は【28】日 だし, 他には3月1日から4月1日は【31】日 ですね.
Year(c) month(c) で【在籍期間】を求めている,と誤解されていますが, この式で得ているのは, 1900年1月0日から,【日数】経過したときのその日付の,年,月,を得ています.
つまり,他の回答者さんが2017/10/13(金) 09:01にご例示されているように, 【548】 = 1901/7/1 であり, year("1901/7/1")=1901 month("1901/7/1")=7 を得てしまっているのです.
ご質問内容の,「なぜ正しい答えが出ないか」の理由は以上です.
「では,正しい計算はどのようにすれば良いか」については, ちょっと私のエクセルの実力ではお伝えする自信がありませんので, もしご自身で調べてもわからないようでしたら, 他の回答者さんがたにおまかせします.
>既知の問題
質問者さんのケースでは関係無さそうなのでスルーしてましたが,
紹介したurlがミスしてそうな雰囲気ですね.失礼しました.
(tata改めtatara) 2017/10/13(金) 12:28
英文だと、これですね。 ↓ C1セル =B1-DATE(YEAR(B1),MONTH(B1),1)
行 ____A____ ____B____ _C_ 1 2014/1/1 2016/5/6 5 2 2010/1/30 2010/3/1 0
相変わらず、正しくないです。
※B列の日付データだけでは、半端日が計算できる訳がないです。 これと同じ意味の数式ですよね。→ =DAY(B1)-1
Uyanさん
期間計算の考え方をご説明いただく必要があります。 そんなの分かり切っているじゃないか、と思うかも知れませんが、 人、会社、国、慣習、法律・・色々な切り口があり、似て非なる結果になることも少なくないです。
極端な例では、1/31、2/1 この2日間でも、2ヶ月間とすると会社もあります。
常識的な考え方をするにしても、 当日を起算日とし、その応当日で満とするか、 翌日を起算日とし、その応当日の前日で満とするか、で違ってきます。
※8/31〜9/30の場合、前者は0ヶ月、後者は1ヶ月となる。
(半平太) 2017/10/13(金) 16:02
'セルA1=在籍終了年月日 'セルA2=在籍開始年月日 Dim i As Long For i = Range("A2").Value To Range("A1").Value - 1 If Month(i) <> Month(i + 1) Then j = j + 1 Next i j = j + 1 MsgBox Int(j / 12) & "年" & j - Int(j / 12) * 12 & "月" End Sub (mm) 2017/10/13(金) 16:47
(Uyan) 2017/10/14(土) 09:09
例えば 7/15 開始日(0ヶ月)として, 7/16 は「1日でも勤務すれば在籍期間を1月とみなし」なので,1ヶ月なのだろうと推測します
では,2ヶ月目になるのは 8/01 なのか 8/14 なのか 8/15 なのか 8/16 なのか はっきり返答したほうが良いですよ.
>半平太さんからのご質問では、後者になります。 →>翌日を起算日とし、その応当日の前日で満とする とのことなので,Uyanさんは 8/01 1ヶ月 8/14 1ヶ月 8/15 2ヶ月(応答日の前日) 8/16 2ヶ月(応答日=「起算日=開始日の翌日」の日付=毎月16日) のつもりなのかなぁ,と推測しますが,ホントにそうですか?
'--- 半平太さんの当初の想定では,
8/31開始として 9/29までは0ヶ月 9/30は0ヶ月で,10/01に1ヶ月になるのか それとも 9/30に1ヶ月になるのか という想定で2017/10/13(金) 16:02 の質問をされているかと思います.
でも,Uyanさんは 9/29 は,すでに1日以上勤務しているので 1ヶ月 というふうに,想定がズレています.
想定がズレている場合は >後者になります という,短い返答のみではなく, 具体的にきちんとズレを補正した返答をすべきかと思いますよ.
(10:43修正のため削除→12:05同内容を手直し再掲) (tatara) 2017/10/14(土) 10:33
>1日でも勤務すれば在籍期間を1月とみなしていますので、 >半平太さんからのご質問では、後者になります。
単に「後者」なら何とか一案を捻り出せますが、「1日でも勤務すれば・・1月」の付帯説明があると、 却って、私には計算ルールが解らないです。
後者で1ヶ月間になるには、 1/31の翌日(=2/1)が起算となり、その1ヶ月後の応当日(=3/1)の前日(=2月末)になって初めて満です。
つまり、1/31〜2/1の場合、2月末には程遠く、0ヶ月間にしかならないです。
もう少し詳しく説明いただくか、早押しクイズが好きな人の回答をお待ちください。
(半平太) 2017/10/14(土) 11:11
(Uyan) 2017/10/14(土) 15:11
>1月31日から2月1日までしか在籍していなくても >在籍期間を2ヶ月間としてます。
これだけの説明であれば、足掛け(勤務したカレンダー月の数)だなと思うんですが
>翌月の3月1日までであれば2ヶ月間です。
この説明でまた分からなくなります。
だって、足掛けなら「Jan,Feb,Mar」勤務したんですから、3か月ですよね? 何故、2ヶ月になるのか、その考え方(ルール)をご説明ください。
(半平太) 2017/10/14(土) 16:02
ご指摘ありがとうございます。
(Uyan) 2017/10/16(月) 10:47
(1) C2セル =DATEDIF(A2-DAY(A2),EOMONTH(B2,0)+1,"Y") (2) D2セル =DATEDIF(A2-DAY(A2),EOMONTH(B2,0)+1,"YM")
<結果図> 行 ____A____ ____B____ _C_ _D_ 1 開始 終了 年 月 2 H28.5.25 H29.8.28 1 4 3 H29.1.31 H29.2.1 0 2 4 H29.1.31 H29.12.1 1 0 5 H29.1.31 H30.1.1 1 1
(半平太) 2017/10/16(月) 11:33
(Uyan) 2017/10/18(水) 17:30
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.