[[20110125234208]] 『1ヶ月と5日前を求める』(aki) ページの最後に飛ぶ

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

 

『1ヶ月と5日前を求める』(aki)
 何時も拝見させていただいております。宜しくお願い致します。

 1ヶ月と5日前の期日を出したいと考えております
色々な投稿を確認させていただき、難しいということが解りました
DATEDIF関数を使うというところは、なんとなく解ったのですが
これが正しいのかどうかを見ていただきたくお願いに参りました

 この1ヶ月とは同日の1ヶ月前を示します
平成23年 1月25日 → 平成22年12月25日
平成23年 2月 1日 → 平成23年 1月 1日 です

 そこで、A1に、期日、B2に以下のような式を考えました
これは、合っていますでしょうか?
3年ぐらい確認したところ、間違いは見つけられませんでした
	[A]	    [B]
1	2011/1/25	2010/12/20
             =DATE(YEAR(A1),MONTH(A1)-1,DAY(A1)-5)

 何卒お願い申し上げます。
環境は、WindowsXP Excel2003 です  (aki)


 月末や月初の扱いをどうしたいのかによると思いますが、3年間を確認して問題ない
 (期待通りの日付になっている)のであれば、それでよいと思います。
 (Mook)


 こんにちは。
> この1ヶ月とは同日の1ヶ月前を示します
Mookさんが書かれていますが、月末(28〜31日)の場合、ご提示の数式では
この日付が返らないときがあります。
 
↓の3行目以降のように、「同日の1ヶ月前」が存在しない場合、日付がずれますが
この結果でよいのでしょうか。
(「5日前」は単純に5を引くだけなので、ちょっと横に置いておきます)

  [R/C]        [A]         [B]
   [1]        起点     1ヶ月前
   [2]   2011/1/25  2010/12/25
   [3]   2011/5/31    2011/5/1 ←こことか
   [4]   2011/5/30   2011/4/30
   [5]   2011/3/31    2011/3/3 ←こことか
   [6]   2011/3/30    2011/3/2 ←こことか
   [7]   2011/3/29    2011/3/1 ←こことか
   [8]   2011/3/28   2011/2/28

  B2 =DATE(YEAR(A2),MONTH(A2)-1,DAY(A2))
 
(コタ)

mook様 コタ様 回答有難う御座います

 どうやら、見落としていたようです 
仰るように、1ヶ月前を単純に引き算すると
上記のような結果が現れました
色々調べたところ、同日の1ヶ月前が存在しない場合には
その月の1日からになるようです
よって
   [3]   2011/5/31    2011/5/1 ←問題は無いようです

   [5]   2011/3/31    2011/3/3 ←2011/3/1
   [6]   2011/3/30    2011/3/2 ←2011/3/1
   [7]   2011/3/29    2011/3/1 ←問題は無いようです
です。
自分の頭で考えられるか微妙ですが、模索してみます
回答有難う御座います。                   (aki)

 >同日の1ヶ月前が存在しない場合にはその月の1日からになるようです
なるほど。
 
EDATEという日付関数だと、
・指定された月数だけ前または後の日付
・該当日がない場合、その月の末日
を返しますので、末日なら一発で求まるのですが、翌月1日だとちょっと工夫が必要ですね。
 
なお、
この関数が使用できず、エラー値 #NAME? が返される場合は、分析ツール アドイン
を組み込む必要があります。

  [R/C]        [A]         [B]
   [1]        起点     1ヶ月前
   [2]   2011/1/25  2010/12/25
   [3]   2011/5/31    2011/5/1
   [4]   2011/5/30   2011/4/30
   [5]   2011/3/31    2011/3/1
   [6]   2011/3/30    2011/3/1
   [7]   2011/3/29    2011/3/1
   [8]   2011/3/28   2011/2/28

  B2 =EDATE(A2,-1)+IF(DAY(EDATE(A2,-1))<DAY(A2),1,0) →B2:B8フィルコピー
          ↑ 工夫した部分(5行目のように、3/31の前月末が2/28だと
           DAYが31から28に減るので、+1して翌月の3/1にする)
