Microsoft Excel

Herbers Excel/VBA-Archiv

Informationen und Beispiele zum Thema CheckBox
BildScreenshot zu CheckBox CheckBox-Seite mit Beispielarbeitsmappe aufrufen
Informationen und Beispiele zum Thema MsgBox
BildScreenshot zu MsgBox MsgBox-Seite mit Beispielarbeitsmappe aufrufen
Informationen und Beispiele zum Thema Userform
BildScreenshot zu Userform Userform-Seite mit Beispielarbeitsmappe aufrufen
Informationen und Beispiele zum Thema Label
BildScreenshot zu Label Label-Seite mit Beispielarbeitsmappe aufrufen

Arbeitszeittabelle mit Userform

Betrifft: Arbeitszeittabelle mit Userform von: hans
Geschrieben am: 06.10.2020 16:17:16

Hallo,
möchte über 2 Userformen durch eine meine Startzeit und die andere meine Endzeit eintragen lassen.
Die erste Schaltfläche soll das heutige Datum in Spalte B und die Startzeit in Spalte C eintragen. Die zweite Schaltfläche in Spalte D die Endzeit.
Jedes Mal wenn ein Arbeitstag eingetragen ist soll in die nächste spalte gesprungen werden.
Meine Anfänge sehen so aus:

Sub Schaltfl?che1_Klicken()
Dim letzte As Long
With Worksheets("Tabelle1") 'Blattname anpassen
letzte = Application.Max(5, .Cells(Rows.Count, 2).End(xlUp).Rows + 1)
  .Cells(letzte, 2) = Date
  .Cells(letzte, 3) = Format(Time, "hh:mm:ss")
  .Cells(letzte, 4).Select
End With
End Sub

Sub Schaltfl?che2_Klicken()
Dim letzte As Long
With Worksheets("Tabelle1") 'Blattname anpassen
letzte = Application.Max(5, .Cells(Rows.Count, 2).End(xlUp).Rows + 1)
  .Cells(letzte, 4) = Format(Time, "hh:mm:ss")
  .Cells(letzte, 5).Select
End With
End Sub

Beim Probieren des Codes springt er in Zeile 44111.
Wie muß das Script aussehen das es funktionert?

Danke Gruß Hans

Betrifft: AW: Arbeitszeittabelle mit Userform
von: onur
Geschrieben am: 06.10.2020 17:16:08

Der Code springt immer in die erste freie Zeile.
Wenn du nicht bis Zeile 44111 Daten hast, hast du irgendwo in Spalte B (vermutlich in Zeile 44110) irgendwas in die Zelle geschrieben, vielleicht ein Leerzeichen oder so,

Betrifft: AW: Arbeitszeittabelle mit Userform
von: Yal
Geschrieben am: 07.10.2020 08:58:12

es gibt eine Unterschied zwischen Row und Rows:
Row ist die Zeilnummer der ersten Zeile vom ausgewählten Bereich
Rows ist eine Auflistung (Sammel-Objekt), woraus über Count den Anzahl von Zeilen im ausgewählten Bereich zu lesen ist.

Dementsprechend sollte
.Cells(Rows.Count, 2).End(xlUp).Rows + 1
ein Fehler liefern.

Richtig:
.Cells(Rows.Count, 2).End(xlUp).Row + 1

Alternativ zu "max":
letzte = .Cells(44110, 1).End(xlUp).Row + 1
If Letzte <= 5 Then letzte = 5
Vielleicht weniger schön, erlaubt aber ein leichteres Debugging.

Viel Erfolg
Yal

Betrifft: AW: Arbeitszeittabelle mit Userform
von: hans
Geschrieben am: 07.10.2020 11:49:05

Hallo,

hab die Tabelle mal hochgeladen. Denke die ist selbsterklärend.

Hier aber trotzdem nochmal kurz die "Soll-Funktion": Nach Eintrag von Datum und Uhrzeit früh soll für den nächsten Tag immer eine Zeile weitergesprungen werden.

Nach Eintrag der Uhrzeit abends soll in der gleichen Zeile wie früh die Uhrzeit eine Spalte weiter rechts eingetragen werden.

Habe mittlerweilen alle möglichen Varianten durch die mir einfielen. .Row uns .rows die startzeile und statt xlUp dann xltoRight. Mag alles nicht funktionieren.

hoffe ihr könnt mir helfen.

Gruß hans

https://www.herber.de/bbs/user/140715.xlsm

