DateDiff の計算が正しくありません:
DateDiff("m", "30/06/2011", "24/06/2012") will return 12
しかし、実際の差は 11 か月と 25 日であるため、11 を返す必要があります。
多分誰もがこの質問に対する特定の解決策を持っています
それは私にとって理想的です: 11ヶ月と 25日
上記のカスタムメイド関数よりもクリーンなソリューションを次に示します。ほとんどの場合、組み込みの DateDiff 関数が使用されますが、切り上げられた場合は回答が調整されます。私の関数は、最初の日付が 2 番目の日付よりも遅い場合でも違いを示し、オプションでそのことを示すテキストを追加します。
Function YearsMonthsDays(Date1 As Date, _
Date2 As Date, _
Optional ShowAll As Boolean = False, _
Optional Grammar As Boolean = True, _
Optional MinusText As String = "Minus " _
) As String
Dim dTempDate As Date
Dim iYears As Integer
Dim iMonths As Integer
Dim iDays As Integer
Dim sYears As String
Dim sMonths As String
Dim sDays As String
Dim sGrammar(-1 To 0) As String
Dim sMinusText As String
If Grammar = True Then
sGrammar(0) = "s"
End If
If Date1 > Date2 Then
dTempDate = Date1
Date1 = Date2
Date2 = dTempDate
sMinusText = MinusText
End If
iYears = DateDiff("yyyy", Date1, Date2)
Date1 = DateAdd("yyyy", iYears, Date1)
If Date1 > Date2 Then
iYears = iYears - 1
Date1 = DateAdd("yyyy", -1, Date1)
End If
iMonths = DateDiff("M", Date1, Date2)
Date1 = DateAdd("M", iMonths, Date1)
If Date1 > Date2 Then
iMonths = iMonths - 1
Date1 = DateAdd("m", -1, Date1)
End If
iDays = DateDiff("d", Date1, Date2)
If ShowAll Or iYears > 0 Then
sYears = iYears & " year" & sGrammar((iYears = 1)) & ", "
End If
If ShowAll Or iYears > 0 Or iMonths > 0 Then
sMonths = iMonths & " month" & sGrammar((iMonths = 1)) & ", "
End If
sDays = iDays & " day" & sGrammar((iDays = 1))
YearsMonthsDays = sMinusText & sYears & sMonths & sDays
End Function
pure では得られませんDateDiff
。このカスタムメイドの関数を使用すると、次のように希望どおりの結果が得られます。
0 years, 1 months, 1 days
DateDif
関数を a (最後に単一の f) で見ることもできます。DateDif() は、終了月の日数が開始月よりも少ない場合でも、予期しない結果 (つまり、負の日数) を返すことに注意してください。