Ich möchte herausfinden, ob eine bestimmte Gruppe von Zellen mit einer anderen Gruppe von Zellen in einem anderen Blatt mit VBA übereinstimmen. In meinem Fall muss ich herausfinden, ob die lastName, firstName
Zellen übereinstimmen. In meiner Lösung, die ich gefunden habe, durchlaufe ich die erste Tabelle und erhalte den Namen des Mitarbeiters. Durchlaufen Sie dann die zweite Tabelle, um den Namen des Mitarbeiters zu erhalten. Dann sehen, ob die beiden zusammenpassen. Diese Methode ist zu teuer und dauert zu lange. Gibt es einen besseren Weg, dies zu tun?Finden, ob eine Spalte Zelle gleich einem anderen in einem anderen Blatt
Meine erste Tabelle enthält 6 Zeilen, meine zweite Tabelle kann mehr als 100 Zeilen enthalten. Zu viel Zeit ist verschwendet.
Ich dachte daran, nur die gesamte Spalte zu durchsuchen, um zu sehen, ob der Nachname zuerst passt, wenn ja, dann geh und sieh nach, ob der Vorname passt ... aber andererseits könnte es auch Leute geben selbe Nachname ..
Hier ist was ich bisher habe.
Ich weiß, ich habe keine bedingte Aussage, ich habe nicht die Mühe zu schreiben, weil ich wusste, dass dieser Ansatz nicht der beste ist.
Ich kann keine weitere Spalte hinzufügen, um die Namen der zweiten Blätter zu verketten, weil sie aus einer Datenbank gelesen und in separaten Spalten und Nachnamen und Vornamen geführt werden. Wie auch immer, gibt es einen Weg, dass ich die Namen verketten kann, ohne eine weitere Spalte auf dem zweiten Blatt hinzuzufügen und versuche, sie so zu finden? Ist das sinnvoll?
Find
wird nur in einer Spalte aussehen, wenn ich mich nicht irre. Kann es in zwei aussehen?
UPDATE
Ich bin in der Lage das erste Vorkommen des Nachnamens zu bekommen, aber nicht die anderen. Ich habe ein anderes Feld hinzugefügt. Es gibt also drei Felder, die jetzt zusammenpassen. Last Name
, First Name
und Project Name
. Bis jetzt wird mein Code nur das erste Vorkommen finden und dort bleiben. Ich denke, meine Reihenfolge der Schleifen ist falsch.
Hier ist was ich bisher habe.
For i = 2 To managerRows 'Looping through the Managers Table
empLast = managerSheet.Cells(i, 1)
empFirst = managerSheet.Cells(i, 2)
empName = (empLast & ", " & empFirst)
projectName = managerSheet.Cells(i, 3)
managerLast = managerSheet.Cells(i, 4)
managerFirst = managerSheet.Cells(i, 5)
managerName = (managerLast & ", " & managerFirst)
Set findRow = assignSheet.Range(assignSheet.Cells(3, 4), assignSheet.Cells(assignRows, 4)) 'Set a range to look for Last Name
Set c = findRow.Find(empLast, LookIn:=xlValues) 'Find matching Last Name if it exists
If Not c Is Nothing Then 'Last Name found
Do Until c Is Nothing 'Is this in the wrong place?
If Cells(c.Row, 5) = empFirst Then 'If first name matches
If Cells(c.Row, 10) = projectName Then 'If project name matches. We found them
MsgBox ("Found: " & empLast & ", " & empFirst & ": Project: " & projectName & " : in: " & c.Row)
End If
End If
Set c = findRow.FindNext(c) 'Is this is the wrong place?
Loop
End If
Set c = Nothing 'Is this in the wrong place?
Next i
Werfen Sie einen Blick auf 'Is this in the wrong place?
für meine neue Schleife.
UPDATE 2:
ich erfolgreich auf drei Säulen gefiltert haben Gelöst find
und findNext
verwenden. Mit Hilfe einiger guter Antworten. Ich werde die fertige Version veröffentlichen. Ich musste extra else-Anweisungen in meine Filter einfügen, um zum nächsten gefundenen Ling zu gelangen. Hoffentlich können andere davon lernen, da es keine klare Antwort für das Filtern auf drei Spalten unter Verwendung find
gibt.
For i = 2 To managerRows 'Looping through the Managers Table
empLast = managerSheet.Cells(i, 1)
empFirst = managerSheet.Cells(i, 2)
empName = (empLast & ", " & empFirst)
projectName = managerSheet.Cells(i, 3)
managerLast = managerSheet.Cells(i, 4)
managerFirst = managerSheet.Cells(i, 5)
managerName = (managerLast & ", " & managerFirst)
'Focus Below this
Set findRow = assignSheet.Range(assignSheet.Cells(3, 4), assignSheet.Cells(assignRows, 4)) 'Set a range to look for Last Name
Set c = findRow.Find(empLast, LookIn:=xlValues) 'Find matching Last Name if it exists
If Not c Is Nothing Then 'Last Name found
Do Until c Is Nothing
If Cells(c.Row, 5) = empFirst Then 'If first name matches
If Cells(c.Row, 10) = projectName Then 'If project name matches. We found them
MsgBox ("Found: " & empLast & ", " & empFirst & ": Project: " & projectName & " : in: " & c.Row)
Set c = Nothing
Else
Set c = findRow.FindNext(c)
End If
Else
Set c = findRow.FindNext(c)
End If
Loop
End If
Next i
Sie könnten versuchen, 'WorksheetFunction.Vlookup' – JamesFaix
Können Sie Daten in der "großen" Blatt sortieren? (BTW: 100+ Zeilen ist überhaupt keine große Zeilennummer!) – user3598756