(コタ)

 ちょこっと気になったのですが、
 >同日の1ヶ月前が存在しない場合にはその月の1日からになるようです
 だと、6/1の1ヶ月と5日前より、5/31の1ヶ月と5日前のが古い日付になるのは問題ないのでしょうか?

 [R/C]      [A]          [B]
 [1]       起点         1ヶ月と5日前
 [2]       2010/5/30	2010/4/26
 [3]       2010/5/31	2010/5/1
 [4]       2010/6/1	2010/4/27
 [5]       2010/6/2	2010/4/28

 (リベンジ!)

 余計なことかも知れませんが、
 ・1ヶ月前を計算(その日が存在しなければ何らかの処理)して5日引く
 ・5日前を計算して1ヶ月前を計算(その日が存在しなければ何らかの処理)
 では、結果が一致しない場合があります。ご注意下さい。
 2011/01/27 12:55 (ちゅうねん)

 揚げ足取りではないですが、
 >同日の1ヶ月前が存在しない場合にはその月の1日からになるようです
 というのは、「1ヶ月前が存在しない場合にはその月の1日から5日前をけいさんする」
 ということではないでしょうか。

 となると、
 [R/C]      [A]            [B]
 [1]       起点        1ヶ月前		1ヶ月と5日前
 [2]       2010/5/30	2010/4/30	2010/4/26
 [3]       2010/5/31	2010/5/1	2010/4/26

 [4]       2010/3/28	2010/2/28	2010/2/23
 [5]       2010/3/29	2010/3/1	2010/2/24
 [6]       2010/3/30	2010/3/1	2010/2/24
 [7]       2010/3/31	2010/3/1	2010/2/24
 [8]       2010/4/1	2010/3/1	2010/2/24
 [9]       2010/4/2	2010/3/2	2010/2/25
 が期待する結果ということでしょうか。
 (Mook)

 みなさんからのご指摘を、以下にまとめてみました。
求めたい日付はどれなのか、よくご確認ください。

  ※「_」セルは未入力または""
  [R/C]        [A]         [B]         [C]   [D]         [E]         [F]        [G]
   [1]        起点  先に-1ヶ月    先に-5日  相異    以下参考     1ヶ月前      5日前
   [2]   2011/1/25  2010/12/20  2010/12/20     _  2010/12/20  2010/12/25  2011/1/20
   [3]   2011/5/30   2011/4/25   2011/4/25     _   2011/4/25   2011/4/30  2011/5/25
   [4]   2011/5/31   2011/4/26   2011/4/26     _   2011/4/26    2011/5/1  2011/5/26
   [5]    2011/6/1   2011/4/26   2011/4/27    異   2011/4/26    2011/5/1  2011/5/27
   [6]    2011/6/2   2011/4/27   2011/4/28    異   2011/4/27    2011/5/2  2011/5/28
   [7]    2011/6/3   2011/4/28   2011/4/29    異   2011/4/28    2011/5/3  2011/5/29
   [8]    2011/6/4   2011/4/29   2011/4/30    異   2011/4/29    2011/5/4  2011/5/30
   [9]    2011/6/5   2011/4/30    2011/5/1    異   2011/4/30    2011/5/5  2011/5/31
  [10]    2011/6/6    2011/5/1    2011/5/1     _    2011/5/1    2011/5/6   2011/6/1
  [11]   2011/3/28   2011/2/23   2011/2/23     _   2011/2/23   2011/2/28  2011/3/23
  [12]   2011/3/29   2011/2/24   2011/2/24     _   2011/2/24    2011/3/1  2011/3/24
  [13]   2011/3/30   2011/2/24   2011/2/25    異   2011/2/25    2011/3/1  2011/3/25
  [14]   2011/3/31   2011/2/24   2011/2/26    異   2011/2/26    2011/3/1  2011/3/26
  [15]    2011/4/1   2011/2/24   2011/2/27    異   2011/2/24    2011/3/1  2011/3/27
  [16]    2011/4/2   2011/2/25   2011/2/28    異   2011/2/25    2011/3/2  2011/3/28
  [17]    2011/4/3   2011/2/26    2011/3/1    異   2011/2/26    2011/3/3  2011/3/29
  [18]    2011/4/4   2011/2/27    2011/3/1    異   2011/2/27    2011/3/4  2011/3/30
  [19]    2011/4/5   2011/2/28    2011/3/1    異   2011/2/28    2011/3/5  2011/3/31
  [20]    2011/4/6    2011/3/1    2011/3/1     _    2011/3/1    2011/3/6   2011/4/1

  B2 =EDATE(A2,-1)+IF(DAY(EDATE(A2,-1))<DAY(A2),1,0)-5
                          ^^ ←先に1ヶ月前を求めて後から5日前
  C2 =EDATE(A2-5,-1)+IF(DAY(EDATE(A2-5,-1))<DAY(A2-5),1,0)
       ^^          ^^      ^^  ←先に5日前を求めて後から1ヶ月前
  D2 =IF(B2=C2,"","異")
  E2 =DATE(YEAR(A2),MONTH(A2)-1,DAY(A2)-5)
  F2 =EDATE(A2,-1)+IF(DAY(EDATE(A2,-1))<DAY(A2),1,0)
  G2 =A2-5
 
