21.12.2017, 20:15 (Dieser Beitrag wurde zuletzt bearbeitet: 21.12.2017, 20:25 von Mario.)
Hallo zusammen,
habe eine Datei, wo ich die Arbeitszeit von Mitarbeitern erfasse.
Nun möchte ich über VBA anhand der Personalnummer die Einsatzzeiten suchen und chronologisch nach Datum bestimmte Werte in ein Arbeitsblatt (UmsatzMitarbeiter) kopieren.
Bis jetzt habe ich dies über diesen Weg gelöst. Nun sind aber noch andere Bereiche dazugekommen, in denen die Suchspalte (P.-Nr.) immer acht Spalten weiter vorkommt. Kann man die so in eine Schleife packen, das er alle Spalten mit den Begriff (P.-Nr.) durchsucht und dann die Zeilen (Datum, Name, P.-Nr.,Objekt, von, bis, Stunden, Anfahrt und Stunden gesamt) in das Tabellenblatt "UmsatzMitarbeiter" kopiert.
wenn ich das richtig sehe und die Daten immer weiter unten angehangen werden sollen ist eine zweite For Next Schleife mit Offset(0, k*8) die simpelste Lösung. Sie erweitert das alte Makreo nur um eine zweite Schleife.
Das ist schon alles. Bitte ausprobieren ob es so klappt. Würde mich freuen ...
mfg Gast 123
Code:
Sub UmsatzMitarbeiter1()
Dim a As Long, i As Long Dim k As Integer
Application.ScreenUpdating = False
a = 5 '1.Zeile - Daten werden unten angehangen!!
For k = 0 To 7 'Offset() 0-7 entspricht Spalten 1-8 For i = 1 To 200 'Offset(0, k * 8) muss mit 0 beginnen!!
With Worksheets("Eingabe") If .Cells(i, "F").Offset(0, k * 8) = "20236" Then
wenn man vor die For Next Schleifen noch eine InputBox setzt und die Personal Nummer in eine Variable laedt muss man nicht jedesmal den Text "20236" im Makro aendern. Ist nur ein Vorschlag zum einfacherern arbeiten.
der grundsaetzliche Gedanke über Offset zu gehen ist schon richtig, aber man muss alle Codeteile abaendern. Mein kleiner Flüchtigkeitsfehler ist hier: Die Zelle im Eingang hatte ich nicht geandert!! .Cells(i, 2).Offset(0, k * 8).Value
Die InputBox habe ich mit eingefügt. Falls unerwünscht bitte diese Zeilen rauslöschen.
mfg Gast 123
Code:
Sub UmsatzMitarbeiter1()
Dim a As Long, i As Long Dim k As Integer, MtaNr
neu: MtaNr = InputBox("Bitte Personal Nr. eingeben", "Personal-Nr. eingeben ...") If MtaNr = Empty Then Exit Sub If Len(MtaNr) < 5 Then MsgBox "Die Nummer ist nicht 5stellig - Bitte neu eingeben.": GoTo neu
Application.ScreenUpdating = False
a = 5 '1.Zeile - Daten werden unten angehangen!!
For k = 0 To 7 'Offset() 0-7 entspricht Spalten 1-8 For i = 1 To 200 'Offset(0, k * 8) muss mit 0 beginnen!!
With Worksheets("Eingabe") If .Cells(i, "F").Offset(0, k * 8) = MtaNr Then
Worksheets("UmsatzMitarbeiter").Cells(a, 2).Value = .Cells(i, 2).Offset(0, k * 8).Value Worksheets("UmsatzMitarbeiter").Cells(a, 3).Value = .Cells(i, 5).Offset(0, k * 8).Value Worksheets("UmsatzMitarbeiter").Cells(a, 4).Value = .Cells(i, 6).Offset(0, k * 8).Value Worksheets("UmsatzMitarbeiter").Cells(a, 5).Value = .Cells(i, 7).Offset(0, k * 8).Value Worksheets("UmsatzMitarbeiter").Cells(a, 6).Value = .Cells(i, 8).Offset(0, k * 8).Value Worksheets("UmsatzMitarbeiter").Cells(a, 7).Value = .Cells(i, 9).Offset(0, k * 8).Value Worksheets("UmsatzMitarbeiter").Cells(a, 8).Value = .Cells(i, 10).Offset(0, k * 8).Value Worksheets("UmsatzMitarbeiter").Cells(a, 9).Value = .Cells(i, 11).Offset(0, k * 8).Value Worksheets("UmsatzMitarbeiter").Cells(a, 10).Value = .Cells(i, 12).Offset(0, k * 8).Value
vielen Dank, funktioniert soweit super. Lediglich die Inbox funktioniert nicht und das Datum wird nicht richtig kopiert. Aber dennoch 1000 Dank, hat mir schon sehr weitergeholfen.
23.12.2017, 19:59 (Dieser Beitrag wurde zuletzt bearbeitet: 23.12.2017, 20:57 von Mario.)
Hallo Gast 123,
ich habe deinen Ratschlag befolgt. Ich habe mir eine Userform mit einem Combobox für die Auswahl der Mitarbeiter erstellt. Dazu habe ich ein Textfeld, indem je nach Auswahl die Personalnummer angezeigt wird. Dies funktioniert auch alles super. Leider Überspringt er aber in der Schleife, die Anweisungen. Ich bin den Code auch schon Step by Step mit F8 durchgegangen, kann den Fehler aber leider nicht finden. Kannst du eventuell nochmal helfen.
Hier der Code:
Code:
Private Sub CommandButton1_Click()
Dim a As Long, i As Long Dim k As Integer, PNr Dim rng As Range
Application.ScreenUpdating = False
a = 5 '1.Zeile - Daten werden unten angehangen!!
For k = 0 To 7 'Offset() 0-7 entspricht Spalten 1-8 For i = 1 To 200 'Offset(0, k * 8) muss mit 0 beginnen!!
With Worksheets("Eingabe") If .Cells(i, "F").Offset(0, k * 8) = TextBoxPersonalnummer.Value Then
Worksheets("UmsatzMitarbeiter").Cells(a, 2).Value = .Cells(i, 2).Offset(0, k * 8).Value Worksheets("UmsatzMitarbeiter").Cells(a, 3).Value = .Cells(i, 5).Offset(0, k * 8).Value Worksheets("UmsatzMitarbeiter").Cells(a, 4).Value = .Cells(i, 6).Offset(0, k * 8).Value Worksheets("UmsatzMitarbeiter").Cells(a, 5).Value = .Cells(i, 7).Offset(0, k * 8).Value Worksheets("UmsatzMitarbeiter").Cells(a, 6).Value = .Cells(i, 8).Offset(0, k * 8).Value Worksheets("UmsatzMitarbeiter").Cells(a, 7).Value = .Cells(i, 9).Offset(0, k * 8).Value Worksheets("UmsatzMitarbeiter").Cells(a, 8).Value = .Cells(i, 10).Offset(0, k * 8).Value Worksheets("UmsatzMitarbeiter").Cells(a, 9).Value = .Cells(i, 11).Offset(0, k * 8).Value Worksheets("UmsatzMitarbeiter").Cells(a, 10).Value = .Cells(i, 12).Offset(0, k * 8).Value