Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1584to1588
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Kopiere aus Datei Zeile, wenn Bedingung erfüllt

Kopiere aus Datei Zeile, wenn Bedingung erfüllt
18.10.2017 08:41:57
Chris
Hallo liebe VBA-Gemeinde,
ich suche eine Lösung um Zeilen (oder gerne auch nur bestimmte Zellen) aus einer Datei in meine aktive zu kopieren wenn die Bedingung erfüllt ist.
Ich habe in meiner Quellen-Datei, mehrere Worksheets. im betroffen WS "MA DATEN" habe ich 5 Spalten:
id personnel-number name User Team Department
3072 500302 xxx,ffffff kürzel1 0 0
3079 500002 xxxx,ccccc kürzel2 T_TL xxx oooo T_Dep_00-L1_oooo_dddd
gesucht werden soll nach Team, in dem Beispiel "T_TL xxx oooo", wenn der in der Spalte steht, dann kopiere Zeile (oder Zellen 2-4 in der Zeile) in Zieldatei, Worksheet "Teammitglieder" untereinander.
Zeile oder bestimmte Zellen wäre mir egal.

12
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Kopiere aus Datei Zeile, wenn Bedingung erfüllt
18.10.2017 09:26:51
SF
Hola,
verlinkst du bitte deine Beiträge in den verschiedenen Foren untereinander?
Danke.
Gruß,
steve1da
So z.B.
18.10.2017 09:58:25
Peter(silie)
Hallo,
hier wäre eine Möglichkeit mit .Match:
(Funktioniert nur wenn der wert einmalig vorkommt in der spalte!.
Die Range muss außerdem von Zeile 1 bis xy gehen! nicht 2 bis xy oder irgendwas anderes!)
Option Explicit
Sub Transfer_Data()
Dim lRow, rowToCopy As Long
Dim ws_Daten, ws_mitglieder As Worksheet
Dim rng, tmp As Range
Set ws_Daten = ThisWorkbook.Sheets(1)
With ws_Daten
lRow = .Cells(.Rows.Count, 4).End(xlUp).Row
Set rng = .Range(.Cells(1, 4), .Cells(lRow, 4))
rowToCopy = Get_Row_of_Match(rng, "T_TL xxx oooo")
If rowToCopy > 0 Then
Set tmp = .Range(.Cells(rowToCopy, 2), .Cells(rowToCopy, 4))
Set ws_mitglieder = ThisWorkbook.Sheets(2)
With ws_mitglieder
lRow = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
.Range("A" & lRow).Resize(, tmp.Columns.Count) = tmp.Value
End With
Set tmp = Nothing
Set ws_mitglieder = Nothing
End If
End With
End Sub
Private Function Get_Row_of_Match(ByVal rng As Range, ByVal MatchToFind As Variant) As Long
If Not VBA.IsError(Application.Match(MatchToFind, rng, 0)) Then
Get_Row_of_Match = Application.Match(MatchToFind, rng, 0)
End If
End Function
Hier noch eine Beispiel Mappe mit dem obigen Code: https://www.herber.de/bbs/user/117039.xlsm
Anzeige
AW: So z.B.
18.10.2017 10:09:05
Chris
Hallo Peter,
vielen Dank für die schnell Rückantwort. Das sieht wirklich super aus, hat für mich nur den Haken, dass der Wert nicht einmalig vorkommt. Ich suche Quasi nach dem Teammanager so dass mir alle Zeilen in denen er vorkommt kopiert werden.
Aber .match kannte ich noch gar nicht, vielen Dank auf jedenfall dafür :)
AW: So z.B.
18.10.2017 10:10:32
Chris
Und es sind 2 Dateien :(
AW: So z.B.
18.10.2017 10:24:51
Peter(silie)
Hallo,
dann könntest du folgenden Code probieren der mit .Find und .FindNext arbeitet.
Worksheet, Workbook und Range Variablen musst du auf dich anpassen!
Option Explicit
Sub Transfer_Data()
Dim ws_Daten As Worksheet
Dim rowsToCopy As Variant
Dim rng, tmp As Range
Dim lRow As Long
Set ws_Daten = ThisWorkbook.Sheets(1)
With ws_Daten
lRow = .Cells(.Rows.Count, 4).End(xlUp).Row
Set rng = .Range(.Cells(1, 4), .Cells(lRow, 4))
rowsToCopy = Get_Row_Array(rng, "T_TL xxx oooo")
If IsArray(rowsToCopy) Then
Transfer_data_To_other_Workbook rowsToCopy, ws_Daten
End If
End With
End Sub
Private Function Get_Row_Array(ByVal rng As Range, ByVal ValueToFind As Variant) As Variant
Dim array_() As Variant
Dim counter As Long
Dim firstAddress
Dim c As Range
With rng
Set c = .Find(ValueToFind, LookIn:=xlValues, LookAt:=xlWhole)
If Not c Is Nothing Then
firstAddress = c.Address
counter = 0
Do
ReDim Preserve array_(counter)
array_(counter) = c.Row
counter = counter + 1
Set c = .FindNext(c)
Loop While Not c Is Nothing And c.Address  firstAddress
End If
End With
Get_Row_Array = array_
End Function
Private Function Transfer_data_To_other_Workbook(ByVal array_ As Variant, ByVal FromWorksheet)  _
As Boolean
Dim varItem As Variant
Dim ws As Worksheet
Dim wb As Workbook
Dim lRow As Long
Dim tmp As Range
Set wb = Workbooks.Open("Dein WB Pfad")
Set ws = wb.Sheets("Worksheet wo es rein soll")
With ws
lRow = .Cells(.Rows.Count, 1).End(xlUp) + 1
For Each varItem In array_
With FromWorksheet
Set tmp = .Range(.Cells(varItem, 2), .Cells(varItem, 4))
End With
.Range("A" & lRow).Resize(, tmp.Columns.Count) = tmp.Value
Set tmp = Nothing
lRow = lRow + 1
Next varItem
End With
End Function

Anzeige
AW: So z.B.
18.10.2017 10:44:24
Chris
Hallo Peter,
nach etwas rumprobieren habe ich jetzt verstanden, dass dieser Ansatz in die Quell-Datei müsste. Diese Quelldatei ist allerdings geschützt, so dass ich nur in meiner Auswertung die Möglichkeit habe ein Modul zu erstellen. Ich schätze das "to" gegen ein "from" auszutauschen wird nicht reichen oder?
AW: So z.B.
18.10.2017 10:57:26
Peter(silie)
Hallo,
viel muss man daran nicht ändern...
Zur Funktionalität:
Workbook öffnen wo die Daten rein kommen sollen.
Alt + F11, dann ein neues Modul erstellen
In Modul den folgenden Code einfügen:
Option Explicit
Sub Transfer_Data()
Dim ws_Daten As Worksheet
Dim rowsToCopy As Variant
Dim rng, tmp As Range
Dim wb As Workbook
Dim lRow As Long
Set wb = Workbooks.Open("Workbook mit Daten")
wb.Unprotect "Passwort des Workbooks"
Set ws_Daten = wb.Sheets(1) 'Anpassen
With ws_Daten
lRow = .Cells(.Rows.Count, 4).End(xlUp).Row
Set rng = .Range(.Cells(1, 4), .Cells(lRow, 4))
rowsToCopy = Get_Row_Array(rng, "T_TL xxx oooo")
If IsArray(rowsToCopy) Then
Transfer_data_To_other_Workbook rowsToCopy, ws_Daten
End If
End With
wb.Protect "Passwort des Workbooks"
End Sub
Private Function Get_Row_Array(ByVal rng As Range, ByVal ValueToFind As Variant) As Variant
Dim array_() As Variant
Dim counter As Long
Dim firstAddress
Dim c As Range
With rng
Set c = .Find(ValueToFind, LookIn:=xlValues, LookAt:=xlWhole)
If Not c Is Nothing Then
firstAddress = c.Address
counter = 0
Do
ReDim Preserve array_(counter)
array_(counter) = c.Row
counter = counter + 1
Set c = .FindNext(c)
Loop While Not c Is Nothing And c.Address  firstAddress
End If
End With
Get_Row_Array = array_
End Function
Private Function Transfer_data_To_other_Workbook(ByVal array_ As Variant, ByVal FromWorksheet  _
As Worksheet)
Dim varItem As Variant
Dim ws As Worksheet
Dim wb As Workbook
Dim lRow As Long
Dim tmp As Range
Set ws = ThisWorkbook.Sheets("Worksheet wo es rein soll")
With ws
lRow = .Cells(.Rows.Count, 1).End(xlUp) + 1
For Each varItem In array_
With FromWorksheet
Set tmp = .Range(.Cells(varItem, 2), .Cells(varItem, 4))
End With
.Range("A" & lRow).Resize(, tmp.Columns.Count) = tmp.Value
Set tmp = Nothing
lRow = lRow + 1
Next varItem
End With
End Function
Workbook Pfad, Workbook Passwort und Worksheet Namen anpassen.
Ausführen
Fertig
Anzeige
AW: So z.B.
18.10.2017 11:06:32
Chris
Vielen Dank, allerdings schreit Excel mich an das die For-Schleife nicht initialisiert.
AW: So z.B.
18.10.2017 11:07:19
Chris
Sorry, in der Zeile hängt er mit dem genannten Fehler:
For Each varItem In array_
AW: So z.B.
18.10.2017 11:44:14
Peter(silie)
Hallo,
habe es gerade getestet.
Der einzige Fehler ist, dass ".Row" in folgendem gefehlt hat:
Set ws = ThisWorkbook.Sheets("Worksheet wo es rein soll")
With ws
lRow = .Cells(.Rows.Count, 1).End(xlUp) + 1
Das muss so aussehen:


Set ws = ThisWorkbook.Sheets("Worksheet wo es rein soll")
With ws
lRow = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
Die For Schleife funktioniert einwandfrei.
Wenn es bei dir immer noch nicht geht, dann stelle die beiden Mappen von dir hier rein.
Anonymisiere die Daten und ändere dass Passwort der einen Mappe in etwas anderes. (PW bitte mit rein schreiben)
Anzeige
AW: So z.B.
18.10.2017 12:07:08
Chris
Vielen vielen Dank

378 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige