* excelからの関数が [#pe771cbe]
 |RIGHT:|LEFT:|c
 |~ページ|[[OpenOffice.org FAQの登録ページ]]|
 |~投稿者|harazuka|
 |~分類|#listbox3(Q&A,faq03,class)|
 |~優先順位|#listbox3(低,faq03,priority)|
 |~状態|#listbox3(完了,faq03,state)|
 |~カテゴリー|#listbox3(Calc 表計算,faq03,category)|
 |~投稿日|2009-11-15 11:21:13 (日)|
 |~OS|Windows XP|
 |~依存するページ||
 |~バージョン|#listbox3(3.1.0,faq03,version)|
 
 //////////バグ対策(以降マッチさせない)
 
 ** メッセージ [#n26bed56]
 |LEFT:|c
 |回答ページでは行末に「~」を付加する必要はありません|
 こんにちは
 
 excelで入力した今日から誕生日の日付をカルクで表示させたらシリアル値で表示されたので日付に直す事は
 出来ないでしょうか?
 
 ----
 ***過去の質問と同じでしょうか [#j798e834]
 >M.Kamataki (2009-11-15 12:28:05 (日))~
 ~
 faq/3/68「元号入力について (MLより)」と同じ問題でしょうか。Excelとの違いにも触れられていますね。~
 
 //
 ***説明不足でした [#z9ca3cac]
 >harazuka (2009-11-15 22:28:19 (日))~
 ~
 excelで生まれた日から◯年◯月◯日目を三つのセルで分けて表示していたのですが、カルクで開いたら#NAME?のエラーが出てしまいましたのでエラーを直したいと思ったのですが、この場合は関数を入れ直さなければいけいないでしょうか?~
 ~
 入れ直すとしたらどの関数を入れれば良いかアドバイスをして貰えれば助かりますのでよろしくお願いしますm(_ _)m~
 
 //
 ***何度もすみません [#he02f0a7]
 >harazuka (2009-11-15 23:18:27 (日))~
 ~
 excelのDATEDIFがカルクに無いのが解りましたのでDATEDIFに代わる関数は無いでしょうか?~
 
 //
 ***ExcelのDATEDIF [#zea1e760]
 >M.Kamataki (2009-11-16 10:27:21 (月))~
 ~
 以下のWebサイトに、ExcelのDATEDIF関数をCalcで置き換える方法の記述があります。~
 -[[DATEDIF関数(Excel)とDAYS関数・MONTHS関数・YEARS関数(Calc)>http://oooug.jp/compati/excel-calc/function01_e-c004.html#DATEDIF%E9%96%A2%E6%95%B0%EF%BC%88Excel%EF%BC%89%E3%81%A8DAYS%E9%96%A2%E6%95%B0%E3%83%BBMONTHS%E9%96%A2%E6%95%B0%E3%83%BBYEARS%E9%96%A2%E6%95%B0%EF%BC%88Calc%EF%BC%89]]~
 -[[Openoffice.orgのDATEDIF関数について>http://homepage1.nifty.com/tabotabo/ooo/calc/datedif.htm]]~
 <~
 >~
 ということで、CalcのDAYS関数、MONTHS関数、YEARS関数に置き換えることになるのではと思います。最初に紹介したfaq/3/68は、そのYEARS関数を利用した年齢計算の注意点が紹介されていたわけです。~
 
 //
 ***DAYS は駄目 [#zb94ed56]
 >K.Tsunoda (2009-11-16 13:50:28 (月))~
 ~
 YEARS, MONTHS で第3引数[0]にすれば【y年mヶ月】は、ほぼ計算できます。~
 A1:生年月日、B1:調べる日~
 =YEARS(A1;B1;0)&"年"&MOD(MONTHS(A1;B1;0);12)&"ヶ月"~
 ~
 ただし、開始が「小の月」の月末日の場合には月数を間違える事があります。~
 (DATEDIF等の期間計算は初日不算入で行なっている為)~
 2008/4/30-2012/12/30 (4年7ヶ月30日)  4年8ヶ月~
 2008/4/30-2012/12/31 (4年8ヶ月 0日)  4年8ヶ月~
 ~
 なお、DAYS で【y年mヶ月d日】の[d日]を求める事は出来ません。~
 ~
 ~
 下記のマクロをドキュメントのStandard もしくは マイマクロのStandardに~
 入れれば、Excelと同じように期間計算の式が書けます。~
 http://www.h3.dion.ne.jp/~sakatsu/Excel_Tips05.htm#ktDATEDIF2~
 ~
 YM,YD,MD といったもので求める月数/日数の正しい意味は下記参照。~
 http://www.h3.dion.ne.jp/~sakatsu/Excel_Tips05.htm#Note2~
 ~
 ~
 >年齢計算の注意点~
 http://www.h3.dion.ne.jp/~sakatsu/period_topic.htm#Note~
 「誕生日の前日」で加齢する場合は【調べる日+1】で計算します。~
 (YEARS,MONTHS および ITProの式 でも同様)~
 ~
 誕生日で加齢    =ktDATEDIF(生年月日;調べる日;"YMD")~
 誕生日の前日で加齢 =ktDATEDIF(生年月日;調べる日+1;"YMD")~
 ~
 翌日(誕生日)で得られる結果を、今日(誕生日前日)貰うと考えます。~
 
 //
 ***Re: DAYS は駄目 [#lb7172c7]
 >M.Kamataki (2009-11-16 14:14:59 (月))~
 ~
 CalcのDAYS関数はそのようですね。つまり、開始日と終了日の前日までの日数を返します。これは、終了日-開始日の結果をシリアル値にした場合と同じです。~
 ~
 なお、ExcelのDATEDIF関数にはマジックがあって、「=DATEDIF(A2,B2,"D")」とCalcの「=DAYS(B2;A2)」は同値になるんですが、「=DATEDIF(A2,B2,"MD")」とすると「+1日」を実行した結果を返すようです。K.Tsunodaさんの紹介されたページに書かれている「バグ」はこのことかなぁ。~
 ~
 一方、CalcのYEARS関数、MONTHS関数は「+1日」を実行した結果を返します。でもDAYS関数はそのような仕様ではありません。そもそも異なる関数なので良いのか(ホント? 追求しないほうが良いかも。。)。~
 
 //
 ***K.Tsunoda [#ce525f76]
 > (2009-11-16 19:04:57 (月))~
 ~
 >「=DATEDIF(A2,B2,"MD")」とすると「+1日」を~
 http://www.h3.dion.ne.jp/~sakatsu/Excel_Tips05.htm#Note2~
 「満 n ヶ月」となる日付の翌日から [引数:終了日] までの日数が [MD] の日数。~
 ~
 >「バグ」はこのことかなぁ。~
 Excel2003までのDATEDIF(MD)のバグパターン~
 1998/10/31〜2000/3/21  →  1年4ヶ月19日~
 (初日不算入なので実際は11/1〜3/21で、1年4ヶ月21日が正解)~
 1998/10/31〜2000/3/ 1  →  1年4ヶ月-1日~
 (初日不算入なので実際は11/1〜3/1で、1年4ヶ月1日が正解)~
 ~
 Excel2007になると更にデグレードして、SP2で再びExcel2003と同じに戻りました。~
 http://www.h3.dion.ne.jp/~sakatsu/Excel_Tips05.htm#chk~
 
 //
 ***レスが遅れてすみません [#hd928b4c]
 >harazuka (2009-11-21 09:28:47 (土))~
 ~
 皆さんのアドバイスのお陰で月数まで求める事が出来ました~
 ~
 ただ、日数の日割計算?はマクロを使わないとダメみたいなので(マクロの使い方が解らない(^^;))日数は諦めます(^^;)~
 ~
 ありがとうございました(^^)~
 
 //
 ***関数で日数計算 [#fbc571fc]
 >M.Kamataki (2009-11-24 12:28:18 (火))~
 ~
 同じ日にちなら、その時点を0日、日にちの大小を比較し、引き算したり、前の月の残り日数と当月の経過日を足したり、といったルールをIF関数で一つひとつ潰してみました。たぶんまだ潰しきれない条件があると思いますが、きりがなさそうなので、現時点の関数で止めます。ということで完成物ではありません。以下サンプルです。~
 ~
 &attachref(faq5_161_8.ods);~
 ~
 ktDATEDIFマクロを取り入れているので、マクロのセキュリティの設定が必要です。ktDATEDIFマクロもそうだと思いますが、日付を日数表示にするとどうしても矛盾が生じる気がします。将来的にはアドイン関数にするのが理想でしょうね。~
 ~
 情報がまとまったので、いったん完了にします。~
 
 //
 ***ハテナと思う気分は判ります [#qdbfc3a1]
 >K.Tsunoda (2009-11-24 16:17:19 (火))~
 ~
 >どうしても矛盾が生じる気がします。~
 多分、こういうケースのことでしょう。~
 2008/4/30-2012/12/30 (4年7ヶ月30日)~
 2008/2/27-2012/12/27 (4年10ヶ月0日)~
 2008/2/28-2012/12/28 (4年10ヶ月0日)~
 2008/2/29-2012/12/29 (4年9ヶ月29日)~
 2008/2/29-2012/12/30 (4年9ヶ月30日)~
 2008/2/29-2012/12/31 (4年10ヶ月0日)~
 [27][28]では丸10ヶ月が、[29]になると何で下がるの?~
 ~
 民法に基づいた期間計算のルールを理解していないと確かに悩むと思います。~
 http://www.h3.dion.ne.jp/~sakatsu/period_topic.htm~
 ~
 [27][28]と[29]の違いは【月末日】かどうかの違いです(または、初日不算入~
 により起算日(カウントを始める日)が1日かどうかの違い)。~
 ~
  『初日不算入=開始日の翌日からカウントスタート』
 のルールによりカウントを始める日付は下記になります。~
 [27] -- 2/28 からカウント開始~
 [28] -- 2/29    〃~
 [29] -- 3/1     〃~
 ~
  「月の初めから(1日から)カウントする場合は月末日までで、
   他はカウント開始の日の応答日の前日までで、丸Nヶ月」
 という計算ルールによって、[27][28]と[29]の計算方法が分かれます。~
 [27] -- 2/28 から、期間終了日の直近にある[27日]までで【丸Nヶ月】~
 [28] -- 2/29 から、期間終了日の直近にある[28日]までで【丸Nヶ月】~
 ~
 [29] -- 3/1  から、期間終了日の直近にある[月末日]までで【丸Nヶ月】~
 ~
 ~
 2008/2/29-2012/12/30~
 終了日(12/30)直近の月末日[11/30]までで[4年9ヶ月]~
 そして、翌12/1から12/30までで[30日](1ヶ月には至らず)~
 ~
 2008/2/29-2012/12/31~
 終了日(12/31)直近の月末日(終了日そのもの)[12/31]までで[4年10ヶ月]~
 ~
 2008/2/28-2012/12/28 ~
 [29日]からカウントを始めるので、12/28直近の[29の前日=28]は終了日~
 そのものなので、丸[4年10ヶ月]~
 
 //
 ***補足 [#p68a9bbd]
 >K.Tsunoda (2009-11-24 16:41:31 (火))~
 ~
 期間を【30日/月】で簡略計算する 30/360 ルールを主とする文化/経済圏と、~
 暦にしたがって大小閏の月を律儀に考慮しつつ計算するルールを主とする文化/経済圏~
 の違いでしょうね。~
 ~
 Excel も OOo も30/360 ルールを主とする欧米で設計されているソフトですから、~
 この辺りの設計に際しての深い配慮というか、そういうルールがある事への~
 認識が無いのだと思います。~
 ~
 http://www.h3.dion.ne.jp/~sakatsu/Excel_Tips17.htm#30-360Method~
 30/360ルールは単なる四則演算だけです。~
 日数 = 360*{ 年(終了日) - 年(開始日) } + 30*{ 月(終了日) - 月(開始日) } + { 日(終了日) - 日(開始日) }~
 これから、y年mヶ月d日フォーマットにするなら、単に360 と 30による~
 商と剰余を計算すれば済みます。~
 ~
 補)OOo のDAYS360(NASD)は Excel互換(即ち、NASD仕様に非ず)。~
 http://www.h3.dion.ne.jp/~sakatsu/OOo_Basic.htm~
 
 //
 #article