Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Uhrzeit in Textbox mit Drehfeld

Forumthread: Uhrzeit in Textbox mit Drehfeld

Uhrzeit in Textbox mit Drehfeld
25.10.2012 12:08:08
Jürgen
Servus Zusammen,
ich tüftel jetzt schon den ganzen Tag an dem Problem. Ich möchte in einem, Userform in einer Textbox die Uhrzeit einblenden und diese minutengenau mit einem Drehfeld (Spinbutton) ändern können. Ich komme hier nicht weiter!
Das einzige was ich beim suchen und googeln gefunden habe ist der folgende Code:
Private Sub SpinButton1_Change()
Dim t As Date
t = CDate(Me.SpinButton1 / 48)
Me.TextBox1 = Format(t, "short time")
End Sub
Private Sub TextBox1_Change()
Dim tim As Date
tim = CDate(Me.TextBox1)
Me.SpinButton1 = Int(CDbl(tim) * 48 + 0.5)
End Sub
Private Sub UserForm_Initialize()
Me.TextBox1 = Format(Int(Now * 48 + 0.5) / 48, "short Time")
End Sub
Aber ich verstehe nicht was in diesen Zeilen passiert
Format(Int(Now * 48 + 0.5) / 48, "short Time")
Me.SpinButton1 = Int(CDbl(tim) * 48 + 0.5)
t = CDate(Me.SpinButton1 / 48)
Den Befehl Format in Verbindung mit Short Time versteh ich. Was aber hinter Int passiert und für was Int hier angewendet wird, ist mir schleierhaft. Ich versuche dies Sachen eigentlich immer selbst herauszufinden. Das Int die nächste Ganzzahl angibt ist mir klar, aber warum hier? Ich dreh mich echt im Kreis.
Ich hoffe es kann mir einer von Euch helfen.
Vorab besten Dank.
Viele Grüße

Anzeige

5
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Uhrzeit in Textbox mit Drehfeld
25.10.2012 13:15:54
Rudi
Hallo,
das ist eine klassische Rundungsfunktion. In diesem Fall auf die nächste halbe Stunde.
Spinbuttons können ja nur Ganzzahlen enthalten.
Dim blnInit As Boolean
Private Sub SpinButton1_Change()
Dim t As Date
If Not blnInit Then
blnInit = True
t = CDate(Me.SpinButton1 / 1440)
Me.TextBox1 = Format(t, "short time")
blnInit = False
End If
End Sub
Private Sub TextBox1_afterupdate()
Dim tim As Date
If Not blnInit Then
blnInit = True
tim = CDate(Me.TextBox1)
Me.SpinButton1 = Int(CDbl(tim) * 1440 + 0.5)
blnInit = False
End If
End Sub
Private Sub UserForm_Initialize()
blnInit = True
Me.TextBox1 = Format(Int(Time * 1440 + 0.5) / 1440, "short time")
blnInit = False
End Sub
Gruß
Rudi

Anzeige
AW: Uhrzeit in Textbox mit Drehfeld
25.10.2012 14:22:32
Jürgen
Hallo Rudi,
danke für deine Hilfe. Ja, das mit den Ganzzahlen habe ich mir schon gedacht, aber wie kommst du auf die 1440? Jetzt bin ich total verwirrt. Und für was ist der Boolean Wert?
In dem Code bringt mir Excel hier einen Fehler:
Private Sub TextBox1_afterupdate()
Dim tim As Date
If Not blnInit Then
blnInit = True
tim = CDate(Me.TextBox1)
---->>> Me.SpinButton1 = Int(CDbl(tim) * 1440 + 0.5)
Fehlermeldung:
Laufzeit 380 -> Eingenschaft Value konnte nicht gesetzt werden. Ungültiger Eingneschaftswert.

Anzeige
AW: Uhrzeit in Textbox mit Drehfeld
25.10.2012 14:54:38
Jürgen
Hallo,
also warum 1.440 habe ich rausbekommen! Das sind die Minuten pro 24 Stunden. Wenn ich also Minuten genau rechnen will, dann muss ich die Ganzzahl mit 1440 multiplizieren bzw. dividieren.
Den Rest schau ich mir noch an.
Vielleicht kann mir jemand auf die Sprünge helfen.
Danke!

Anzeige
AW: Uhrzeit in Textbox mit Drehfeld
25.10.2012 15:01:09
Rudi
Hallo,
der Max-Wert deines Spinbuttons ist zu klein, deshalb der Fehler.
Private Sub UserForm_Initialize()
blnInit = True
Me.TextBox1 = Format(Int(Time * 1440 + 0.5) / 1440, "short time")
SpinButton1.Max=1440
blnInit = False
End Sub

