clem ha scritto:Ho provato la formula con una data presa a caso: 21/06/2009 al 12/01/2012 , mi restituisce anni 2 ; mesi 6 ; giorni 135.
Perchè i giorni 135 ? Questi sono circa 4 mesi che la fomula avrebbe dovuto sommare ai 6 , dando anni 2 ; mesi 10 ; giorni 15 .
Forse mi sfugge qualcosa .
Ti ringrazio .
saluti
giuseppe
Salve
siamo certi che usi la vesione 2003?? è provato che con la versione 2007, la funzione Data.Diff restituiisce valori errati nel calcolo dei giorni. Parte proprio che nel conteggio dei giorni se il giorno finale è minore del giorno iniziale produce valori errati ma se provi con
21/06/2009 - 22/01/2012 il conteggio è corretto. Nessuna inform,azione in merito a ,ciò da partte di MS.
Una funzione Utente che scavalca il problema recuperata in rete è quella che segue:
Function YearsMonthsDays(Date1 As Date, Date2 As Date, Optional ShowAll As _
Boolean = False, Optional Grammar As Boolean = True)
'Udf prelevata dal sito
www.vbaexpress.com Dim TestYear As Long, TestMonth As Long, TestDay As Long
Dim TargetDate As Date, Last1 As Date, Last2 As Date
' Strip time portions
Date1 = Int(Date1)
Date2 = Int(Date2)
' Test for invalid dates
If Date1 > Date2 Then
YearsMonthsDays = ""
Exit Function
End If
' Test for whether the calendar year is the same
If Year(Date2) > Year(Date1) Then
' Different calendar year.
' Test to see if calendar month is the same. If it is, we have to look at the
' day to see if a full year has passed
If Month(Date2) = Month(Date1) Then
If Day(Date2) >= Day(Date1) Then
TestYear = DateDiff("yyyy", Date1, Date2)
Else
TestYear = DateDiff("yyyy", Date1, Date2) - 1
End If
' In this case, a full year has definitely passed
ElseIf Month(Date2) > Month(Date1) Then
TestYear = DateDiff("yyyy", Date1, Date2)
' A full year has not passed
Else
TestYear = DateDiff("yyyy", Date1, Date2) - 1
End If
' Calendar year is the same, so a full year has not passed
Else
TestYear = 0
End If
' Test to see how many full months have passed, in excess of the number of full
' years
TestMonth = (DateDiff("m", DateSerial(Year(Date1), Month(Date1), 1), _
DateSerial(Year(Date2), Month(Date2), 1)) + IIf(Day(Date2) >= _
Day(Date1), 0, -1)) Mod 12
' See how many days have passed, in excess of the number of full months. If the day
' number for Date2 is >= that for Date1, it's simple
If Day(Date2) >= Day(Date1) Then
TestDay = Day(Date2) - Day(Date1)
' If not, we have to test for end of the month
Else
Last1 = DateSerial(Year(Date2), Month(Date2), 0)
Last2 = DateSerial(Year(Date2), Month(Date2) + 1, 0)
TargetDate = DateSerial(Year(Date2), Month(Date2) - 1, Day(Date1))
If Last2 = Date2 Then
If TestMonth = 11 Then
TestMonth = 0
TestYear = TestYear + 1
Else
TestMonth = TestMonth + 1
End If
Else
TestDay = DateDiff("d", IIf(TargetDate > Last1, Last1, TargetDate), Date2)
End If
End If
If ShowAll Or TestYear >= 1 Then
YearsMonthsDays = TestYear & IIf(TestYear = 1 And Grammar, " Anno, ", _
" Anni, ") & TestMonth & IIf(TestMonth = 1 And Grammar, " Mese, ", _
" Mesi, ") & TestDay & IIf(TestDay = 1 And Grammar, " Giorno", " Giorni")
Else
If TestMonth >= 1 Then
YearsMonthsDays = TestMonth & IIf(TestMonth = 1 And Grammar, " Mese, ", _
" Mesi, ") & TestDay & IIf(TestDay = 1 And Grammar, " Giorno", " Giorni")
Else
YearsMonthsDays = TestDay & IIf(TestDay = 1 And Grammar, " Giorno", " Giorni")
End If
End If
End Function
Copia e incolla tutto il codice da Function a End function in un modulo standard di Visual basic e richiama come funzione definta dall'utente.
saluti
Giap