2.7k Aufrufe
Gefragt in Tabellenkalkulation von ahorn38 Experte (3.2k Punkte)
Hallo,

ich habe folgenden Code
.....
dim rng as range
Set rng = Workbooks("Test.xlsm").Sheets("Daten").Columns(3).Find( _ what:=Cells(iRow, 4), lookat:=xlWhole, LookIn:=xlValues)
.......

Damit suche ich in der Datei "Test" in der Spalte "3" nach dem Namen, der in der Quelldatei in "Cells(iRow,4) steht. Das funktioniert auch einwandfrei.
Jetzt möchte ich aber zusätzlich zum Namen auch den Vornamen berücksichtigen um die Suche zu verfeinern. Der Vornamen steht in beiden Dateien jeweils eine Spalte weiter rechts. Wie müßte dann der Code lauten?? Hat jemand einen Tipp?
Gruß Andreas

16 Antworten

0 Punkte
Beantwortet von nighty Experte (6.6k Punkte)
hi :-)

du hast ja mit rng eine objectvariable erstellt,rng
mach das nochmal,rng1 z.b.

die zeile kopieren und Suchbegriff wie spalten anpassen
deine eventuelle if abfrage kannst du dann mit dem Operator and verbinden

gruss nighty
0 Punkte
Beantwortet von beverly Experte (3.5k Punkte)
Hi,

benutze die FindNext-Methode und vergleiche dabei jeweils, ob der Vorname übereinstimmt:

Dim rng As Range
Dim strStart As String
Set rng = Workbooks("Test.xlsm").Sheets("Daten").Columns(3).Find( _
what:=Cells(iRow, 4), lookat:=xlWhole, LookIn:=xlValues)
If Not rng Is Nothing Then
strStart = rng.Address
Do
If rng.Offset(0, 1) = Cells(iRow, 4).Offset(0, 1) Then Exit Do
Set rng = Workbooks("Test.xlsm").Sheets("Daten").Columns(3).FindNext(rng)
Loop While Not rng Is Nothing And rng.Address <> strStart
MsgBox rng.Value & " " & rng.Offset(0, 1).Value
End If
Set rng = Nothing


Bis später,
Karin
0 Punkte
Beantwortet von ahorn38 Experte (3.2k Punkte)
Hallo nighty,

habe meinen Code entsprechend verändert:

Do Until IsEmpty(Cells(iRow, 2))


Set rng = Workbooks("Test.xlsm").Sheets("Daten").Columns(3).Find( _
what:=Cells(iRow, 4), lookat:=xlWhole, LookIn:=xlValues)
Set rng1 = Workbooks("Test.xlsm").Sheets("Daten").Columns(4).Find( _
what:=Cells(iRow, 5), lookat:=xlWhole, LookIn:=xlValues)


If Not rng Is Nothing And Not rng1 Is Nothing Then

Range(rng.Offset(0, 18), rng.Offset(0, 18)).Value = _
Range(Cells(iRow, 2), Cells(iRow, 2)).Value


End If

iRow = iRow + 1
Loop
Es kommt zwar zu keinem Fehler, aber bei 2 Personen mit gleichem Nachnamen (rng) wird mit "Then..." nur der erste Namen berücksichtigt, allerdings dann fälschlicherweise mit einem Eintrag, der zum zweiten Vornamen passt. Da steckt noch ein logischer Fehler drin...??
0 Punkte
Beantwortet von ahorn38 Experte (3.2k Punkte)
Hallo Karin,

vielen Dank! Dein Code funktioniert einwandfrei (bis auf den ersten Datensatz...irgendwie komisch?) da muss ich noch mal gucken.
Gruß
Andreas
0 Punkte
Beantwortet von beverly Experte (3.5k Punkte)
Hi Andreas,

was meinst du mit: "bis auf den ersten Datensatz"?

Bis später,
Karin
0 Punkte
Beantwortet von ahorn38 Experte (3.2k Punkte)
Hallo Karin,

das Problem besteht drin, dass ich zwischen zwei Dateien Daten austauschen will. Die Suchoption läuft über den Namen und den Vornamen.
Im konkreten Fall stimmen die Nachnamen im ersten Datensatz überein, aber nicht die entsprechenden Vornamen, trotzdem wird die "if-Option" ausgeführt, was ja eigentlich nicht passieren dürfte.
Gruß
Andreas
0 Punkte
Beantwortet von beverly Experte (3.5k Punkte)
Hi Andreas,

