Hallo liebe Forengemeinde, Ich habe folgendes Problem mit Excel in Kombi mit VBA:
Ich habe eine Arbeitsmappe, auf der in Tabelle 1 insgesamt 20 Mitarbeiter Ihre Arbeitszeit und Pausen in eine Maske eingeben sollen. Zur Sicherheit muss der Mitarbeiter sich selbst dem Namen nach auswählen und damit es nicht in den Arbeitsmappen der Mitarbeiter durcheinander geht mit 4 stelliger Personalnummer. Danach wählt er dem Monat aus, den er bearbeiten will. Dann soll er auf „Daten holen“ gehen. Nun brauche ich einen VBA Code etc. um aus der Mappe des Arbeitnehmers den entsprechenden Monat „( Z. B. JAN D8:L38 ) unter Zu Hilfename eines Nummerncodes (steht in Tabelle „Mitarbeiter“ und wird generiert aus Formulardropdownfeldern und Eingabe seiner Pers.-Nummer) Mit einem aufgezeichneten Macro ist es mir gelungen, mit If then für einen Mitarbeiter dieses auch hin zu bekommen. Aber dann…….
Wenn der Mitarbeiter die Zeilen mit Arbeitszeit und Pausen ausgefüllt hat, soll er auf den Knopf „Daten Senden“ drücken und die Mappe des Mitarbeiters wird mit diesem Daten aktualisiert. Hintergrund dieser Aktion soll sein, die Daten von dem Mitarbeiter (Taxifahrer) eingeben zu lassen.
Ich hoffe einer kann mir helfen….. [img] Dateiupload bitte im Forum! So geht es: Klick mich! ]
Erster Punkt wird sein, wie Du in die richtige Datei kommst. Im Moment ist sie ja offen, ich gehe erst mal davon aus, dass das auch bei dne anderen so sein wird.
Du schreibst: Windows("Ilse Raterink Stundenabrechnung2016.xls").Activate
In der Tabelle steht der Name aber anders: Raterink, Ilse Abgelegt wird er in C1
Damit beides zusammenkommt, kann man den Namen "rumdrehen"
Ich hab hier mal ein kleines Testmakro. Du kannst einen Mitarbeiter auswählen, dann führst Du das Makro aus und er sollte Dir korrekt angezeigt werden.
Code:
Sub test() With Sheets("Mitarbeiter") MsgBox Trim(Right(.Cells(.Cells(1, 3), 1), Len(.Cells(.Cells(1, 3), 1)) - InStr(1, .Cells(.Cells(1, 3), 1), ","))) & " " & _ Trim(Left(.Cells(.Cells(1, 3), 1), InStr(1, .Cells(.Cells(1, 3), 1), ",") - 1)) End With End Sub
Private Function Mitarbeiter() As String 'Funktion zum "Drehen" Name, Vornahme in Vorname Name 'Mit dem Blatt Mitarbeiter With Sheets("Mitarbeiter") 'Mitarbeiter aus Zeile x ermitteln anhand Wert x aus mit Auswahlfeld verlinkter Zelle C1 'und Entfernen ueberfluessiger Leerzeichen Mitarbeiter = Trim(Right(.Cells(.Cells(1, 3), 1), Len(.Cells(.Cells(1, 3), 1)) - InStr(1, .Cells(.Cells(1, 3), 1), ","))) & " " & _ Trim(Left(.Cells(.Cells(1, 3), 1), InStr(1, .Cells(.Cells(1, 3), 1), ",") - 1)) 'Ende Mit dem Blatt Mitarbeiter End With End Function
. \\\|/// Hoffe, geholfen zu haben. ( ô ô ) Grüße, André aus G in T ooO-(_)-Ooo (Excel 97-2019+365)
Zunächst einmal vielen Dank für die Hilfe. Das mit den namen habe ich dank der Anweisung hinbekommen. Nun ist es aber so, das die Werte, die geholt werden sollen folgend aussehen: Ich nehme zur Vereinfachung mal nur die Ilse
In der Mappe "Ilse" ist die komplette Stunden- und Lohngeschichte zusammen.( Für 8,50 € Kräfte ist man Nachweispflichtig über die geleisteten Stunden) In dieser Mappe sind u.a. die Monate Jan - Dez. als Arbeitszeitnachweis hinterlegt.
Die von mir eingestellte Stempeluhr soll von den Mitarbeitern ausgefüllt werden, da diese auch ganz früh oder spät in die Zentrale kommen. Damit jetzt auch auf "Ilse" bezogen der entsprechenden Monat aus "Ihrer" Mappe geholt wird, habe ich das mit den Pers.Nummern gemacht.
Vielleicht gibt es aber ja noch eine andere Möglichkeit, einen VBA Code zu erstellen, ohne das es zu Verwechselungen kommt. Soll heißen, ein anderer Mitarbeiter darf nicht auf die Daten von "Ilse" zugreifen können und umgekehrt.
Schön wäre auch noch die Anweisung; wenn der Mitarbeiter seine Daten für die entsprechenden Tage eingeben hat, Knopf "Daten senden" genau dahin zurück zu geben, aus welchem Monat er die Daten zur Eingabe geholt hat.
Ich hoffe, ich habe mich nicht zu kompliziert ausgedrückt :22:
damit ein "normaler" Mitarbeiter ohne kriminelle Energie nicht auf die Daten eines anderen Mitarbeiters zugreifen kann, könntest Du wenigstens zwei Maßnahmen treffen. 1. kannst Du die Datei des Mitarbeiters mit Passwort schützen, oder der Mitarbeiter hat die irgendwo, wo andere nicht hinkommen 2. müsstest Du die "Stempeluhr" leer speichern und schreibschützen, damit der Mitarbeiter nicht versehentlich ihre Daten dort mit speichern.
Ich hab jetzt aber wegen der Tabellenblätter erst mal ein Verständigungsproblem. Deine Anfrage zielt ja auf die Ilse, und die ist nicht in der Datei. Dort gibt es aber andere Kollegen. Sind das jetzt Beispiele, wie so eine Datei auszusehen hat und normalerweise gibt es die Blätter dort nicht? Im Moment hat das Blatt "Start" mit dem Stempeln ja noch nichts zu tun. Die Namen werden getrennt ausgewählt, und die "Stempelzeit" kommt auf ein Mitarbeiterblatt.
Ich würde das so verstehen bzw. so vorgehen: Die Kollegen haben jeder eine Datei und sie hat ein Blatt wo vom 1.1. bis zum 31.12. eines Jahres alle Tage schön untereinander drauf sind, einschl. Sonn- und Feiertage. Das macht die Sache einfacher, weil man dann mit den Zeilennummern arbeiten kann - der 1.1. ist der 1. Tag und steht z.B. in Zeile 3. Der 1.2. ist der 32. Tag und steht demzufolge in Zeile 34 usw. Das würde aber auch bedeuten, dass ein Kollege, der am 1.12. anfängt, auf seinem Blatt auch alle tage ab dem 1.1. hat.
Der Kollege öffnet seine Datei - mit Eingabe des Passwortes. Wenn der Kollege nun stempelt - im Dialog statt der Namensauswahl mit seiner Personalnummer -, wird die Zeit in seine Datei eingetragen.
Wenn er im Blatt"Start" seinen Namen einstellt, oder, wie Du schon geschrieben hast, besser seine Personalnummer ein. Dann sucht er sich seinen Monat raus und das Programm holt die entsprechenden Daten automatisch (oder auf "Knopfdruck"). Der Kollege ändert nun die Daten - er kann also wild im ganzen Monat rumschreiben - und speichert die Daten auf Knopfdruck zurück in seine Datei. Damit würden aber Stempeldaten überschrieben, und das kann doch auch nicht Ziel der Aktion sein, oder?
Den Tag des Jahres bekommst Du so, als Beispiel mal für den aktuellen Tag: Sub HeuteIst() MsgBox DateDiff("d", "1.1.2016", Now) + 1 End Sub
+ 1 ist nötig, weil die Differenz zwischen zwei Werten ja immer eins weniger ist als die Anzahl der Werte. Die Differenz zwischen 3 und 1 ist 2, aber es sind 3 Werte (oder Tage)
. \\\|/// Hoffe, geholfen zu haben. ( ô ô ) Grüße, André aus G in T ooO-(_)-Ooo (Excel 97-2019+365)
Hallo Schauan, wahrscheinlich war (Ist) meine Erklärung zu unübersichtlich. Deshalb versuche ich noch einmal, die Umstände etwas besser zu erklären:
Den Code den ich brauche, müsste ungefähr so aussehen.
Wenn im Blatt "Start" über Dropdown der Monat (zb. Januar) ausgewählt ist, dann in der jeweiligen Mappe (z.B. "Ilse Raterink Stunden....2016.xls" das Tabellenblatt "jan" auslesen (bei geschlossener Arbeitsmappe) nach drücken des Buttons "Daten holen".
Zur Erklärung: Ich habe 15 Mitarbeiter Mappen, wo Stammdaten, Abrechnungen aber auch die jeweiligen Monate "Jan", "Feb",... "Dez" las Tabellenblatt mit Ihren Stunden hinterlegt sind.
Ich denke über Case ist das am einfachsten. Nur habe ich keine Idee hierzu.
Zitat: Der Kollege ändert nun die Daten - er kann also wild im ganzen Monat rumschreiben - und speichert die Daten auf Knopfdruck zurück in seine Datei. Damit würden aber Stempeldaten überschrieben, und das kann doch auch nicht Ziel der Aktion sein, oder?
Nach "Daten holen" dürfen Datenzellen (D8:M38), in denen sich Einträge befinden, nicht mehr überschrieben werden können. (zb. Meldung "msg: Hier sind schon Daten vorhanden")
bevor wir uns an die Anforderung "Aus geschlossener Mappe" machen, bleib ich erst mal bei der offenen. Wie man den Namen richtig aufdröselt, hab ich weiter oben ja schon beschrieben.
Ich habe nun das Makro angepasst, was Du mit dem Button "Daten holen" verknüpft hast.
Code:
Sub Marco1() 'Daten von Tabelle1 aus der Mitarbieterdatei holen 'Hinweis: Fuer den Dateinamen bitte die Loesung zur Namensermittlung beruecksichtigen! 'ggf. Blattname anpassen 'Mitarbeiterdaten kopieren Workbooks("Ilse Raterink Stundenabrechnung2016.xls").Sheets("Tabelle1").Range("D8:L38").Copy 'Mitarbeiterdaten (nur Werte) auf Blatt Start einfuegen Range("D3:L33").PasteSpecial Paste:=xlValues End Sub
so, gleich geht's weiter ...
. \\\|/// Hoffe, geholfen zu haben. ( ô ô ) Grüße, André aus G in T ooO-(_)-Ooo (Excel 97-2019+365)
hier ist jetzt der komplettierte Code zum Holen der Daten. Funktion siehe Kommentare im Code. Senden kommt dann noch.
Code:
Sub Marco1() 'Makro zur Datenuebernahme. Voraussetzung: Start vom Blatt Start aus 'Blattschutz aufheben ActiveSheet.Unprotect Password:="BlaBla" 'Bereich leeren Range("D3:L33").ClearContents 'Daten aus Mitarbeiterdatei kopieren, Blattname ggf. anpassen Workbooks(Mitarbeiter & " Stundenabrechnung2016.xls").Sheets("Tabelle1").Range(Cells(DateDiff("d", "01.01." & Year(Now), Now) + 1, 4), _ Cells(DateDiff("d", "01.01." & Year(Now), "01." & Month(Now) & "." & Year(Now)), 12)).Copy 'Im Eingabebereich des aktiven Blattes einfuegen Range("D3").PasteSpecial Paste:=xlValues 'Wenn der Monat aktuell ist, dann If Month(Now) = Month(Cells(3, 3).Value) Then 'Zellen gesperrt setzen bis vor den aktuellen Tag Range(Cells(2, 3), Cells(2 + Day(Now) - 1, 12)).Locked = False 'Zellen frei setzen ab dem aktuellen Tag Range(Cells(2 + Day(Now), 3), Cells(33 + Day(Now), 12)).Locked = True 'Ende Wenn der monat aktuell ist, dann End If 'Blattschutz setzen ActiveSheet.Protect Password:="BlaBla" End Sub
Private Function Mitarbeiter() As String 'Funktion zum "Drehen" Name, Vornahme in Vorname Name 'Mit dem Blatt Mitarbeiter With Sheets("Mitarbeiter") 'Mitarbeiter aus Zeile x ermitteln anhand Wert x aus mit Auswahlfeld verlinkter Zelle C1 'und Entfernen ueberfluessiger Leerzeichen Mitarbeiter = Trim(Right(.Cells(.Cells(1, 3), 1), Len(.Cells(.Cells(1, 3), 1)) - InStr(1, .Cells(.Cells(1, 3), 1), ","))) & " " & _ Trim(Left(.Cells(.Cells(1, 3), 1), InStr(1, .Cells(.Cells(1, 3), 1), ",") - 1)) 'Ende Mit dem Blatt Mitarbeiter End With End Function
. \\\|/// Hoffe, geholfen zu haben. ( ô ô ) Grüße, André aus G in T ooO-(_)-Ooo (Excel 97-2019+365)
21.02.2016, 07:55 (Dieser Beitrag wurde zuletzt bearbeitet: 21.02.2016, 07:55 von schauan.)
Hallöchen,
hier noch der Code zum Daten senden.
Code:
Sub Marco2() 'Makro zum Daten senden. Voraussetzung: Start vom Blatt Start aus 'Im Eingabebereich des aktiven Blattes einfuegen Range("D3:L" & (DateDiff("d", "01.01." & Year(Now), "01." & Month(Now) & "." & Year(Now)) + 3)).Copy 'Daten aus Mitarbeiterdatei kopieren, Blattname ggf. anpassen Workbooks(Mitarbeiter & " Stundenabrechnung2016.xls").Sheets("Tabelle1").Range(Cells(DateDiff("d", "01.01." & Year(Now), Now) + 1, 4), _ Cells(DateDiff("d", "01.01." & Year(Now), "01." & Month(Now) & "." & Year(Now)), 12)).PasteSpecial Paste:=xlValues End Sub
Bitte mal ausführlich testen. Mir ist gerade aufgefallen, dass sich die codes aus den beiden Antworten auf den aktuellen Monat beziehen. Ich muss da mal noch etwas anpassen, kommt noch. Ich bin jetzt erst mal unterwegs zum Bäcker
. \\\|/// Hoffe, geholfen zu haben. ( ô ô ) Grüße, André aus G in T ooO-(_)-Ooo (Excel 97-2019+365)