Tipp:Uhrzeiten schneller ohne Doppelpunkt eingeben

Hallo Interessierte,
durch eine Anfrage hier habe ich nachfolgenden Code entwickelt.
Im Code steht was er macht und auch wie ihn Vba-Laien benutzen/einbauen können.
Gruß
Reinhard

Option Explicit
'
Private Sub Worksheet\_Change(ByVal Target As Excel.Range)
' Programm erleichert die Eingabe von Uhrzeiten. Als Trennzeichen zwischen Stunde(n) und Minute(n)
' ist zusätzlich zum Doppelpunkt auch das Komma erlaubt was speziell die Eingabe über
' den numerischen Tastenblock rechts auf der Tastatur beschleunigt da man die Shifttaste
' nicht mehr braucht.
' Bei Eingabe von Zeiten mit keinem Wert für die Minuten, reicht es den Stundenwert einzugeben, den
' Doppelpunkt braucht man dann nicht mehr dahinterzusetzen.
' Das Programm geht davon aus daß die Spalte für die Zeiteneingabe das Format [hh]:mm hat
' Der Code gehört in das Klassen/Dokument-Modul des jeweiligen Blattes.
' (Alt+F11, Doppelklick auf den Blattnamen links)
' Sind mehrere Spalten zur Zeiteneingabe vorgesehen so ist die Codezeile:
' "If Target.Column 6 Then Exit Sub" anzupassen, z.B. so:
' "If Target.Column 6 And Target.Column 9 And Target.Column 12 Then Exit Sub"
' Die Variable "Nein" muß im Deklarationsteil eines Standardmoduls, z.B. "Modul1" mittels
' Public Nein As Boolean
' deklariert sein.
' Entwickelt auf XL97, XL2002, 2008 by Reinhard
'
On Error GoTo Fehler
If Target.Column 6 Then Exit Sub
If Nein = True Then Exit Sub
If Target.Cells.Count 1 Then Exit Sub
Nein = True
If InStr(Target.Text, ":") \> 0 And InStr(Target.Value, ",") = 0 Then Target.Value = Target.Value & ":"
If Day(Target.Value) 30 Then Target.Value = Application.WorksheetFunction.Substitute(Target.Value, ",", ":")
Nein = False
Fehler:
Nein = False
End Sub

Hallo Reinhard,

Der Code ist soeben in den FAQs gelandet. Da ist er meiner Meinung nach auch nicht schlecht aufgehoben.

Gruß Alex

Der Code ist soeben in den FAQs gelandet. Da ist er meiner
Meinung nach auch nicht schlecht aufgehoben.

Danke dir Alex,

leider ist da wohl noch ein Bug drin bei Eingabe von Zeiten wie 0,01.
Siehe dazu auch nachfolgende Tabelle.
Muss ich noch korrigieren.
Gruß
Reinhard

Tabelle:
F:\[ZeitEingebenTextbox.xls]!Tabelle2
 │ E │ F │ 
───┼──────┼───────┤
 1 │ 7 │ 07:00 │ 
 2 │ 7, │ 07:00 │ 
 3 │ 7,2 │ 07:02 │ 
 4 │ 7,12 │ 07:12 │ 
 5 │ 7: │ 07:00 │ 
 6 │ 7:2 │ 07:02 │ 
 7 │ 7:12 │ 07:12 │ 
 8 │ 8,30 │ 08:03 │ 
 9 │ 8,3 │ 08:03 │ 
10 │ 8,4 │ 08:04 │ 
11 │ 8,40 │ 08:04 │ 
12 │ 0,35 │ 08:24 │ \*\*\*
13 │ 0,2 │ 04:48 │ \*\*\* 
14 │ 1,30 │ 01:03 │ 
15 │ 0,59 │ 14:09 │ \*\*\*
16 │ 1,59 │ 01:59 │ 
17 │ 0,00 │ 00:00 │ 
18 │ 0,01 │ 00:14 │ \*\*\*
19 │ ,7 │ 16:48 │ \*\*\*
20 │ ,1 │ 02:24 │ \*\*\*
21 │ ,01 │ 00:14 │ \*\*\*
22 │ ,0 │ 00:00 │ 
───┴──────┴───────┘

Tabellendarstellung erreicht mit dem Code in FAQ:2363

Hallo Reinhard,

leider ist da wohl noch ein Bug drin bei Eingabe von Zeiten
wie 0,01.
Siehe dazu auch nachfolgende Tabelle.