Betrifft: AW: Arbeitszeittabelle mit Userform
von: Yal
Geschrieben am: 07.10.2020 12:05:37

Sub Beginn_Klicken()
Dim W As Worksheet
Dim Z
    Set W = Worksheets("Tabelle1") 'Blattname anpassen
    Set Z = W.Range("A10000").End(xlUp)
    Z.Offset(1, 0) = "Tag " & (1 + Trim(Right(Z, 2)))
    Z.Offset(1, 1) = Format(Now, "dd.mm.yyyy")
    Z.Offset(1, 2) = Format(Now, "hh:mm:ss")
End Sub

Sub Ende_Klicken()
Dim W As Worksheet
Dim Z
    Set W = Worksheets("Tabelle1") 'Blattname anpassen
    Set Z = W.Range("A10000").End(xlUp)
    Z.Offset(0, 3) = Format(Time, "hh:mm:ss")
End Sub
die bisherigen "..." müsstest Du in Spalte A vorher entfernen.

VG Yal

Betrifft: AW: Arbeitszeittabelle mit Userform
von: Werner
Geschrieben am: 07.10.2020 12:23:35

Hallo,

hier deine Tabelle zurück.

Ich habe noch eine Fehlerbehandlung eingebaut, damit du dir nicht am gleichen Tag zweimal einen Arbeitsbeginn erfassen kannst.

Ebenso wird eine Fehlermeldung ausgegeben, wenn du einen Arbeitsbeginn erfassen willst, aber für den Vortag kein Arbeitsende erfasst wurde.

https://www.herber.de/bbs/user/140717.xlsm

Gruß Werner

Betrifft: AW: Arbeitszeittabelle mit Userform
von: hans
Geschrieben am: 07.10.2020 13:08:38

Vielen Dank Werner!!!

Perfekt!!!

Gruß
Hans

Betrifft: Gerne u. Danke für die Rückmeldung. o.w.T.
von: Werner
Geschrieben am: 07.10.2020 14:05:28



Betrifft: AW: Gerne u. Danke für die Rückmeldung. o.w.T.
von: hans
Geschrieben am: 09.10.2020 10:04:39

Hallo Werner,

die Tabelle funktioniert ja wie gesagt genau wie sie soll, jetzt hab ich mir überlegt für jeden Monat ein Tabellenblatt anzulegen. Dann trag ich ins Script den Monat ein und für den nächsten Monat geht logischerweise nicht mehr.
Kannst du mir da nochmal helfen bitte.

https://www.herber.de/bbs/user/140756.xlsm

Betrifft: AW: Gerne u. Danke für die Rückmeldung. o.w.T.
von: Werner
Geschrieben am: 09.10.2020 10:25:58

Hallo Hans,

dann brauchst du nur das With... End With zu entfernen und vor sämtlichen Range-Objekten den Punkt zu entfernen.
Dann bezieht sich der Code immer auf das Tabellenblatt, das aktuell aktiv ist.
Sub Schaltfläche1_Klicken()
Dim letzte As Long

letzte = Application.Max(5, Cells(Rows.Count, 2).End(xlUp).Row + 1)
If Cells(letzte - 1, 4) = "" Then
    MsgBox "Fehler: Am " & Cells(letzte - 1, 2) & " ist kein Arbeitsende erfasst."
    Exit Sub
End If
If Cells(5, 1) = "" Then
    Cells(letzte, 1) = "Tag 1"
Else
    Cells(letzte, 1) = "Tag " & CLng(Right(Cells(letzte - 1, 1), 2)) + 1
End If
Cells(letzte, 2) = Date
Cells(letzte, 3) = Format(Time, "hh:mm:ss")
Cells(letzte, 4).Select
End Sub

Sub Schaltfläche2_Klicken()
Dim letzte As Long

letzte = Application.Max(5, Cells(Rows.Count, 4).End(xlUp).Row + 1)
If Cells(letzte, 2) = "" Then
    MsgBox "Fehler: Für heute " & Date & " ist kein Arbeitsbeginn erfasst"
    Exit Sub
End If
Cells(letzte, 4) = Format(Time, "hh:mm:ss")
End Sub
Gruß Werner

Betrifft: Funzt Bombig... Danke!!! o.w.T.
von: hans
Geschrieben am: 09.10.2020 10:55:04



Betrifft: Gerne u. Danke für die Rückmeldung. o.w.T.
von: Werner
Geschrieben am: 09.10.2020 11:38:25