ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

Excel(エクセル)活用コミュのDATEDIF関数についての質問です。

  • mixiチェック
  • このエントリーをはてなブックマークに追加
DATEDIF関数について質問です。

任意の日(セルに入力)から3月31日までの日数を表示させたい場合どのような数式になるのでしょうか。

任意の日が
2012年12月1日なら 2013年3月31日までの日数 (121日)

2012年3月1日なら 2012年3月31日までの日数 (31日)


不動産の決済精算書で固定資産税の精算の起算日は関西では4月1日なのでその数式を作成したいのです。

参考
http://allabout.co.jp/gm/gc/25772/


4月1日以降の入力では、来年の3/31までの日数を計算する式は作成できるのでしょうか?

わたくしが所有している書式(1月1日が起算日)の式はこうなっています。
 
 ↓

引渡日(任意入力) B10 (セルの書式は日付)
B11 決済月の日数 =DAY(DATE(YEAR(B10),MONTH(B10)+1,0))

B12 年間日数  =DATE(YEAR(NOW())+1,1,1)-DATE(YEAR(NOW()),1,1) →366と表示されています。

B13 月末までの日数  =B11-DAY(B10)+1
B14 年末まで(12月31日)の日数 =DATEDIF(B10,DATE(YEAR(B10),12,31),"D")+1

この年末までの日数B14を 3月31日までの日数を表示させたいのです。

日付の部分を変更して=DATEDIF(B10,DATE(YEAR(B10),3,31),"D")+1と入力しても

B10が2012年4月1日以降の入力だとNUM!と表示されます。
これを翌年の2013年3月31日までの日数で表示できるようにしたいのです。

誰かご教示頂けると幸甚に存じます。





コメント(13)

開始日よりも終了日が過去になっているためにエラーになっているだけなので、
DATEDIF関数に正しい引数を渡せば良いでしょう。
開始日が4月以降なのか、3月以前なのかで終了年が変わるんでしょうね。
 
元のフォーマットにこだわらなければこれで作れます。

<式>
=IF(引渡日=DATE(2012,12,1),DATE(2013,3,31)-引渡日+1,0)
=IF(引渡日=DATE(2012,3,1),DATE(2012,3,31)-引渡日+1,0)

従来のフォーマットでということであれば、今日は寝ますので、また考えます。
よく見ると2行書く必要なかったです。
=IF(EXACT(引渡日,DATE(2012,12,1)),DATE(2013,3,31)-引渡日+1,IF(EXACT(引渡日,DATE(2012,3,1)),DATE(2012,3,31)-引渡日+1,エラー))

来年以降もそのまま使うということであれば、少し複雑になりますが、こちら。
=IF(EXACT(引渡日,DATE(YEAR(引渡日),12,1)),DATE(YEAR(引渡日)+1,3,31)-引渡日+1,IF(EXACT(引渡日,DATE(YEAR(引渡日),3,1)),DATE(YEAR(引渡日),3,31)-引渡日+1,エラー))
一旦Dateif関数からは離れて考えてみます。


求めたいことは、
1) 2012年12月1日に対してなら「121」という数値
2) 2012年3月1日に対してなら「31」という数値

その場限りの計算であれば、
1)の場合なら2013/4/1から2012/12/1を引く
2)の場合なら2012/4/1から2012/3/1を引く

そうするとそれぞれの値を求めることが出来ます。


一般化して言うと、ここでポイントになるのは、与えられた日付に対してその次年度初日の日付をどのように求めるか、だと思います。


エクセルではその手段はきっといくつかあると思いますが、さしあたってVlookup関数を使って求める手段が思いつきました。

まず、次のようなリストをエクセルファイルのどこかに作成しておきます。
2010/3/31 2011/4/1
2011/3/31 2012/4/1
2012/3/31 2013/4/1
2013/3/31 2014/4/1

このリストで想定している年度は、2010年度から2013年度まで、即ち2010年4月1日から2010年3月31日の範囲です。それを超える場合はリストの内容を適宜増やす必要があります。


任意の日付を入力するセルを「B10」とします。
それに対する日数を求めるセルを「B11」とします。

セル「B11」には「=Vlookup(B10,そのリストの範囲,2,True)-B10」

これで求めたい結果を得られると思います。


