'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 'Version2 erweitert um benutzerdefiniertes Ausgabeformat des Zeitstrings 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, Optional spec_form = "") 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 4 'benutzerdefiniert mit spec_form z_temp = "" If Not IsEmpty(spec_form) Then sz = 0: mz = 0: hz = 0: vsgn = 0 s_temp = CStr(Fix(t_sec_part + 0.5)) m_temp = CStr(Fix(t_min_part)) h_temp = CStr(Fix(t_hour_part)) For i = Len(spec_form) To 1 Step -1 Select Case Mid(spec_form, i, 1) Case "s": If sz < Len(s_temp) Then z_temp = Mid(s_temp, Len(s_temp) - sz, 1) + z_temp sz = sz + 1 Else z_temp = "0" & z_temp End If Case "m": If mz < Len(m_temp) Then z_temp = Mid(m_temp, Len(m_temp) - mz, 1) + z_temp mz = mz + 1 Else z_temp = "0" & z_temp End If Case "h": If hz < Len(h_temp) Then z_temp = Mid(h_temp, Len(h_temp) - hz, 1) + z_temp hz = hz + 1 Else z_temp = "0" & z_temp End If Case "+": If vsgn = 0 Then If sgn_time >= 0 Then z_temp = "+" & z_temp vsgn = 1 End If Else z_temp = z_temp End If Case "-": If vsgn = 0 Then If sgn_time < 0 Then z_temp = "-" & z_temp vsgn = 1 End If Else z_temp = z_temp End If Case Else: z_temp = Mid(spec_form, i, 1) & z_temp End Select Next i End If zeit_diff_str = z_temp Case Else ' falscher Aufrufparameter für t_form zeit_diff_str = "###########################" End Select End Function ' Funktionsaufruf über zeit_diff_str(zeit1;zeit2;vorzeichen;anzeigeart;spec_form) ' 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 ' 4: benutzerdefiniert z.B. "-ss.mm.hhhh" sei z.B. 182h13m45s ergibt dies mit ' "h:m:s+" als "2:3:5+" und mit "-hmshmshms" wird daraus "100814235" ' Wert ist OPTIONAL > Standard=0 ' spec_form z.B. "-hhh:mm:ss" (einfach ausprobieren!) Wert ist OPTIONAL > Standard ="" 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: Zeit als Double formatiert ' 0: Standardausgabe "-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 Public Function zeit_korr(zt1 As Date) As Double t1 = 4# + 1# / 2# t2 = 6# + 1# / 3# p1 = 15 p2 = 20 p3 = 45 Select Case zt1 Case Is < 0: zeit_korr = CDbl(zt1) Case Is <= (t1 / 24#): zeit_korr = CDbl(zt1) - CDbl(p1 / 60 / 24) Case Is <= (t2 / 24#): zeit_korr = CDbl(zt1) - CDbl(p2 / 60 / 24) Case Else: zeit_korr = CDbl(zt1) - CDbl(p3 / 60 / 24) End Select End Function