VBA Tipp: Wettkampfzeiten

Aus DBWiki
Wechseln zu: Navigation, Suche

Problem

Ich möchte Wettkampfzeiten auf Hundertstelsekunden genau erfassen und in der Datenbank verwalten.

Lösung

Dafür eignet sich das eingebaute Datum-/Zeitformat nicht, da es nur sekundengenau ist.

Wenn man intern in Hundertstelsekunden rechnet und die Zeiten in einer Long-Integer-Variablen ablegt, geht der Wertebereich bis zu 248 Tage, was für die meisten sportlichen Wettkämpfe wohl ausreichen dürfte ;-)

Die Formatierung muss man dann selber machen, für die Ausgabe ist das einfach:

Public Function HundertstelSekundenNachString(hs As Variant) As Variant
 
   'Qelle: http://www.dbwiki.net/
 
 
   Dim res As String
   Dim v   As Long
 
   If IsNull(hs) Then HundertstelSekundenNachString = Null: Exit Function
 
   v = CLng(hs)
   res = "," & Format$(v Mod 100, "00")
   v = v \ 100
   res = ":" & Format$(v Mod 60, "00") & res
   v = v \ 60
   res = ":" & Format$(v Mod 60, "00") & res
   v = v \ 60
   HundertstelSekundenNachString = Format$(v, "00") & res
 
End Function

In der umgekehrten Richtung wird es schwieriger:

Public Function StringNachHundertstelSekunden(ByVal s As Variant) As Variant
 
   'Qelle: http://www.dbwiki.net/
 
 
   Dim res As String
   Dim ch  As String
   Dim v   As Long
   Dim i   As Long
   Dim j   As Long
   Dim k   As Long
 
   If IsNull(s) Then: StringNachHundertstelSekunden = Null: Exit Function
 
   s = "00000000" & s
 
   For i = Len(s) To 1 Step -1
      ch = Mid$(s, i, 1)
      If ch >= "0" And ch <= "9" Then
         res = ch & res
         j = j + 1
         If j > 1 Then j = 0: k = k + 1 'Nächste Doppelziffer erreicht
      Else
         'Trennzeichen
         If j = 1 Then
            'Stellen auffüllen
            If ch = "," Then res = res & "0" Else res = "0" & res
            j = 0: k = k + 1
         End If
      End If
      If k = 4 Then Exit For
   Next
 
   'da freut sich Mr. Horner:
   StringNachHundertstelSekunden = ((CLng(Mid$(res, 1, 2)) * 60 _
                                   + CLng(Mid$(res, 3, 2))) * 60 _
                                   + CLng(Mid$(res, 5, 2))) * 100 + _
                                     CLng(Mid$(res, 7, 2))
End Function
Wiki hinweis.png

Tipp:

Zusätzlich kann man in Eingabefeldern noch mit dem KeyPress-Ereignis herumexperimentieren bzw. versuchen, ein geeignetes Eingabeformat zu definieren.


Wikilinks

Sexagesimale Berechnungen