なお、Vlookup関数で検索の型を「True」にする場合には、リストの並べ方でひとつだけ注意することがあります。それはヘルプなどで確認しておいてください。
ユーザー定義関数を考えてみました。豹海豹さんは、そういうレスを求めているんじゃないかも知れないですけれども。(複雑なIF関数は苦手・・です。)

Function NISSUU(日付)
  If Month(日付) < 4 Then
    NISSUU = DateDiff("d", 日付, DateSerial(Year(日付), 4, 1))
  Else
    NISSUU = DateDiff("d", 日付, DateSerial(Year(日付) + 1, 4, 1))
  End If
End Function

これで、いいのか・・。あまり自信ないです。
aki-akiさん
良さそうですね。
不定な値で動作しないように入力値の判定を入れ、「Else」を「Else if (日付) <= 12 Then」(Elifでしたかね?)
として、Else文を入れれば完璧でしょう!

Function NISSUU (日付)
  If Month ((日付) < 4) Then
    日数 = DateDiff("d", 日付, DateSerial(Year(日付), 4, 1))
  Else if (日付) <= 12 Then
    日数 = DateDiff("d", 日付, DateSerial(Year(日付) + 1, 4, 1))
  Else
    エラー時の処理はここに書く(このコードでは何もしない)
  End If
End Function
>7 鈴木 鸞 さん
 では、ISDATE関数を使って・・

Function NISSUU(日付)
  If Not IsDate(日付) Then
    MsgBox (日付 & ":入力エラー!")
    NISSUU = ""
    Exit Function
  End If
  
  If Month(日付) < 4 Then
    NISSUU = DateDiff("d", 日付, DateSerial(Year(日付), 4, 1))
  Else
    NISSUU = DateDiff("d", 日付, DateSerial(Year(日付) + 1, 4, 1))
  End If
End Function

でも、ISDATE関数って、年を4桁で入れないと、真面目に判断してくれないようです・・。Orz

B14 =DATE(YEAR(B10)+(MONTH(B10)>3),4,1)-B10
(↑ウチでは表示形式が勝手に「日付」にされてしまったので「標準」に戻して日数を表示しました。)

または

B14 =DATEDIF(B10,DATE(YEAR(B10)+(MONTH(B10)>3),4,1),"D")
(今回調べて初めてDATEDIFの使い方を知りました ^^;)

「3/31で+1」の代わりに「4/1」を使ってみました。両者はたぶん同じと思います。
>10 ゆはえさん

>B14 =DATEDIF(B10,DATE(YEAR(B10)+(MONTH(B10)>3),4,1),"D")
 おおっ!なんで、年のとこに、月を足しちゃうの!?って、しばらくわかりませんでした・・。こういう真偽の式の使い方もあるだ!!・・と、式を分解して、表示したらわかりました。

こんな簡単な式で、出来ちゃうんですね!こういう発想って、まだまだです!>自分
ifを使った方が分かりやすくて好きなのですが、なぜか短い方を貼ってしまいました。
発想は >5 八神かかしさん の後半部分をシンプルにしてみただけのものと思います。

あと、私が日数の数え方をちゃんと理解できてなかったからこの問題を試してみたのですが、

日数 = 最終日の翌日 - 初日 … (日数 = 4/1 - 引渡日)

よりも

日数 = 最終日 - 初日 + 1 … (日数 = 3/31 - 引渡日 + 1)

の方が私には分かりやすい気がしてきました。(些細な事ではありますが ^^;)

B14 =DATEDIF(B10,DATE(YEAR(B10)+if(MONTH(B10)>3,1,0),3,31),"D")+1
12でわたしの名前が出てきたから、というわけでもありませんが、5の続きのようなことです。

次のことをエクセル上で表現できればよいのだと思います。以下、少し理屈っぽい言い回しですが、それはご勘弁を。

与えられた日付が、暦年で同じ年の4月1日よりも前の日付の場合、
与えられた日付と暦年で同年の4月1日が求める日付。

与えられた日付が、暦年で同じ年の4月1日か、後にある日付の場合、
与えられた日付の暦年で翌年の4月1日が求める日付。

そしてそれぞれに導き出された4月1日から与えられた日付を引く。

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

Excel(エクセル)活用 更新情報

Excel(エクセル)活用のメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。