Non ho capito cosa intendi con "consideri anche le eccezioni
dell'annno bisestile" la mia UDF con tra il 28/02/2012 e 01/03/2012
dice che ci sono 0 anni 0 mesi e 2 giorni, mentre tra il 28/02/2011 e
01/03/201 dice che ci sono 0 anni 0 mesi e 1 giorno, quindi direi che
gestisce i bisestili.
la mia artigianale e scritta al volo, vuole due argomenti: la data
iniziale (vecchia) e la data finale (recente) e resituisce una matrice
di tre valori: anni mesi e giorni di differenza tra le due date.
Alcuni esempi di uso (in A9.. data iniziale, in B9.. data finale):
in C9:D9...::
= diffdata(A9;B9)
E' anche possibile prendere un solo valore, ad esempio per i soli
giorni:
=INDICE(diffdata(A3;OGGI()-1);3)
per i mesi:
=INDICE(diffdata(A3;OGGI()-1);2)
per gli anni:
=INDICE(diffdata(A3;OGGI()-1);1)
Questi alcuni risultati:
03/10/1980 26/01/2012 31 3 23
26/10/1980 26/01/2012 31 3 0
27/10/1980 26/01/2012 30 8 30
27/10/1980 27/10/2012 32 0 0
27/10/1980 26/10/2012 31 11 29
28/02/2011 01/03/2011 0 0 1
28/02/2012 01/03/2012 0 0 2
A te testarla con date "bizzarre".
Questo il codice (mi sembra abbastanza chiaro: uso due matrici in cui
memorizzo anno mese giorno delle due date, una terza matrice per il
risultato) ripeto che non l'ho testata e quindi non garantisco la
correttezza dei risultati:
Public Function DiffData(ByVal dDataOld As Date, ByVal dDataNew As
Date) As Variant
Dim aDataOld(1 To 3) As Variant
Dim aDataNew(1 To 3) As Variant
Dim aData(1 To 3) As Variant
Application.Volatile
aDataOld(1) = VBA.DatePart("yyyy", dDataOld)
aDataOld(2) = VBA.DatePart("m", dDataOld)
aDataOld(3) = VBA.DatePart("d", dDataOld)
aDataNew(1) = VBA.DatePart("yyyy", dDataNew)
aDataNew(2) = VBA.DatePart("m", dDataNew)
aDataNew(3) = VBA.DatePart("d", dDataNew)
If aDataNew(2) >= aDataOld(2) Then
aData(2) = aDataNew(2) - aDataOld(2)
aData(1) = aDataNew(1) - aDataOld(1)
Else
aData(2) = 12 + aDataNew(2) - aDataOld(2)
aData(1) = aDataNew(1) - aDataOld(1) - 1
End If
If aDataNew(3) >= aDataOld(3) Then
aData(3) = aDataNew(3) - aDataOld(3)
Else
aData(3) = Day(DateSerial(Year(dDataNew), Month(dDataNew), 0)) +
aDataNew(3) - aDataOld(3)
If aDataNew(1) > aDataOld(1) Then aData(1) = aData(1) - 1
If aDataNew(2) > aDataOld(2) Then
aData(2) = aData(2) - 1
Else
aData(2) = 11 - aData(2)
End If
End If
DiffData = aData
End Function
Bye!
scossa