Zeiten mit Millisekunden subtrahieren

Hallo Wissende,

wenn ich nachstehende Funktion zweimal aufrufe habe ich zwei Zeitsempel als Strings im Format Min:Sek,Millisek

Wie/womit bilde ich da die Differenz im gleichen Format?

Sicher, durch Stringzerlegung wirds evtl. gehen.
Bin da nur grad verunsichert weil
FormatSystemTime = .wHour + 60 * .wMinute + 3600 * .wSecond + 3600000 * .wMilliseconds
einen Überlauf erzeugt (As String habe ich dabei auskommentiert)

Bietet API da was Schnelles? Bei vbarchiv.net fand ich bislang nichts dazu. Die hier benutzte API habe ich da her.

Danke ^ Gruß
Reinhard

Private Declare Sub GetSystemTime Lib "kernel32" (lpSystemTime As SYSTEMTIME)
Private Type SYSTEMTIME
 wYear As Integer
 wMonth As Integer
 wDayOfWeek As Integer
 wDay As Integer
 wHour As Integer
 wMinute As Integer
 wSecond As Integer
 wMilliseconds As Integer
End Type

Public Function FormatSystemTime() As String
Dim st As SYSTEMTIME
GetSystemTime st
'MsgBox st.wMinute
With st
'MsgBox .wMilliseconds
'FormatSystemTime = .wHour + 60 \* .wMinute + 3600 \* .wSecond + 3600000 \* .wMilliseconds
 FormatSystemTime = Format(.wMinute, "00") & ":" & \_
 Format(.wSecond, "00") & "," & Format(.wMilliseconds, "000")
End With
'FormatSystemTime = CDate(FormatSystemTime)
End Function

Grüezi Reinhard

wenn ich nachstehende Funktion zweimal aufrufe habe ich zwei
Zeitsempel als Strings im Format Min:Sek,Millisek

Wie/womit bilde ich da die Differenz im gleichen Format?

Strings zu verrechnen ist nicht gerade das Gelbe vom Ei…

Warum nicht den Rückgabewert als Double geben lassen, dann birgt die weitere Verrechnung keine Fallstricke mehr.

Die Ausgabe als String ist mit Format nur ohne die Millisekunden gemacht werden, aber im Tabellenblatt geht das ebenfalls ohne weiteres:

Option Explicit

Option Explicit

Private Declare Sub GetSystemTime Lib "kernel32" (lpSystemTime As SystemTime)
Private Type SystemTime
 wYear As Integer
 wMonth As Integer
 wDayOfWeek As Integer
 wDay As Integer
 wHour As Integer
 wMinute As Integer
 wSecond As Integer
 wMilliseconds As Integer
End Type

Public Function mySystemTime() As Double
Dim st As SystemTime
 GetSystemTime st
 With st
 mySystemTime = (.wHour / 24) + \_
 (.wMinute / 1440) + \_
 (.wSecond / 86400) + \_
 (.wMilliseconds / 86400 / 1000)
 End With
End Function

Sub tr\_start()
 With Range("A1")
 .Value = mySystemTime()
 .NumberFormat = "hh:mm:ss.000"
 End With
End Sub

Mit freundlichen Grüssen

Thomas Ramel

  • MVP für MS-Excel -

Warum nicht den Rückgabewert als Double geben lassen, dann
birgt die weitere Verrechnung keine Fallstricke mehr.

Grüezi Thomas,

in die Richtung dachte ich ja, da kam „Überlauf“.
Das kam weil ich als GAU oder DAU *gg* grad falschrum gerechnet hatte :frowning:
Danke für den Schubs :smile:
Jetzt klappt das natürlich mit der Differenzbildung durch Excel selbst.

Gruß
Reinhard