If Schleife/ Bestimmte Nummern suchen und Werte kopieren
#1
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.

Code:
Sub UmsatzMitarbeiter1()

Dim a As Long, i As Long

   Application.ScreenUpdating = False
   
   a = 5
For i = 1 To 200

With Worksheets("Eingabe")

If .Cells(i, "F") = "20236" Then


       Worksheets("UmsatzMitarbeiter1").Cells(a, 2).Value = Worksheets("Eingabe").Cells(i, 2).Value
       Worksheets("UmsatzMitarbeiter1").Cells(a, 3).Value = Worksheets("Eingabe").Cells(i, 5).Value
       Worksheets("UmsatzMitarbeiter1").Cells(a, 4).Value = Worksheets("Eingabe").Cells(i, 6).Value
       Worksheets("UmsatzMitarbeiter1").Cells(a, 5).Value = Worksheets("Eingabe").Cells(i, 7).Value
       Worksheets("UmsatzMitarbeiter1").Cells(a, 6).Value = Worksheets("Eingabe").Cells(i, 8).Value
       Worksheets("UmsatzMitarbeiter1").Cells(a, 7).Value = Worksheets("Eingabe").Cells(i, 9).Value
       Worksheets("UmsatzMitarbeiter1").Cells(a, 8).Value = Worksheets("Eingabe").Cells(i, 10).Value
       Worksheets("UmsatzMitarbeiter1").Cells(a, 9).Value = Worksheets("Eingabe").Cells(i, 11).Value
       Worksheets("UmsatzMitarbeiter1").Cells(a, 10).Value = Worksheets("Eingabe").Cells(i, 12).Value

   a = a + 1
   
   Else

End If

End With

Next i

Application.ScreenUpdating = True

End Sub

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.

Ich danke euch für die Hilfe,

VG Mario


Angehängte Dateien
.xlsm   Test1.xlsm (Größe: 90,61 KB / Downloads: 4)
Top
#2
Hallo

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

      Worksheets("UmsatzMitarbeiter1").Cells(a, 2).Value = Worksheets("Eingabe").Cells(i, 2).Value
      Worksheets("UmsatzMitarbeiter1").Cells(a, 3).Value = Worksheets("Eingabe").Cells(i, 5).Value
      Worksheets("UmsatzMitarbeiter1").Cells(a, 4).Value = Worksheets("Eingabe").Cells(i, 6).Value
      Worksheets("UmsatzMitarbeiter1").Cells(a, 5).Value = Worksheets("Eingabe").Cells(i, 7).Value
      Worksheets("UmsatzMitarbeiter1").Cells(a, 6).Value = Worksheets("Eingabe").Cells(i, 8).Value
      Worksheets("UmsatzMitarbeiter1").Cells(a, 7).Value = Worksheets("Eingabe").Cells(i, 9).Value
      Worksheets("UmsatzMitarbeiter1").Cells(a, 8).Value = Worksheets("Eingabe").Cells(i, 10).Value
      Worksheets("UmsatzMitarbeiter1").Cells(a, 9).Value = Worksheets("Eingabe").Cells(i, 11).Value
      Worksheets("UmsatzMitarbeiter1").Cells(a, 10).Value = Worksheets("Eingabe").Cells(i, 12).Value

     a = a + 1

  End If
  End With

Next i
Next k

Application.ScreenUpdating = True

End Sub
Top
#3
Nachtrag

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.

mfg  Gast 123
Top
#4
Hallo Gast123,

vielen dank für deine schnelle Hilfe.
Leider funktioniert es nicht. Er Kopiert leider nur aus der Spalte N. Und dort dann die Ergebnisse mehrmals.

Habe den Code in der Testdatei in ein Modul gelegt.

VG Mario


Angehängte Dateien Thumbnail(s)
   

.xlsm   Test1.xlsm (Größe: 95,98 KB / Downloads: 2)
Top
#5
Hallo Mario

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

     a = a + 1

  End If
  End With

Next i
Next k

Application.ScreenUpdating = True

End Sub
Top
#6
Hallo Gast123,

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.

VG Mario
Top
#7
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

     
    a = a + 1

 End If
 End With

Next i
Next k

  Application.ScreenUpdating = True

  Unload Me


End Sub

Die Datei habe ich mit angehangen.

Vielen Dank für die Hilfe,

VG Mario


Angehängte Dateien
.xlsm   Test1.xlsm (Größe: 72,2 KB / Downloads: 1)
Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste