Ron,
Too late!
I'm happy that for the examples you cited, my formula gave correct
results.
The apparent oddity you cite is accounted for by the different number
of days in January versus February.
My formula counts days first, then months, then years.
You apparently want a formula that does the reverse. I'd love to see
you post that formula, Ron!
Here are some examples with your new formula, my CalendarMonths function, and a
DateIntvl function I've also written:
-----------------
1-Mar-2006 1/1/0 Your Latest
31-Jan-2006 0 yrs 1 month 1 day My Calendar Months
0 yrs 1 month 1 day My DateIntvl
--------------------
28-Feb-2006 1/1/0 Your Latest
27-Jan-2006 0 yrs 1 month 4 days My Calendar Months
0 yrs 1 month 1 day My DateIntvl
-----------------
1-Mar-2006 5/1/0 Your Latest
27-Jan-2006 0 yrs 1 month 5 days My Calendar Months
0 yrs 1 month 2 days My DateIntvl
------------------
30-Mar-2006 29/2/0 Your Latest
1-Jan-2006 0 yrs 1 month 60 days My Calendar Months
0 yrs 2 months 29 days My DateIntvl
-----------------
Here are the UDF's:
======================
Function CalendarMonths(d1 As Date, d2 As Date, _
Optional FracMonth As Boolean = False)
'FracMonth --> output as Month+fraction of months based on
' days in the starting and ending month
'Without FracMonth, output is in years, full calendar months, and days
Dim temp As Date
Dim i As Double
Dim yr As Long, mnth As Long, dy As Long
Dim FirstFrac As Double, LastFrac As Double
Dim Yrstr As String, Mnstr As String, Dystr As String
Dim NegFlag As Boolean
NegFlag = False
If d1 > d2 Then
NegFlag = True
temp = d1
d1 = d2
d2 = temp
End If
temp = 0
Do Until temp >= d2
i = i + 1
temp = EOM(d1, i)
Loop
If temp <> d2 Then
i = i - 1
End If
If FracMonth = True Then
FirstFrac = (EOM(d1, 0) - d1) / Day(EOM(d1, 0))
LastFrac = (d2 - EOM(d2, -1)) / Day(EOM(d2, 0))
LastFrac = LastFrac - Int(LastFrac)
CalendarMonths = i + FirstFrac + LastFrac
If NegFlag = True Then CalendarMonths = -CalendarMonths
Else
yr = Int(i / 12)
mnth = i Mod 12
dy = d2 - EOM(d1, i) + (EOM(d1, 0) - d1)
Yrstr = IIf(yr = 1, " yr ", " yrs ")
Mnstr = IIf(mnth = 1, " month ", " months ")
Dystr = IIf(dy = 1, " day", " days")
CalendarMonths = yr & Yrstr & mnth & Mnstr & dy & Dystr
If NegFlag Then CalendarMonths = "(Neg) " & CalendarMonths
End If
End Function
===========================
Function DateIntvl(d1 As Date, d2 As Date) As String
Dim temp As Date
Dim i As Double
Dim yr As Long, mnth As Long, dy As Long
Dim Yrstr As String, Mnstr As String, Dystr As String
Do Until temp > d2
i = i + 1
temp = DateAdd("m", i, d1)
Loop
i = i - 1
temp = DateAdd("m", i, d1)
yr = Int(i / 12)
mnth = i Mod 12
dy = d2 - temp
Yrstr = IIf(yr = 1, " yr ", " yrs ")
Mnstr = IIf(mnth = 1, " month ", " months ")
Dystr = IIf(dy = 1, " day", " days")
DateIntvl = yr & Yrstr & mnth & Mnstr & dy & Dystr
End Function
==============================
--ron