bei meinem Code läuft das so, dass zuerst nach dem Nachnamen der Zeile iRow der Datei1 (aktuelles Tabellenblatt) in Spalte C der Datei2 (Test.xlsm, Tabellenblatt Daten) gesucht wird - wird dieser gefunden, wird geprüft, ob der Vorname in der Zelle rechts neben der gefundenen Zeile (also in Spalte D) der Datei2 mit dem Vornamen rechts neben der Zelle aus Zeile iRow (also auch Spalte D) der aktuellen Tabelle übereinstimmt. Ist das der der Fall, ist es der gesuchte Name und die Do-Schleife wird verlassen. Stimmen die Vornamen nicht überein, wird der nächste Treffer für den Nachnamen gesucht und dort ebenfalls wieder die Vornamen vergleichen.

Ich habe diesen Code getestet, bevor ich ihn gepostet habe und er funktioniert(e) korrekt - ich kann also leider nicht nachvollziehen, wo bei dir da ein Problem liegen soll.

Bis später,
Karin
0 Punkte
Beantwortet von ahorn38 Experte (3.2k Punkte)
Hallo Karin,

danke für die Erklärung, ich hatte sowieso noch ein Verständnisproblem mit deinem Code, weil ich da noch nicht alle Befehle kannte... Ich guck mir die Sache noch mal genau an und melde mich noch mal.
Vorerst viiiiielen Dank!!!!!!
Andreas
0 Punkte
Beantwortet von ahorn38 Experte (3.2k Punkte)
Hallo Karin,

ich habe das alles ja in einer Schleife, vielleicht liegt auch da mein Fehler...

Hier mal der komplette Code:

Sub karin()

Workbooks("Verein.xlsm").Sheets("Mitglieder").Select


Dim rng As Range
Dim strStart As String
Dim iRow As Integer

iRow = 3
Do Until IsEmpty(Cells(iRow, 2))


Set rng = Workbooks("Test.xlsm").Sheets("Daten").Columns(3).Find( _
what:=Cells(iRow, 4), lookat:=xlWhole, LookIn:=xlValues)
If Not rng Is Nothing Then
strStart = rng.Address
Do
If rng.Offset(0, 1) = Cells(iRow, 4).Offset(0, 1) Then Exit Do
Set rng = Workbooks("Test.xlsm").Sheets("Daten").Columns(3).FindNext(rng)
Loop While Not rng Is Nothing And rng.Address <> strStart
' MsgBox rng.Value & " " & rng.Offset(0, 1).Value
Range(rng.Offset(0, 18), rng.Offset(0, 18)).Value = _
Range(Cells(iRow, 2), Cells(iRow, 2)).Value

End If
Set rng = Nothing

iRow = iRow + 1
Loop

Workbooks("Verein.xlsm").Close

End Sub
0 Punkte
Beantwortet von beverly Experte (3.5k Punkte)
Hi Andreas,

in einer Schleife sieht der Code bei mir so aus:

Dim iRow
Dim lngLetzte As Long
Dim rng As Range
Dim strStart As String
lngLetzte = IIf(IsEmpty(Cells(Rows.Count, 2)), Cells(Rows.Count, 2).End(xlUp).Row, Rows.Count)
For iRow = 3 To lngLetzte
Set rng = Workbooks("Test.xlsm").Sheets("Daten").Columns(3).Find( _
what:=Cells(iRow, 4), lookat:=xlWhole, LookIn:=xlValues)
If Not rng Is Nothing Then
strStart = rng.Address
Do
If rng.Offset(0, 1) = Cells(iRow, 4).Offset(0, 1) Then Exit Do
Set rng = Workbooks("Test.xlsm").Sheets("Daten").Columns(3).FindNext(rng)
Loop While Not rng Is Nothing And rng.Address <> strStart
MsgBox rng.Value & " " & rng.Offset(0, 1).Value
End If
Set rng = Nothing
Next iRow


Und er findet die richtigen Namen mit den passenden Vornamen.

Bis später,
Karin
...