Wenn ich die Tabelle richtig lese, glaube ich, dass da noch ein weiterer Fehler drin ist.
In Zeile 8 z. B. hast du 8,3 eingegeben. Daraus werden 8h und 3min. Soweit ist alles in Ordnung.
In Zeile 9 hast Du 8,30 eingegeben. Daraus werden ebenfalls 8h und 3 min. Müsste hier nicht 8h und 30 min eingetragen werden.
Rein mathematisch ist 8,3 und 8,30 natürlich das gleiche. Aber die Zahl hinter dem Komma sollte doch die Anzahl der Minuten sein, oder habe ich einen Denkfehler?

Viele Grüße
shooty

Tabelle:
F:[ZeitEingebenTextbox.xls]!Tabelle2
│ E │ F │
───┼──────┼───────┤
1 │ 7 │ 07:00 │
2 │ 7, │ 07:00 │
3 │ 7,2 │ 07:02 │
4 │ 7,12 │ 07:12 │
5 │ 7: │ 07:00 │
6 │ 7:2 │ 07:02 │
7 │ 7:12 │ 07:12 │
8 │ 8,30 │ 08:03 │
9 │ 8,3 │ 08:03 │
10 │ 8,4 │ 08:04 │
11 │ 8,40 │ 08:04 │
12 │ 0,35 │ 08:24 │ ***
13 │ 0,2 │ 04:48 │ ***
14 │ 1,30 │ 01:03 │
15 │ 0,59 │ 14:09 │ ***
16 │ 1,59 │ 01:59 │
17 │ 0,00 │ 00:00 │
18 │ 0,01 │ 00:14 │ ***
19 │ ,7 │ 16:48 │ ***
20 │ ,1 │ 02:24 │ ***
21 │ ,01 │ 00:14 │ ***
22 │ ,0 │ 00:00 │
───┴──────┴───────┘

Tabellendarstellung erreicht mit dem Code in FAQ:2363

In Zeile 8 z. B. hast du 8,3 eingegeben. Daraus werden 8h und
3min. Soweit ist alles in Ordnung.
In Zeile 9 hast Du 8,30 eingegeben. Daraus werden ebenfalls 8h
und 3 min. Müsste hier nicht 8h und 30 min eingetragen
werden.
Rein mathematisch ist 8,3 und 8,30 natürlich das gleiche. Aber
die Zahl hinter dem Komma sollte doch die Anzahl der Minuten
sein, oder habe ich einen Denkfehler?

Hallo shooty,
nein, hast du nicht. 8,30 sollte 08:30 ergeben, bei 8,3 möchte man manchmal 08:03, manchmal 08:30 als Ergebnis.

Ich habe meinen Code abgeändert. Schlechte Nachricht, er funktioniert nur wenn die Eingabespalte als Text formatiert ist. Gute Nachricht, mit den angezeigten Werten kann man weiterrechnen also ob es als [hh]:mm formatiert gewesen wäre :smile:

Der Code ist nachfolgend, hier erstmal die Testtabelle:
„A“ = aus 8,4 wird 08:40
„B“ = aus 8,4 wird 08:04
Dazu im Code die Variable "Variante dementsprechend setzen.
Man sieht in B was eingegeben wurde und in C und D was daraus gemacht wurde, jenachdem ob „A“ oder „B“ gewählt wurde. In E und F sieht man daß man mit C und D rechnen kann.

Tabelle:
F:\[ZeitEingebenTextbox.xls]!Tabelle3
 │ A │ B │ C │ D │ E │ F │ 
───┼───────┼─────────┼───────┼───────┼───────┼───────┤
 1 │ 24:00 │ Eingabe │ "A" │ "B" │ A1-Cx │ A1-Dx │ 
 2 │ │ 7 │ 07:00 │ 07:00 │ 17:00 │ 17:00 │ 
 3 │ │ 7, │ 07:00 │ 07:00 │ 17:00 │ 17:00 │ 
 4 │ │ 7,2 │ 07:20 │ 07:02 │ 16:40 │ 16:58 │ 
 5 │ │ 7,12 │ 07:12 │ 07:12 │ 16:48 │ 16:48 │ 
 6 │ │ 7: │ 07:00 │ 07:00 │ 17:00 │ 17:00 │ 
 7 │ │ 7:2 │ 07:20 │ 07:02 │ 16:40 │ 16:58 │ 
 8 │ │ 7:12 │ 07:12 │ 07:12 │ 16:48 │ 16:48 │ 
 9 │ │ 8,5 │ 08:50 │ 08:05 │ 15:10 │ 15:55 │ 
