Zeiterfassung in Excel...?

... komplette Frage anzeigen

3 Antworten

Wenn ich die Infos aus den anderen Antworten und Kommentaren richtig verstehe, erfasst Du doch (manuell) in Excel einen Code. Eine UserForm würde die Steuerung nochmals erleichtern. Ich habe mir für das Beispiel einfach auf die Userform eine TextBox und einen Button gepackt. Man könnte bspw. noch ein Label dazunehmen, Änderungen der TextBox überwachen und noch vor Knopfdruck den Namen der Firma und des Mitarbeiters im Label anzeigen (aber eher Spielerei).

Zum nachstellen brauchst Du besagte UserForm mit Textbox1 und Button1
Ich habe drei Tabellenblätter:
1. Logbuch (hier wird jede Erfassung mit Zeit mitgeschrieben),
2. Firmen: Spalte A der Code (X1/1 etc.), Spalte B Name der Firma und Spalte C optional ein Mitarbeiter. Ich kenne an der Stelle die Logik der Codes nicht: Gibt es immer einen Mitarbeiter oder wären auch Eingaben X3 möglich? Dann müsste man zum Plausbilisieren noch etwas herumbasteln
3. Zutritte

Die Namen sind egal, das kannst Du im Code hinterlegen (Zeile 10-12)


Als Makro beim Betätigen des Buttons folgenden Code:

Private Sub CommandButton1_Click()
'logbuch schreiben
Dim wo_log As Long
Dim wo_zutritt As Long
Dim zutritt As Long
Dim logbuch As String
Dim zutritte As String
Dim firmen As String
' die drei folgenden Einträge in "" durch Deine Tabellennamen ersetzen
logbuch = "Logbuch"
zutritte = "Zutritte"
firmendaten = "Firmen"

wo_log = Sheets(logbuch).Cells(Rows.Count, 1).End(xlUp).Row + 1
Sheets(logbuch).Cells(wo_log, 1).Value = TextBox1.Value
Sheets(logbuch).Cells(wo_log, 2).Value = Now()
'ein- und ausfahrt prüfen
wo_zutritt = Sheets(zutritte).Cells(Rows.Count, 1).End(xlUp).Row + 1
If WorksheetFunction.CountIf(Sheets(zutritte).Range("A:A"), TextBox1.Value) = 0 Then
Sheets(zutritte).Cells(wo_zutritt, 1).Value = TextBox1.Value
Sheets(zutritte).Cells(wo_zutritt, 4).Value = Now()
On Error Resume Next
Sheets(zutritte).Cells(wo_zutritt, 2).Value = WorksheetFunction.VLookup(TextBox1.Value, Sheets(firmendaten).Range("A:B"), 2, False)
Sheets(zutritte).Cells(wo_zutritt, 3).Value = WorksheetFunction.VLookup(TextBox1.Value, Sheets(firmendaten).Range("A:C"), 3, False)
Exit Sub
End If
'wenn es einen Treffer gibt, diesen suchen
For i = wo_zutritt To 2 Step -1 'rückwärts um den ältesten zu erst zu finden
If Sheets(zutritte).Cells(i, 1).Value = TextBox1.Value And Sheets(zutritte).Cells(i, 5).Value = "" Then 'ausfahrt
Sheets(zutritte).Cells(i, 5).Value = Now()
Exit Sub
End If
If Sheets(zutritte).Cells(i, 1).Value = TextBox1.Value Then 'einfahrt
Sheets(zutritte).Cells(wo_zutritt, 1).Value = TextBox1.Value
Sheets(zutritte).Cells(wo_zutritt, 4).Value = Now()
On Error Resume Next
Sheets(zutritte).Cells(wo_zutritt, 2).Value = WorksheetFunction.VLookup(TextBox1.Value, Sheets(firmendaten).Range("A:B"), 2, False)
Sheets(zutritte).Cells(wo_zutritt, 3).Value = WorksheetFunction.VLookup(TextBox1.Value, Sheets(firmendaten).Range("A:C"), 3, False)
Exit Sub
End If
Next
End Sub

