Я принимаю меры, чтобы разрешить индикаторы и результаты, которые переносятся в дни (более 23: 59: 59: 999 или менее -23: 59: 59: 999). Если это не проблема для вас, вы можете игнорировать оба знаковых указателя и дни, поскольку в результате подавляются «+» и «нулевые дни».
Private Function ToLong(ByVal HMSms As String) As Long
'Valid value range is -2:20:31:23:647 to +2:20:31:23:647,
'Sign indicator optional, days position optional.
Dim Parts() As String
Dim SChar As String
Dim Sign As Long
SChar = Left$(HMSms, 1)
If SChar = "+" Or SChar = "-" Then
HMSms = Mid$(HMSms, 2)
Sign = IIf(SChar = "+", 1, -1)
Else
Sign = 1
End If
Parts = Split(HMSms, ":")
If UBound(Parts) < 4 Then
Parts = Split("0:" & HMSms, ":")
End If
ToLong = CLng(Parts(4)) _
+ CLng(Parts(3)) * 1000& _
+ CLng(Parts(2)) * 1000& * 60& _
+ CLng(Parts(1)) * 1000& * 60& * 60& _
+ CLng(Parts(0)) * 1000& * 60& * 60& * 24&
ToLong = ToLong * Sign
End Function
Private Function Diff(ByVal Minu As String, ByVal Subtra As String) As String
'Result suppresses positive sign indicator and 0 value in days position.
Dim DiffLong As Long
Dim SChar As String
DiffLong = ToLong(Minu) - ToLong(Subtra)
If DiffLong < 0 Then
SChar = "-"
DiffLong = -DiffLong
End If
Diff = "0:00:00:00:000"
Mid$(Diff, 1, 1) = Format$(DiffLong \ (1000& * 60& * 60& * 24&), "0")
Mid$(Diff, 3, 2) = Format$(DiffLong \ (1000& * 60& * 60&) Mod 24&, "00")
Mid$(Diff, 6, 2) = Format$(DiffLong \ (1000& * 60&) Mod 60&, "00")
Mid$(Diff, 9, 2) = Format$(DiffLong \ 1000& Mod 60&, "00")
Mid$(Diff, 12, 3) = Format$(DiffLong Mod 1000&, "000")
If Left$(Diff, 1) = "0" Then Diff = Mid$(Diff, 3)
Diff = SChar & Diff
End Function
Некоторые результаты тестовых примеров:
08:34:45:734 - 08:34:12:744 = 00:00:32:990
08:34:45:734 - 08:34:40:734 = 00:00:05:000
08:34:12:744 - 08:34:45:734 = -00:00:32:990
-00:00:00:000 - +00:00:00:000 = 00:00:00:000
+00:00:00:000 - 00:00:00:001 = -00:00:00:001
1:00:00:00:000 - 00:00:00:001 = 23:59:59:999
-2:00:00:00:000 - 00:00:00:000 = -2:00:00:00:000
-12:00:00:000 - 12:00:00:000 = -1:00:00:00:000
-23:59:59:999 - 00:00:00:000 = -23:59:59:999