Hallo,
ich möchte für unsere im Bereitschaftsdienst tätigen Mitarbeiter ein kleine Anwendung für die Eintragung der Einsatzzeiten pro Monat machen. Dabei habe ich das Problem, das in einem Monat durchaus mal mehr als 24h anfallen. Wenn ich nun als Format für die Tabellenspalte Datum/Uhrzeit auswähle kann ich nur 24h eintragen - gibt es da eine Möglichkeit ein anderes Format zu wählen?
Anschließend möchte ich natürlich mit den Zahlen auch verschiedene Berechnungen machen - geht das? Im Prinzip soll 23:00 + 34:00 = 57:00 sein :)!
gruß
sigma
Hallo,
ein Format >23:59:59 (24:00 gibt es nicht) kann nicht eingestellt werden.
Du musst die ganzen Zeiten in Minuten rechnen und dann bei Bedarf in Stunden und Minuten umrechnen.
Im Beispiel wäre das so:
1380 + 2040 = 3420 / 60 = 57:00
Bei Teilen von Stunden wird es etwas komplizierter.
Hallo,
danke für die Info. Dann werde ich wohl nochmal drüber nachdenken ob ich es mit Access umsetzen werde. Da scheint mir doch eine Exceltabelle etwas einfacher zu sein - dort ist das kein Problem mit dem Stundenformat >24h.
gruß sigma
Hallo,
Zitatdort ist das kein Problem mit dem Stundenformat >24h.
das bezweifle ich. Du hast dort genau das gleiche Problem. Eine Zeit ist eine Kommazahl <1. Über eins ist das Datum dabei.
Es wird Dir nicht gelingen ein Zeitfeld in Excel mit 37:00 zu formatieren. Aus 37:00 wird 13:00 genau wie in Access auch.
Auch in Excel musst Du mit Minuten rechnen.
Die Datentypen Datum/Zeit sind in Excel und Access gleich.
Hallo!
Bei Excel kann man das Format [h]:mm:ss verwenden.
Das brachte mich auf die Idee, die Format-Funktion zu überschreiben und der auch dieses Format beizubringen. ;)
Mein Versuch:
Public Function Format(ByVal Expression As Variant, Optional ByVal FormatString As Variant, _
Optional ByVal FirstDayOfWeek As VbDayOfWeek = vbSunday, _
Optional ByVal FirstWeekOfYear As VbFirstWeekOfYear = vbFirstJan1) As String
Dim Hours As Long
If IsDate(Expression) And InStr(1, FormatString, "[H]") > 0 Then
Hours = Fix(CDate(Expression) * 24)
FormatString = Replace(FormatString, "[H]", Hours)
End If
Format = VBA.Format$(Expression, FormatString, FirstDayOfWeek, FirstWeekOfYear)
End Function
mfg
Josef
Zitat von: Josef P. am Januar 18, 2011, 23:39:41
Bei Excel kann man das Format [h]:mm:ss verwenden.
Jup genau so mache ich es dort - ich nehme zwar [hh]:mm da ich es nicht auf die Sekunde brauche aber ist ja das selbe in grün.
Lediglich wenn man negative Werte hat muss man über die Berechnung gehen die MzKlMu oben beschrieben hat.
Ich werde die Funktion aber mal ausprobieren.
gruß sigma
Ich überarbeitete die Funktion:
Public Function Format(ByVal Expression As Variant, Optional ByVal FormatString As Variant, _
Optional ByVal FirstDayOfWeek As VbDayOfWeek = vbSunday, _
Optional ByVal FirstWeekOfYear As VbFirstWeekOfYear = vbFirstJan1) As String
Dim Hours As Long
If IsDate(Expression) Then
If InStr(1, FormatString, "[h", vbTextCompare) > 0 Then
Hours = Fix(Round(CDate(Expression) * 24, 1))
If Hours < 24 Then
FormatString = Replace(FormatString, "[hh]", "hh", , , vbTextCompare)
FormatString = Replace(FormatString, "[h]", "h", , , vbTextCompare)
Else
FormatString = Replace(FormatString, "[hh]", CStr(Hours), , , vbTextCompare)
FormatString = Replace(FormatString, "[h]", CStr(Hours), , , vbTextCompare)
End If
End If
End If
Format = VBA.Format$(Expression, FormatString, FirstDayOfWeek, FirstWeekOfYear)
End Function
Die Tests dazu:
'AccUnit:Row(#1/1/2000 15:30:45#, "hh:nn:ss", "15:30:45")
'AccUnit:Row(#1/1/2000 15:30:45#, "dd.mm.yyyy hh:nn:ss", "01.01.2000 15:30:45")
'AccUnit:Row(#12/31/1899 01:30:45#, "hh:nn:ss", "01:30:45")
'AccUnit:Row(#12/31/1899 01:30:45#, "[h]:nn:ss", "25:30:45")
'AccUnit:Row(#1/1/1900 01:30:45#, "[H]:nn:ss", "49:30:45")
'AccUnit:Row(#12/30/1899 15:30:45#, "[H]:nn:ss", "15:30:45")
'AccUnit:Row(#12/30/1899 01:30:45#, "[h]:nn:ss", "1:30:45")
'AccUnit:Row(#12/30/1899 10:30:45#, "[hh]:nn:ss", "10:30:45")
'AccUnit:Row(#12/30/1899 01:30:45#, "[hh]:nn:ss", "01:30:45")
Public Sub Format_DateTime_FormattedDateTime(ByVal Expression As Variant, ByVal FormatString As Variant, ByVal Expected As String)
Dim Actual As String
Actual = Format(Expression, FormatString)
Assert.AreEqual Expected, Actual
End Sub
mfg
Josef