Warum 1440? Ganz einfach: Eine Minute = 1/1440 Tag.
blnInit: Sonst rufen sich die Ereignisprozeduren gegenseitig auf.
Textbox1.Text= ... im Initialize bewirkt Textbox1_AfterUpdate, die wiederum durch SpinButton1= ... Spinbutton1_Change, die durch TextBox1=... Textbox1_afterupdate etc.
Gruß
Rudi

Anzeige
Erledigt. Fehler selbst herausgefunden
25.10.2012 15:24:33
Jürgen
Hallo Rudi,
danke für die Info. Warum der Fehler kommt, konnte ich auch herausfinden. Anscheinend hinterlegt Excel beim fehlen der Min/Max Definition für den Spinbutton irgendwelche Werte. Wenn ich als SpinButton.Min als 1 und SpinButton.Max mit 99999999 festlege, dann geht alles.
Danke nochmal!
Anzeige
;
Anzeige
Anzeige

Infobox / Tutorial

Uhrzeit in Textbox mit Drehfeld anpassen


Schritt-für-Schritt-Anleitung

  1. UserForm erstellen: Öffne Excel und erstelle eine UserForm. Füge eine TextBox (TextBox1) und einen SpinButton (SpinButton1) hinzu.

  2. Code einfügen: Füge den folgenden VBA-Code in das Code-Fenster der UserForm ein:

    Dim blnInit As Boolean
    
    Private Sub SpinButton1_Change()
       Dim t As Date
       If Not blnInit Then
           blnInit = True
           t = CDate(Me.SpinButton1 / 1440)
           Me.TextBox1 = Format(t, "short time")
           blnInit = False
       End If
    End Sub
    
    Private Sub TextBox1_AfterUpdate()
       Dim tim As Date
       If Not blnInit Then
           blnInit = True
           tim = CDate(Me.TextBox1)
           Me.SpinButton1 = Int(CDbl(tim) * 1440 + 0.5)
           blnInit = False
       End If
    End Sub
    
    Private Sub UserForm_Initialize()
       blnInit = True
       Me.TextBox1 = Format(Int(Time * 1440 + 0.5) / 1440, "short time")
       SpinButton1.Max = 1440
       blnInit = False
    End Sub
  3. Min/Max Werte setzen: Stelle sicher, dass die Min- und Max-Werte des SpinButtons korrekt gesetzt sind. Zum Beispiel:

    SpinButton1.Min = 1
    SpinButton1.Max = 1440
  4. Testen: Starte die UserForm und teste das Drehfeld. Du kannst die Uhrzeit minutengenau ändern und sehen, wie sie in der TextBox aktualisiert wird.


Häufige Fehler und Lösungen

  • Laufzeitfehler 380: Dieser Fehler tritt auf, wenn der Wert des SpinButtons ungültig ist. Stelle sicher, dass die Min- und Max-Werte des SpinButtons korrekt eingestellt sind (siehe obigen Schritt).

  • Falsches Format: Wenn die Uhrzeit nicht korrekt angezeigt wird, überprüfe den Format-Befehl. Der richtige Befehl für die Uhrzeit ist Format(t, "short time").


Alternative Methoden

Falls Du das Drehfeld in eine andere Richtung ändern möchtest, kannst Du die Drehfeldrichtung anpassen:

  1. Füge einen weiteren SpinButton hinzu und ändere die Richtung mit folgendem Befehl:

    SpinButton2.Orientation = fmOrientationVertical
  2. Implementiere einen ähnlichen Code wie für SpinButton1, aber passe die Logik an, um die Ereignisse zu verknüpfen.


Praktische Beispiele

  • Beispiel zur Uhrzeitanzeige: Du kannst die Uhrzeit in verschiedenen Formaten anzeigen lassen:

    Me.TextBox1 = Format(t, "hh:mm AM/PM")  ' 12-Stunden Format
    Me.TextBox1 = Format(t, "HH:mm")         ' 24-Stunden Format
  • Drehfeld zur Auswahl von Stunden: Du kannst das Drehfeld so einstellen, dass es nur Stunden auswählt, indem Du die Max-Werte anpasst.


Tipps für Profis

  • Optimierung der Performance: Nutze den blnInit Boolean, um wiederholte Aufrufe der Event-Handler zu vermeiden, was die Performance deiner UserForm verbessert.

  • Benutzerdefinierte Formate: Experimentiere mit verschiedenen Formatierungen in der TextBox, um die Anzeige nach deinen Wünschen anzupassen.


FAQ: Häufige Fragen

1. Warum muss ich die 1440 verwenden?
1440 steht für die Anzahl der Minuten in 24 Stunden. Um minutengenaue Werte zu berechnen, ist dies notwendig.

2. Was ist der Zweck des blnInit Boolean?
Der blnInit Boolean verhindert, dass die Event-Handler sich gegenseitig aufrufen, was zu endlosen Schleifen und Abstürzen führen kann.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige