アプリ版:「スタンプのみでお礼する」機能のリリースについて

こんにちは。Excelで次の計算式を作りたいです。

(1)期間を算出する計算式
    A      B
1 1990/3/30  

セル番号A1;入塾年月日
セル番号B2;入塾から現在(2006/5/30)までの年数(期間。何年何ヶ月何日あるのか?)を表示されるようにしたい。

A 回答 (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
    • good
    • 0
この回答へのお礼

merlionXXさんこんばんは!
すごくご丁寧にありがとうございます!m(^o^)m
今、調べていたら、dateifを使えばいい、とネットにあったのですが、端数処理に信頼がおけない、とのことで、、
ここまで詳しく教えて頂いてありがたいです。
早速あした使わせて頂こうと思います!
ありがとうございました!!

お礼日時:2006/05/30 23:59

=DATEDIF(A1,TODAY(),"y")&"年"&DATEDIF(A1,TODAY(),"ym")&"ヵ月"&DATEDI

F(A1,TODAY(),"md")&"日"
    • good
    • 0
この回答へのお礼

mike_gさんありがとうございました。
締め切ろうと思いましたら、入れ違いにコメント下さったのですね^^
dateifを使おうと思っても、こんなに長く複雑になるのですねぇ~。
タイミングよくご回答下さってよかったです。ありがとうございます。

お礼日時:2006/05/31 00:01

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!