Zum Einblenden der Userform
Sub zeigdich()
UserForm1.Show
End Sub

Das kannst Du auch über einen Button auf einem Tabellenblatt machen (Steuerelement).

Die Userform/Button entfällt das Überwachen des Tabellenblatts auf Änderungen. Man könnte zu Beginn auch eine Prüfung einbauen, ob es den eingegebenen Code überhaupt in der Tabelle Firmen gibt.

Zur Nachvollziehbarkeit:
Zunächst wird einfach ein Logbucheintrag erzeugt. Dann die Prüfung ob eine Ein- oder Ausfahrt vorliegt. Gibt es den Code noch gar nicht, muss es auf jeden Fall eine Einfahrt sein -> neuen Eintrag erzeugen.
Gibt es einen Eintrag wird von hinten her die Liste durchgesehen. Der neueste Eintrag wird damit zu erst gefunden. Eintrag ohne Austrittszeit = Ausfahrt, ansonsten bleibt ja nur Einfahrt. Das VLookup ist quasi sverweis in VBA, um die Firmen und Mitarbeiternamen zu übernehmen.

Aktuell kann man auch unbekannte Codes eingeben. Daher das on error resume next, da VLookup sonst eine Fehlermeldung ausgibt. Eine Prüfung direkt zu Beginn wäre schon sauberer.


Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von Michi19756
23.11.2015, 21:35

Vielen Dank, ich versuche mich noch daran, aber ich glaube das ganze ist mir doch zu hoch. Ich schaue schon die ganze Zeit Videos in Youtube und jetzt weiß ich auch endlich wie man einen Button macht :´D vllt klappt´s ja noch...

0
Kommentar von Michi19756
24.11.2015, 06:28

Jetzt ist mir doch noch was eingefallen... Wenn ich eine Firma habe, die nicht mehr Zufahrtsberechtigt ist, kann diese dann direkt rot hinterlegt werden oder sogar noch ein Signalton ertönen? Und wie könnte ich es hin bekommen, dass X1/1, X1/2, X1/3 usw alle als Firma mit dem Code X1 erkannt und trotzdem mit X1/1 in dem Blatt Zutritte so eingefügt werden, Ohne dass man jeden Code einzeln in die Liste "Firmen" eintragen muss sondern wie gehabt, nur X1 Fa. Mustermann?

0

Du willst Dich als Parkwächter oder Privatdetektiv betätigen? Meinetwegen.

Dein Vorschlag ist noch nicht optimal. Vllt wäre sowas besser:

Du gibst in zB E2 die Autonummer ein. Diese wird durch ein Ereignismakro auf die erste freie Zelle in Sp. A übertragen, zusätzlich daneben die Uhrzeit gesetzt.

Beim nächsten Eintrag (einer anderen Nummer in derselben Zelle E2) dasselbe.

Das Makro testet aber vorher, ob die Nummer schon erfasst ist und -wenn ja- Spalte C (Ausfahrtszeit) noch leer ist. Ist sie leer, wird die Ausfahrtszeit eingesetzt. Wenn nicht, wird das als neue Einfahrt eingetragen, samt Uhrzeit.

Ist das das, was Du wolltest?

weiß nicht, ob ich morgen dazukomme (und nur nach Rückmeldung!), heute jedenfalls nicht mehr.

Könntest Du mir übrigens sagen, WIE Du die Zeiten fixiert hast? Ich befürchte nämlich, dass Du eine xl-Einstellung verwendest, die riskant ist, weil sie ALLE Dateien erfasst (Iteration).

Wäre bei µ überflüssig.

Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von Michi19756
23.11.2015, 01:25

