DatenbankManufaktur

Anwendungen so individuell wie Ihr Unternehmen   –   Office- und VBA-Erfahrung seit 1995

Access-Datumsformat mit mehr als 24 Stunden

Von einem Kunden wurde ich gefragt, wie man die Formatierung von Zeiten mit mehr als 24 Stunden erreichen kann. In Excel geht das ja sehr einfach mit dem Format [h]:mm. In Access gibt dieses Format nicht, was mir aber nie aufgefallen war, weil bei meinen Anwendungen bisher immer Industrieminuten zum Einsatz kamen. Das war dann auch der Ansatz für die Lösung:

=Format(Fix(Summe([Arbeitszeit])*24);"#.##0") & Format(Summe([Arbeitszeit]);":nn")

Die Vorkomma(doppelpunkt)stellen in Industriestunden umrechnen (Zeit * 24) und die Zeitminuten mit einem Doppelpunkt zusammen anhängen.

Code

Und um nicht immer die komplizierte Formel eingeben zu müssen, habe ich auf Basis einer alten Format-Funktion eine neue erstellt:

Public Function fStundenMinuten(ByVal varZeit As Variant) As String
' ----------------------------------------------------------------
' Zweck    : Zeiten als Stunden (auch > 24) mit Minuten anzeigen,
'            analog zum Format [h]:nn in Excel
' Eingabe  : Eine Zeit / Datum oder eine Zahl, die als Zeitraum
'            interpretiert werden können.
'            Beispiele:
'              fStundenMinuten("1.1.1900 23:59")    > 71:59
'              fStundenMinuten(1.5)                 > 36:00
'              fStundenMinuten(Summe([Arbeitszeit]) > 99:99
'              fStundenMinuten(NULL)                > 0:00
'              fStundenMinuten("Willi Wacker")      > #Typ
' Ausgabe  : Text im Format Stunden (Standardzahl) : Minuten
' Autor    : Raphael Hein
' Datum    : 11.09.2020
' ----------------------------------------------------------------
   ' nötigenfalls ein Datum in eine Zahl umwandeln
   If IsDate(varZeit) Then
      varZeit = CDbl(CDate(varZeit))
   End If

   If IsNumeric(varZeit) Then
      ' Format aus der Zahl formatieren: 
      ' Vorkommastellen (Tage) * 24 = Stunden
      fStundenMinuten = Format(Fix(varZeit * 24), "#,##0") _
                        & Format(varZeit, ":nn")
   Else
      If IsNull(varZeit) Then
         fStundenMinuten = "0:00"
      Else
         fStundenMinuten = "#Typ"
      End If
   End If

End Function

Und der Vollständigkeit halber hier noch die alte Tage-Stunden-Funktion:

Public Function fTageStunden(ByVal varZeit As Variant, _
                             Optional booVoll As Boolean = True) As String
' ----------------------------------------------------------------
' Zweck    : Zeiten als Tage mit (vollen) Stunden
' Eingabe  : Eine Zeit / Datum oder eine Zahl, die als Zeitraum
'            interpretiert werden können.
'            Um angefangene Stunden anzuzeigen: optionalen Parameter
'            booVoll auf FALSE setzen
'            Beispiele:
'              fTageStunden("1.1.1900 23:59")    > 2 Tage und 23 Stunden
'              fTageStunden(1.06)                > 1 Tag und 1 Stunde
'              fTageStunden(1.06, False)         > 1 Tag und 2 Stunden
'              fTageStunden(Summe([Arbeitszeit]) > 9 Tage/e und 9 Stunde/n
'              fTageStunden(NULL)                > 0 Tage und 0 Stunden
'              fTageStunden("Willi Wacker")      > #Typ
             
' Ausgabe  : Text im Format Tag/e (Standardzahl) und Stunde/n
' Autor    : Raphael Hein
' Datum    : 11.09.2020
' ----------------------------------------------------------------
   ' nötigenfalls ein Datum in eine Zahl umwandeln
   If IsDate(varZeit) Then
      varZeit = CDbl(CDate(varZeit))
   End If
   
   If Not booVoll Then
      ' um angefangene Stunden (mit mindestens 1 Sekunde) zu erhalten,
      ' eine knappe Stunde dazu addieren
      varZeit = varZeit + CDbl(CDate("0:59:59"))
   End If
   
   If IsNumeric(varZeit) Then
      ' Format aus der Zahl formatieren: Vorkommastellen = Tage
      fTageStunden = Format(Fix(varZeit), "#,##0") & " Tag" _
                     & IIf(Fix(varZeit) > 1, "e", "") _
                     & " und " & Format(varZeit, "h") _
                     & " Stunde" & IIf(Format(varZeit, "h") = "1", "", "n")
   Else
      If IsNull(varZeit) Then
         fTageStunden = "0 Tage und 0 Stunden"
      Else
         fTageStunden = "#Typ"
      End If
   End If

End Function

Beide Funktionen lassen sich leicht an andere Anforderung anpassen.