(コタ)

mook様 コタ様 リベンジ!様 回答有難う御座います
 返信が遅くなり申し訳ありません
> というのは、「1ヶ月前が存在しない場合にはその月の1日から5日前をけいさんする」
 ということではないでしょうか。
まさに、これです。よって
 [R/C]      [A]            [B]
 [1]       起点        1ヶ月前		1ヶ月と5日前
 [2]       2010/5/30	2010/4/30	2010/4/26
 [3]       2010/5/31	2010/5/1	2010/4/26
 [4]       2010/3/28	2010/2/28	2010/2/23
 [5]       2010/3/29	2010/3/1	2010/2/24
 [6]       2010/3/30	2010/3/1	2010/2/24
 [7]       2010/3/31	2010/3/1	2010/2/24
 [8]       2010/4/1	2010/3/1	2010/2/24
 [9]       2010/4/2	2010/3/2	2010/2/25
これを求めていました
本当に有難う御座います
ここからが関数ですね
アドインというものがあるんですね
未知の世界に入りそうです。
自分なりに上記の数字を見ながら頑張ります。
そして、また相談に来ます
                          (aki)


 数式でもできると思いますが、マクロのケースです。
 Alt+F11を押して、挿入⇒標準プロシージャ
 で表示されたウィンドウに下記を置き

 Function AkiDateAdd(dt, m, d)
    If IsDate(dt) = False Then
        AkiDateAdd = "#NOT_DATE"
        Exit Function
    End If

    Dim tmLastDate As Date
    tmLastDate = DateSerial(Year(dt), Month(dt) + m + 1, 0)
    If Day(dt) > Day(tmLastDate) Then
        AkiDateAdd = DateAdd("d", tmLastDate, d + 1)
    Else
        AkiDateAdd = DateSerial(Year(tmLastDate), Month(tmLastDate), Day(dt) + d)
    End If
 End Function

 EXCEL に戻って、
 A1に日付があるとしたら B1 に
 =IF(A1="","",AkiDateAdd(A1,-1,-5))
 でどうでしょうか。

 AkiDateAdd は 1番目の引数に、2番目の引数(月)と3番目の引数(日)を足す関数です。
 ただし、m月後(前)に該当日がないときに今回のルールを適用しています。

 B列の書式は日付にしておいてお試しください。
 (Mook)

mokk様 マクロ有難う御座います。是非試してみたいと思います

 自分の中で、単純に「1ヶ月前が存在しない場合にはその月の1日」を計算し
A1に、期日
B1に、=IF(DAY(A1)=DAY(DATE(YEAR(A1),MONTH(A1)-1,DAY(A1))),DATE(YEAR(A1),MONTH(A1)-1,DAY(A1)),DATE(YEAR(A1),MONTH(A1),1))
でやってみました。これも合わせて検証させていただきたいと思います。
本当にお付き合いいただき有難う御座います。                (aki)

コメント返信:

[ 一覧(最新更新順) ]


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