Ciao Franco, ho implementato la seguente funzione che tratta l'intervallo (quale periodo intercorso fra due date, che sono i parametri da fornire).
Ho sfruttato la modalità di rappresentazione del formato data, ove la parte intera fornisce i giorni e la parte decimale l'orario (ore, miuti, secondi).
Penso può essere una alternativa diretta che supera il vincolo della trasformazione del dato in secondi con conseguente errore di
overflow.
L'ho buttata di getto, non ho effettuato un test affidabile ma magari puoi valutarla e adattarla a quanto hai proposto nel demo.
Option Compare Database
Option Explicit
Public Function DiffGiorniOre(dteStart As Date, dteEnd As Date) As String
'--------------------------------------------------------------------------------
' Funzione che date due date determina l'intervallo come differenza dei
' valori numerici di tipo Double ove la parte intera rappresenta i giorni
' e la parte decimale l'orario (ore, minuti, secondi).
' Restituisce il valore in formato Stringa espressa nella modalità
' dell'intervallo in: giorni, ore, minuti e secondi.
'--------------------------------------------------------------------------------
' Function that you give two dates determines the interval as the difference of
' numeric values of type Double where the integer part represents the days
' and the decimal part the time (hours, minutes, seconds).
' Returns the value in String format expressed in the mode
' of the interval in: days, hours, minutes and seconds.
'--------------------------------------------------------------------------------
Dim dblStart As Double, dblEnd As Double
Dim dblDiff2Date As Double
Dim strGiornoOrario As String
Dim dblParteDecimale As Double
Dim intParteIntera As Integer
Dim dblIntervalSec As Double
dblStart = CDbl(dteStart)
dblEnd = CDbl(dteEnd)
' Differenza delle due date come Intervallo di tempo trascorso (Time elapsed)
dblDiff2Date = dblEnd - dblStart
' Debug.Print dblStart, dblEnd, dblDiff2Date
intParteIntera = Int(dblDiff2Date) ' La parte intera rappresenta il numero di giorni
dblParteDecimale = (dblDiff2Date - intParteIntera) ' La parte decimale rappresenta l'orario (ore, minuti e secondi)
' Per semplicità il calcolo avviene con la conversione in secondi (For simplicity, convert to seconds)
' L'orario poteva anche essere calcolato con le apposite funzioni
' Esempio: Hour(dblParteDecimale) , Minute(dblParteDecimale) , Secondi = Second(dblParteDecimale)
dblIntervalSec = dblParteDecimale * 86400 ' La parte decimale viene rapportata al massimo dei secondi disponibilinella giornata (24 * 60 * 60 = 86400)
' Debug.Print "dblIntervalSec", dblIntervalSec
' Ora crea la stringa di testo del tempo trascorso (Now create a text string for the time elapsed)
Select Case Int(dblIntervalSec)
Case Is < 60
strGiornoOrario = CInt(dblIntervalSec) & " sec"
Case Is < 3600
strGiornoOrario = CInt(dblIntervalSec \ 60) & " min " & CInt(dblIntervalSec Mod 60) & " sec"
Case Is < 86400
strGiornoOrario = CInt(dblIntervalSec \ 3600) & " ore " & CInt((dblIntervalSec Mod 3600) \ 60) & " min " & CInt(dblIntervalSec Mod 60) & " sec"
Case Else
strGiornoOrario = "Orario Non valido"
End Select
' Valore restituito della funzione
If intParteIntera > 0 Then
' Ciò assegna il numero dei giorni trascorsi (This gives the time elapsed with days
DiffGiorniOre = intParteIntera & " giorni " & strGiornoOrario
Else
' Solo orario ore, minuti, secondi (no giorni) Only hour, minute, seconds (no days)
DiffGiorniOre = strGiornoOrario
End If
End Function
Sub TestDiffGiorniOre()
' Esempio dati di prova (Example data values)
Debug.Print "Differenza orario = " & DiffGiorniOre(#10/5/2017 9:13:04 AM#, #1/7/2018 11:34:27 PM#)
Debug.Print "Differenza orario = " & DiffGiorniOre(#1/31/2023 11:59:58 PM#, #12/31/2023 11:59:59 PM#)
Debug.Print "Differenza orario = " & DiffGiorniOre(#12/30/2023 11:59:58 PM#, #12/31/2023 11:59:59 PM#)
Debug.Print "Differenza orario = " & DiffGiorniOre(#4/4/2023 10:20:30 AM#, #12/31/2023 10:20:40 PM#)
Debug.Print "Differenza orario = " & DiffGiorniOre(#1/1/2023 11:59:58 PM#, #12/31/2023 11:59:59 PM#)
End Sub