10 │ │ ,1 │ 00:10 │ 00:01 │ 23:50 │ 23:59 │ 
11 │ │ ,10 │ 00:10 │ 00:10 │ 23:50 │ 23:50 │ 
12 │ │ ,5 │ 00:50 │ 00:05 │ 23:10 │ 23:55 │ 
13 │ │ 23,59 │ 23:59 │ 23:59 │ 00:01 │ 00:01 │ 
14 │ │ 0 │ 00:00 │ 00:00 │ 24:00 │ 24:00 │ 
15 │ │ 0,59 │ 00:59 │ 00:59 │ 23:01 │ 23:01 │ 
16 │ │ ,59 │ 00:59 │ 00:59 │ 23:01 │ 23:01 │ 
17 │ │ ,67 │ 00:67 │ 00:67 │ 22:53 │ 22:53 │ 
───┴───────┴─────────┴───────┴───────┴───────┴───────┘
Benutzte Formeln:
E2 : =$A$1-C2
usw.

F2 : =$A$1-D2
usw.

Tabellendarstellung erreicht mit dem Code in FAQ:2363

Gruß
Reinhard

Option Explicit
'
Private Sub Worksheet\_Change(ByVal Target As Excel.Range)
' Programm erleichert die Eingabe von Uhrzeiten. Als Trennzeichen zwischen Stunde(n) und Minute(n)
' ist zusätzlich zum Doppelpunkt auch das Komma erlaubt was speziell die Eingabe über
' den numerischen Tastenblock rechts auf der Tastatur beschleunigt da man die Shifttaste
' nicht mehr braucht.
' Bei Eingabe von Zeiten mit keinem Wert für die Minuten, reicht es den Stundenwert einzugeben, den
' Doppelpunkt braucht man dann nicht mehr dahinterzusetzen.
' Das Programm geht davon aus daß die Spalte für die Zeiteneingabe das Format "Text" hat.
' Nach Programmdurchlauf erscheint die Uhrzeit im Format "hh:mm"
' Der Code gehört in das Klassen/Dokument-Modul des jeweiligen Blattes.
' (Alt+F11, Doppelklick auf den Blattnamen links)
' Das Programm reagiert selbsständig auf Eigaben in den frei wählbaren zu überwachenden
' Spalten. Eingaben in andere Spalten bleiben vom Programm unberührt.
' Entwickelt auf XL97, 2008 by Reinhard
'
'Const Variante As String = "A" ' "A" = aus 8,4 wird 08:40
Const Variante As String = "B" ' "B" = aus 8,4 wird 08:04
Dim T As String
If Target.Column 3 And Target.Column 4 Then Exit Sub
If Target.Cells.Count 1 Then Exit Sub
T = Target.Value
If Fehler(T) Then
 Target.Select
 Exit Sub
End If
If InStr(T, ",") 0 Then T = Application.WorksheetFunction.Substitute(T, ",", ":")
If InStr(T, ":") = 0 Then T = T & ":"
T = Mid("00", InStr(T, ":")) & T
If Variante = "A" Then T = Left(T & "00", 5)
If Variante = "B" Then T = Left(T, 3) & Right("00" & Mid(T, InStr(T, ":") + 1), 2)
Application.EnableEvents = False
Target.Value = T
Application.EnableEvents = True
End Sub
'
Function Fehler(ByVal T As String) As Boolean
Dim N As Integer, D As Integer, K As Integer, T1 As String, T2 As String
For N = 1 To Len(T)
 Select Case Asc(Mid(T, N, 1))
 Case 48 To 57
 'okay
 Case 44, 58
 D = D + 1 - (N \> 3)
 Case Else
 Fehler = True
 End Select
Next N
If D \> 1 Then Fehler = True
If Fehler = False Then
 T1 = T
 If InStr(T, ":") Then
 T1 = Left(T, InStr(T, ":") - 1)
 T2 = Mid(T, InStr(T, ":") + 1)
 End If
 If InStr(T, ",") Then
 T1 = Left(T, InStr(T, ",") - 1)
 T2 = Mid(T, InStr(T, ",") + 1)
 End If
 If Len(T1) \> 2 Or Len(T2) \> 2 Then Fehler = True
End If
If Fehler = True Then MsgBox "Fehlerhafte Eingabe"
End Function