Hallo liebe Accessspezialisten!
In diesem Forum konnte ich bereits viele Tricks und Hilfestellungen erhalten. Nachdem ich bereits viel Zeit in der Suche und ausprobieren verbracht habe möchte ich mein Anliegen hier einbringen:
Ich habe eine Datenbank erstellt, wo ich mit Laufzeiten aus der Zeitnehmung rechnen möchte. Aus der Zeitnehmung erhalte ich einen String mit folgender Zeichenfolge: 1:12,98 (1 Minute, 12 Sekunden, 98 Hunderstel). Wie kann ich im VBA diesen String so aufteilen, dass ich die Zeiten addieren kann?
Vielen Dank schon mal im voraus für Eure Unterstützung.
lg quini
Du kannst die Zeitangabe in Hundertstel konvertieren, dann damit Rechnen und anschließend zurück konvertieren.
Guten Morgen! Vielen Dank für die schnelle Antwort. Zur Sicherheit: Habe ich das so richtig gerechnet?
String aus Zeitnehmung Umgewandelte Zeit
hh mm ss hh hh mm ss hh Zeitsumme
0 1 12 98 0 6000 1200 98 7298
0 0 47 12 0 0 4700 12 4712
lg quini
Hallo,
Windows enthält auch einen Taschenrechner (calc), der mit Umrechnungen umgehen kann. Damit kannst du das selber überprüfen. Wenn du anstatt mit hundertstel Sekunden gleich Millisekunden verwendest, würdest du eine gängigere Maßeinheit verwenden und könntest diese auch als Zahl abspeichern und nur für die Anzeige in eine lesbare Form konvertieren.
Gruß
Knobbi38
nachfolgende Funktion ermittelt die Hundertstel Sekunden als Long:
Function Zeitstring_Umwandlung(Zeit_String As String)
Dim str_Minute As String
Dim str_Sekunde As String
Dim str_Hund_Sekunde As String
str_Minute = Val(Zeit_String)
str_Sekunde = Val(Mid(Zeit_String, Len(str_Minute) + 2))
str_Hund_Sekunde = Val(Mid(Zeit_String, Len(str_Minute) + 1 + Len(str_Sekunde) + 2))
Zeitstring_Umwandlung = str_Minute * 6000 + str_Sekunde * 100 + str_Hund_Sekunde
End FunctionZu Deiner Vorgabe 1:12,98 liefert die Funktion dann 7298, also 7298 Hundertstel Sekunden.
Du kannst ja ggf. das Funktionsergebnis wieder durch 100 teilen, um Sekunden mit Nachkommastellen zu bekommen.
Hallo Werner!
Herzlichen Dank! Habe die Daten rechenbar nun vorliegen und kann sie addieren. Ich bin jetzt nur noch am hirnen, wie ich die Zahl in das lesbare Zeitformat 00:00:00,00 zurückbringe. Bin in der Internetsuche noch nicht fündig geworden. Hast Du für mich hier noch einen Ablauf?
LG quini
Function Zeitstring_Umw_Dat_Format(Zeit_String As String)
Dim str_Minute As String
Dim str_Sekunde As String
Dim str_Hund_Sekunde As String
str_Minute = Val(Zeit_String)
str_Sekunde = Val(Mid(Zeit_String, Len(str_Minute) + 2))
str_Hund_Sekunde = Val(Mid(Zeit_String, Len(str_Minute) + 1 + Len(str_Sekunde) + 2))
Zeitstring_Umw_Dat_Format = "00:" & str_Minute & ":" & str_Sekunde & "," & str_Hund_Sekunde
End Function
liefert bei der Vorgabe "1:12,98" den Rückgabewert 00:01:12,98
Aber Achtung: ab dem Komma ist das kein Datumsformat, mit dem man noch rechnen kann.
Für Textfelder mit rein dokumentarischem Charakter in Abfragen, Formularen oder Berichten könnte man diesen Rückgabewert aber verwenden.
Hallo quini,
ist jetzt nicht dein ernst, oder? Internetsuche anstatt selber mal ein bißchen Rechnen mit den Grundrechenarten?
Wo haperst es denn?
Rechnen ist kein Problem. Nur wenn ich das bei über 100 Teilnehmern mache, wird es bis zur Preisverteilung dauern. Im Excel geht das ja gut, aber Access ist hier etwas anders und ein wenig VBA-Kenntnisse habe ich durch Eigenstudium erlernt Übrigens: Bevor ich frage suche ich schon im Internet. Eventuell habe ich die Suchfrage falsch gestellt.
Der letzte Weg ist das Forum, dachte dass ich da Hilfe bekomme. Für Werner war die Antwort kein Problem.
Hallo Werner!
Vielen Dank für deine Hilfe. Ja, es geht hier nur um die Darstellung für die Ergebnisliste. Rechnen tue ich vorher mit den Millisekunden.
lg quini
Hallo Quini,
es geht hier nicht um das Suchen, selber machen ist gefragt und VBA und die Grundrechenarten sind mit Excel wohl identisch.
Wenn du nun also weißt, wie die Zeit von einem String in eine Zahl mit Hundertstel Sekunden konvertiert wird, sollte die Umkehrung der Rechenarten jetzt nicht mehr das Problem sein. Wie würdest du das denn auf dem Papier manuell machen?
Wo bleibt das Erfolgserlebnis, wenn du es zumindest nicht mal versuchst. Auch wenn es nicht elegant sein sollte, bei der Hilfe zum optimieren stehen die Helfer sicherlich gerne bereit.
Grüße
Knobbi38
Hallo Werner,
Zitatermittelt die Hundertstel Sekunden als Long:
Das ist m.E. nicht richtig.
Da du den Rückgabewert nicht typisiert hast, wird ein Variant zurück
gegeben. Kann natürlich nützlich sein, falls NULL-Werte vorkommen
können, ansonsten
Function Zeitstring_Umwandlung(Zeit_String As String) As Longbzw.
Function Zeitstring_Umw_Dat_Format(Zeit_String As String) As Stringgruss ekkehard
@ Ekkehard,
Stimmt, wo Du recht hast, da haste recht. ;)
mal getestet:
ohne Typisierung des Rückgabewertes:
debug.print vartype(Zeitstring_Umwandlung("1:12,98")) liefert 3 ( = vblong)
debug.print vartype(Zeitstring_Umwandlung("XYZ")) liefert 5 ( = vbDouble)
debug.print vartype(Function Zeitstring_Umwandlung(null)) --> Fehlermeldung "unzulässige Verwendung von Null"
mit Typisierung des Rückgabewertes (as long):
debug.print vartype(Zeitstring_Umwandlung("1:12,98")) liefert 3 ( = vblong)
debug.print vartype(Zeitstring_Umwandlung("XYZ")) liefert 3 ( = vblong)
debug.print vartype(Function Zeitstring_Umwandlung(null)) --> Fehlermeldung "unzulässige Verwendung von Null"
Hallo miteiander!
Vorerst meinen herzlichen Dank an alle, die mir weiterhelfen. Da ich nur ein Hobbyprogrammierer in Access bin, bin ich jetzt komplett ausgestiegen - kurz gesagt ich habe die Rückrechnung in VBA nicht kapiert - Sorry.
Ich lasse das mal so stehen und ich werde nach dem Rennen die errechneten Millisekunden händisch je Teilnehmer ausrechnen.
lg quini
Hallo,
vielleicht wird das ja mal öfter gebraucht. Deshalb hier eine kleine Beispieldatenbank mit entsprechenden Konvertierungsroutinen, die auch in SQL verwendet werden können. Um das etwas spannender zu machen, kann bei der Konvertierungsroutine per Index angegeben werden, welche Teilkomponente zurückgegeben werden soll.
Gruß
Knobbi38
Moin Knobbi38,
ich habe Dein Baby mal getestet.
Bei Quinis Vorgabe 1:12,98 aus #1 gibt es folgende LZ-Fehlermeldung, siehe Screenshot.
Ich habe #1 so verstanden, dass er diesen exotischen String aus einer externen Zeitmessung so importieren "muss".
In Deiner Tabelle tblTimeValue haben die Einträge in Feld TimeString noch ein 00: vorne vor : 00:01:12,98
gelöscht!
Hallo Werner,
du hältst dich nicht an das Eingabeformat "hh:mm:ss[,.]nn", deshalb der Fehler. In der Beispieltabelle haben alle Stringtime-Werte das richtige Format und deshalb funktioniert die Query.
So ein Fehler wird normalerweise nicht in der Funktion abgefangen, da ich davon ausgehen kann, daß in der DB alle Stringtime-Werte immmer im richtigen Format vorliegen, denn diese Werte müssten eigentlich bei der Erfassung validiert werden, bevor sie in die Tabelle gelangen.
Gruß
Ulrich
Aber Quini bekommt nun mal die Daten importiert im Format m:ss,00 (00: Hundertstel).
Siehe sein Muster in #1 : 1:12,98.
Siehe auch mein Vorspanntext in #16
@werner budde ZitatAber Quini bekommt nun mal die Daten importiert im Format m:ss,00 (00: Hundertstel).
Das mag ja sein, aber dann kann er nach oder während des Imports die Daten normalisieren. Wenn die Daten grundsätzlich ohne Stundenanteil sind, kann er dieses ganz einfach durch das Anfügen eines Präfixes "00:" machen. Da ":" als Trennzeichen erkannt wird, ist es egal, ob die einzelnen Werte 1 oder 2 stellig sind. Mit dem Index 6 könnte er dann den normalisierten Wert auch zurückschreiben.
Das Problem betrifft aber ja eigentlich nur den Import, weil nur die CS Werte als Long gespeichert werden.
Gruß
Ulrich
Nachtrag:
Eine Validierung geht relativ einfach mit regulären Ausdrücken. Hier mal eine schöne Zusammenstellung verschiedener Möglichkeiten:
https://stackoverflow.com/questions/7536755/regular-expression-for-matching-hhmm-time-format (https://stackoverflow.com/questions/7536755/regular-expression-for-matching-hhmm-time-format)
Guten Morgen!
Vielen, vielen Dank als alle Mithelfer. Ich werde das nun in Ruhe ausprobieren, da ich jetzt eine Rennpause von zwei Wochen habe.
Allen einen erholsamen Sonntag
quini