Du liegst fast richtig mit Deiner Vermutung, ich bin seit einigen Jahren im Wach- und Sicherheitsgewerbe und habe auch die 3 jahrige Ausbildung zur Fachkraft für Schutz und Sicherheit hinter mir. Nun möchte ich auf meinem jetzigen Objekt eine Betretungsliste mit Excel erstellen, welche uns die Arbeit sehr erleichtern würde. Da momentan noch alles handschriftlich erfasst wird und anschließend in eine Excel Tabelle eingetragen.

So wie du das oben beschrieben hast, stell ich mir das auch vor, nur dass ich die Kennzeichen nicht brauche (da die Personen oft mit verschiedenen Fahrzeugen kommen), sondern nur die Firmen plus die Nummer die wir den Personen zugeordnet haben, Datum und Ein- und Ausfahrtszeit. Für Verbesserungsvorschläge bin ich dennoch offen und dankbar!

Jetzt steh ich aber auch noch vor dem Problem, dass wenn ich z.B. X1/1, X1/2 usw. in eine Zelle eingebe, Excel nicht mehr erkennt, dass es sich dabei um die auf X1 zugeordnete Firma handelt. Es sollten die Nummern /1, /2 usw. trotzdem dabei stehen, da wir diese an die jeweiligen Mitarbeiter der Firmen vergeben haben und somit nachvollziehen können, welche Mitarbeiter der Firmen sich auf dem Objekt aufgehalten haben, falls etwas abhanden kommt.

Zu Deiner Frage wie ich die Zeiten fixiert habe:

Sub Worksheet_change(ByVal Target As Range)'Sub Datum_Uhrzeit_daneben_setzen(ByVal Target As Range) 'wäre für Knopfzuweisungif not intersect(Target, Columns(1)) is nothing thenif Target <> "" then Target.offset(0, 1) = date: Target.offset(0, 2) = timeend ifend sub

das hattest Du mir in einer vorherigen Frage schon so beantwortet und funktioniert bisher auch ganz gut.

Vorerst wäre es das, mach Dir wegen mir aber keinen Stress deswegen, wenn es halt erst in ein paar Tagen klappt ist´s auch nicht so wild. Ich bin froh, dass man mir da überhaupt weiter hilft. Vielen Dank schon mal!

1

Das Problem ist eher, dass Excel keine fixierten Zeitfunktionen kennt. Das zweite Eingeben würde eine Neuberechnung aller Zellen bewirken, die die aktuelle Zeit (bspw. mit JETZT() ) beziehen.

Lösen lässt sich das nur mittels Makro / VBA.

Ich habe mal die Themen zur Frage ergänzt. Die Makro-Spezis tauchen bestimmt gleich auf ;)

Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von Michi19756
22.11.2015, 22:44

Das Problem hab ich schon gelöst, dass die Zeiten fixiert bleiben...

0
Kommentar von Ninombre
22.11.2015, 22:47

Ein Button wäre eine Alternative , die ganz einfach umgesetzt wäre. 

So wie es bisher beschrieben ist, kann ich noch keine klare Regel erkennen. Du müsstest schon definieren, ob bestimmte Zellen, Spalten oder Zeilen überwacht werden sollen oder bestimmte Werte. Irgendeine Zahl irgendwo ist nicht so präzise. 

0
Kommentar von Michi19756
22.11.2015, 22:59

Ok, mein Ziel ist es, dass ich über einen NFC-Tag, auf dem ein Text gespeichert ist (wie z.B. B1/1 - B1 steht für die Firma und /1 für den Angestellten), es hinbekomme, dass beim ersten einlesen die Einfahrtszeit und beim zweiten einlesen die Ausfahrtszeit in der Tabelle erscheint. Ohne dass ich immer wieder die Zelle suchen muss in der die Person eingefahren ist und sie anklicken muss, damit in der Zeile auch wieder die Ausfahrtszeit steht. Ist schwierig dass so zu erklären aber ich hoffe ihr wisst was ich meine...

0

Was möchtest Du wissen?