[[20021011104716]] 『保存期間から廃棄日付を出す』(バンククラーク) ページの最後に飛ぶ

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

 

『保存期間から廃棄日付を出す』(バンククラーク)

バンククラークと申します。

どうしても判らないことがあるので教えてください!

保存期間が1ヶ月、3ヶ月・・・・・・1年、3年など、バラバラの書類があり、列1に保存期間を

入力すれば、列2に2002/10/15日から数えて保存期間経過後の破棄日時が表記される、という表を作らねばならないのですが、

引用元の列1のセルには「1年」とか「6ヶ月」とか記入し、列2のセルには「2003/04/15」とか表記しなくてはなりません。

 月と年が混在しており、下記のような計算式を作ったところ、列1が年の表記には対応できるのですが、月の場合は上手くいきません。ご指導お願いします。

 例 セルA1  1年  

   セルB1 2003/10/15 

   セルB1のステータス・・・・・・MID(A1,1,1)*10000+20021015

どうすれば、セルA1に 6ヶ月と入れても1年と入れても、セルB1にきちんと

2002年10月15日からセルA1の期間を足した日付が出るようになるのでしょうか?

よろしくお願いします。


 どういう計算で年数を10000倍しているのでしょうか?

 教えてください。

 (kazu)


バンククラークです。さっそくのお返事、ありがとうございます!

判り難い表現で申し訳ありませんでした。

セルB1の書式設定の表示設定を、ユーザー定義で「0000"/"00"/"00」としています。

そうすると、セルB1に20021010という数字を入力すれば、2002/10/10と反映します。

セルB1にMID(A1,1,1)*10000とすれば、セルA1「3年」と入力した場合、

頭の3だけ拾って、それを一万倍すると20021010+30000で、セルB1には20051010

という数字が飛んできて、ユーザー定義により2005/10/10と表記されるという

仕組みにしたのですが、これでは「6ヶ月」には対応できません。

 その後、すこし変えてみました。

 2002年10月15日をシリアル値で表記すると37544となるので、セルA1に入力するのは

「0.5年」とか、「3.0年」とかにして、MID(A1,1,3)*365+37544)をセルB1に飛ばし、

 セルB2の書式設定を日付にすると、見事に2002年10月15日を基準に、保存期間を足して

廃棄日を表記することが出来ましたが、これでは割り切れない月数や、小数点が2桁以上に

なると機能しません。ほとほと困り果てています。お願いいたします。


 セルA1に『1ヶ月』セルB1に『=today()』が入っているとき

 セルC1に『=YEAR(B1)&"/"&MONTH(B1)+MID(A1,1,1)&"/"&DAY(B1)』

 と入力すると一見うまく行くのですが、足し算するので14月とかが出てきて

 しまいます。そこでセルC1を

『=IF(MONTH(B1)+MID(A1,1,1)>12,YEAR(B1)+1&"/"&MONTH(B1)+MID(A1,1,1)-12&"/"&DAY(B1),YEAR(B1)&"/"&MONTH(B1)+MID(A1,1,1)&"/"&DAY(B1))』

 にすると少しうまく行きますが、10ヶ月11ヶ月の計算がおかしいことが見つかります。

 そこでセルC1を

『=IF(MID(A1,2,1)="ヶ",IF(MONTH(B1)+MID(A1,1,1)>12,YEAR(B1)+1&"/"&MONTH(B1)+MID(A1,1,1)-12&"/"&DAY(B1),YEAR(B1)&"/"&MONTH(B1)+MID(A1,1,1)&"/"&DAY(B1)),IF(MONTH(B1)+MID(A1,1,2)>12,YEAR(B1)+1&"/"&MONTH(B1)+MID(A1,1,2)-12&"/"&DAY(B1),YEAR(B1)&"/"&MONTH(B1)+MID(A1,1,2)&"/"&DAY(B1)))』

 にすれば、うまくゆきますが、これでもまだ、年の対応ができませんし、10月31日の

1ヶ月先が11月31日になってしまうなど問題が発生します。。すでに式が276文字に

なってすぐに限界1024文字を迎えます。要するに数式ではかなり無理と言うことです。

 私はユーザー関数で作るしかないと思います。

 [シニア]さん!ヘルプ。何か良い知恵はありませんか?

 (kazu)


 古い関数のマニュアルを見たら、方法がありました。

 EDATE(<開始日>,<月>)

 開始日から起算して、指定した月だけ、前または後の日付に対するシリアル値を

 計算します。

 セルA1に『1ヶ月』セルB1に『=today()』セルC1に

『=IF(MID(A1,2,1)="年",EDATE(B1,MID(A1,1,1)*12),IF(MID(A1,2,1)="ヶ",EDATE(B1,MID(A1,1,1)),EDATE(B1,MID(A1,1,2))))』

でほぼOKだと思います。

 (kazu)


 失敗失敗。

 EDATE はアドインを追加する必要があります。EDATE が#NAME になる方は

 [ツール]メニュー→[アドイン]で[分析ツール]にチェックを入れてアドインを追加して

 下さい。

 (kazu)


 A1セルに整数部が年で、小数二桁が月として入力する方法で設定してみました。

 A1セルに3年は3、1ヶ月は0.01、2年3ヵ月は2.03と入力するとします。

A1の書式設定をユーザ定義で[ G/標準"(年/月)" ]とします。

B1に開始日として 2002/10/15 と入力します。

C1に =DATE(YEAR(B1)+INT(A1),MONTH(B1)+MOD(A1,1)*100,DAY(B1)) で廃棄日付が表示されます。

※A1セル幅が狭いと小数二桁が四捨五入された表示になります。

このような設定で如何でしょうか?

 A1セルに既に11年、5年、11ヶ月等と入力されていて、開始日から指定期間後の廃棄日付は既に解決済みですが、

C1に

 =DATE(YEAR(B1)+IF(RIGHT(A1,1)="年",LEFT(A1,FIND("年",A1)-1),0),MONTH(B1)+IF(RIGHT(A1,1)="月",LEFT(A1,FIND("ヶ",A1)-1),0),DAY(B1))

としても、求められます。

 (シニア)


 [シニア]さんいつもいつもありがとうございます。

 ひやーっ!。なるほど、年:整数部と月:小数部にわけますか、完全脱帽です。

(kazu)


kazuさん、シニアさん、どうもありがとうございました!さすがですね!

エクセル関数って、定型どおりではないパターンになってくると、後は知識と感性の

両方が必要なんですね。

もっと精進します!          (バンククラーク)


コメント返信:

[ 一覧(最新更新順) ]


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