- ベストアンサー
Excel 期間を算出したい 計算式 教えてください!
こんにちは。Excelで次の計算式を作りたいです。 (1)期間を算出する計算式 A B 1 1990/3/30 セル番号A1;入塾年月日 セル番号B2;入塾から現在(2006/5/30)までの年数(期間。何年何ヶ月何日あるのか?)を表示されるようにしたい。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
こんばんは。 わたしもこれをワークシート関数で求めようとして挫折しました。 ワークシート関数にも、Datedifという関数があるのですが、末日計算の端日数処理でバグがあり、信頼に欠け、使えませんでした。 しかたなく、一般公開されているサンプルコードで下記のようなVBAでユーザー定義関数を用いるしかありませんでした。 使用方法 下記のマクロのコードを標準モジュールに貼り付け、ワークシートのセルに 開始日A1 終了日B1 の場合 =ktDATEDIF(A1,B1,"YMD",FALSE) としてみてください。 最後の引数は初日算入ならTRUE, 初日不算入ならFALSEです。 (民法規定は[初日 不算入]が基本です) 『開始日』『終了日』に対し、民法規定に従って【y年mヶ月d日】を求めるマクロ。 Public Function ktDATEDIF(ByVal StartDate As Date, _ ByVal EndDate As Date, _ ByVal Interval As String, _ ByVal FirstDay As Boolean) As Variant ' [Interval] ' YMD:"yyyy年mヶ月d日"で編集(文字列) ' Y:期間内満年数, M:期間内満総月数 ' YM:端数の月数, MD:端数の日数 ' [FirstDay] ' 初日算入=True, 初日不算入=False (民法規定は[初日 不算入]が基本) Dim dtmFirstDate As Date '起算日 Dim dtmLastDate As Date '満了日 Dim wkDate As Date Dim intMonth As Integer '総月数 Dim intYear As Integer Dim intMonth_in_Year As Integer '年未満の月数 Dim intDay_in_Month As Integer '月未満の日数 If (StartDate > EndDate) Then ktDATEDIF = "Error" Exit Function End If If (FirstDay = False) Then dtmFirstDate = StartDate + 1 '民法規定は[初日 不算入]が基本 Else dtmFirstDate = StartDate 'True:[初日算入]指定 End If dtmLastDate = EndDate '注)[DateDiff関数]自体は初日不算入で処理している If (Day(dtmFirstDate) = 1) Then '起算日が1日(開始日が月末日)の場合、月の大小閏に係わりなく '[月末日]までで『丸Nヶ月』 '月の大小閏に影響されないように「月末日~終了日」を1日分シフトして '「1日~(終了日+1)」で求める。 intMonth = DateDiff("m", dtmFirstDate, (dtmLastDate + 1)) intYear = intMonth \ 12 intMonth_in_Year = intMonth Mod 12 If (Day(dtmLastDate + 1) = 1) Then '満了日(終了日)が月末か? intDay_in_Month = 0 Else intDay_in_Month = Day(dtmLastDate) End If Else '起算日≠1日の場合、「起算日の応答日前日」までで『丸Nヶ月』 intMonth = DateDiff("m", (dtmFirstDate - 1), dtmLastDate) wkDate = DateAdd("m", intMonth, (dtmFirstDate - 1)) If (wkDate > dtmLastDate) Then intMonth = intMonth - 1 wkDate = DateAdd("m", intMonth, (dtmFirstDate - 1)) End If intDay_in_Month = DateDiff("d", wkDate, dtmLastDate) intYear = intMonth \ 12 intMonth_in_Year = intMonth Mod 12 End If Select Case UCase(Interval) Case "YMD" ktDATEDIF = intYear & "年" & intMonth_in_Year & "ヶ月" & intDay_in_Month & "日" Case "Y" ktDATEDIF = intYear Case "M" ktDATEDIF = intMonth Case "YM" ktDATEDIF = intMonth_in_Year Case "MD" ktDATEDIF = intDay_in_Month Case Else ktDATEDIF = "Error" End Select End Function
その他の回答 (1)
=DATEDIF(A1,TODAY(),"y")&"年"&DATEDIF(A1,TODAY(),"ym")&"ヵ月"&DATEDIF(A1,TODAY(),"md")&"日"
お礼
mike_gさんありがとうございました。 締め切ろうと思いましたら、入れ違いにコメント下さったのですね^^ dateifを使おうと思っても、こんなに長く複雑になるのですねぇ~。 タイミングよくご回答下さってよかったです。ありがとうございます。
お礼
merlionXXさんこんばんは! すごくご丁寧にありがとうございます!m(^o^)m 今、調べていたら、dateifを使えばいい、とネットにあったのですが、端数処理に信頼がおけない、とのことで、、 ここまで詳しく教えて頂いてありがたいです。 早速あした使わせて頂こうと思います! ありがとうございました!!