'entwickelt von Winfried Radner 'e-mail: Wolf.W.Radzinski@onlinehome.de 'Benutzung frei - ohne Gewähr 'zeit_diff zeigt die Stunden nur im Format DOUBLE an 'um daraus ein DATE Format zu machen, dividiert man 'zeit_diff einfach durch 24 (Anzeige hängt vom Zellformat ab!) 'Somit kann man das Ergebnis von zeit_diff wieder 'als time1 oder time2 an zeit_diff_str übergeben Public Function zeit_diff(time1 As Date, time2 As Date) As Double zeit_diff = CDbl(24 * (CDbl(time1) - CDbl(time2))) 'Ergebnis ist KEINE Zeit, sondern eine Zahl! End Function Public Function zeit_diff_str(time1 As Date, time2 As Date, Optional vz = "", Optional t_form = 0) As String 'Vorzeichen festlegen Standard ist vz="" sgn_time = Sgn(zeit_diff(time1, time2)) If sgn_time < 0 Then vz = "-" 'MINUS kann nicht unterdrückt werden 'Datumsteile trennen date_part = Abs(Fix(CDbl(time1) - CDbl(time2))) time_part = (CDbl(time1) - CDbl(time2)) - (sgn_time * date_part) 'Stundenanteil bestimmen t_hour_part = Abs(Fix(time_part * 24#)) time_part = time_part * 24# - (sgn_time * t_hour_part) t_hour_part = date_part * 24 + t_hour_part 'Minutenanteil bestimmen t_min_part = Abs(Fix(time_part * 60#)) time_part = time_part * 60# - (sgn_time * t_min_part) 'Sekundenanteil bestimmen t_sec_part = Abs(time_part * 60#) 'Korrekturen der angezeigten Zeitwerte If t_form = 2 Then If t_sec_part > 30 Then t_min_part = t_min_part + 1 t_sec_part = 0 End If If t_sec_part >= 59.999 Then t_sec_part = t_sec_part Mod 60 t_min_part = t_min_part + 1 End If If t_min_part >= 59.999 Then t_min_part = t_min_part Mod 60 t_hour_part = t_hour_part + 1 End If 'Anzeigestring ermitteln Select Case t_form Case 0 'standardmäßig vorbelegt zeit_diff_str = vz & Format(t_hour_part, "##0") & ":" & Format(t_min_part, "00") & ":" & Format(t_sec_part, "00") 'Ergebnis ist ein ZeitSTRING der Form "-h:mm:ss" Case 1 'Sekunden werden nicht angezeigt zeit_diff_str = vz & Format(t_hour_part, "##0") & ":" & Format(t_min_part, "00") 'Ergebnis ist ein ZeitSTRING der Form "-h:mm" Sekunden werden nicht angezeigt! Case 2 'Sekunden werden gerundet zeit_diff_str = vz & Format(t_hour_part, "##0") & ":" & Format(t_min_part, "00") 'Ergebnis ist ein ZeitSTRING der Form "-h:mm" Sekunden werden nicht angezeigt! Case 3 'dezimalString zeit_diff_str = zeit_diff(time1, time2) Case Else ' falscher Aufrufparameter für t_form zeit_diff_str = "###########################" End Select End Function ' Funktionsaufruf über zeit_diff_str(zeit1;zeit2;vorzeichen;anzeigeart) ' Ausgabe ist der Wert zeit1-zeit2 im Stringformat ' vorzeichen ist i)"" oder ii) "+" und bestimmt, ob ein ' positives Vorzeichen angezeigt wird oder nicht ' Wert ist OPTIONAL > Standard ="" ' anzeigeart ist 0;1;2 oder 3 wobei gilt ' 0: Standardausgabe "-h:mm:ss" ' 1: keine Sekunden "-h:mm" ' 2: Sekunden gerundet "-h:mm" ' 3: Stunde als Dezimalstring dargestellt ' Wert ist OPTIONAL > Standard=0 Public Function zeit_neg(zt1 As Date, Optional z_form = -1) As Variant 'Eingabe negativer Zeiten ermöglichen 'Anzeige ist abhängig von z_form ' -1: Standardausgabe: Zeit als Double formatiert (Zahl!) ' 0: mit Sekunden "-h:mm:ss" ' 1: keine Sekunden "-h:mm" ' 2: Sekunden gerundet "-h:mm" ' 3: Stunde als DezimalSTRING dargestellt If z_form = -1 Then zeit_neg = CDbl(-24# * CDbl(zt1)) Else zeit_neg = zeit_diff_str(0, zt1, , z_form) End If End Function