Я хочу узнать, соответствует ли конкретная группа ячеек другой группе ячеек на другом листе, используя VBA. В моем случае мне нужно выяснить, соответствуют ли ячейки lastName, firstName
. В моем решении, которое я придумал, я просматриваю первую таблицу, получая имя сотрудника. Затем прокрутите вторую таблицу, получив имя сотрудника. Затем посмотрим, совпадут ли эти два. Этот метод слишком дорогостоящий и занимает слишком много времени. Есть ли лучший способ сделать это?Поиск, если ячейка столбца равна другой в другом листе
Моя первая таблица содержит 6 строк, моя вторая таблица может содержать более 100 строк. Слишком много времени тратится впустую.
Я думал о простом поиске по всему столбцу, чтобы узнать, совпадает ли фамилия в первую очередь, если да, тогда перейдите и посмотрите, совпадает ли первое имя ... но опять же могут быть люди с такая же фамилия ..
Вот что у меня есть до сих пор.
For i = 2 To managerRows 'Looping through the Managers Table
empFirst = managerSheet.Cells(i, 1)
empLast = managerSheet.Cells(i, 2)
empName = (empLast & ", " & empFirst)
For j = 3 To assignRows 'Looping through the Assignments table
empLastAssign = assignSheet.Cells(i, 4)
empFirstAssign = assignSheet.Cells(i, 5)
empNameAssign = (empLastAssign & ", " & empFirstAssign)
'MsgBox (empNameAssign)
...
Conditional statement comparing names
...
Next j
Next i
Я знаю, что у меня нет условного оператора, я не стал писать, потому что я знал, что этот подход не является лучшим вариантом.
Я не могу добавить еще один столбец, чтобы объединить имена вторых листов, потому что они считываются из базы данных и хранятся в отдельных столбцах, фамилии и имени. В любом случае, есть ли способ, которым я могу объединить имена , не добавляя еще один столбец ко второму листу и попытаться найти их таким образом? Имеет ли это смысл?
Find
будет выглядеть только в одной колонке, если я не ошибаюсь. Может ли это выглядеть пополам?
UPDATE
Я смог получить первое вхождение фамилии, но не другие. Я добавил еще одно поле для соответствия. Итак, теперь есть три поля. Last Name
, First Name
, и Project Name
. Пока мой код найдет только первое событие и останется там. Я думаю, что мой порядок цикла неправильный.
Вот что у меня есть.
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
Посмотрите на мой новый цикл 'Is this in the wrong place?
.
UPDATE 2: решаемые
Я успешно фильтруют на трех колонках с использованием find
и findNext
. С помощью хороших ответов. Я отправлю завершенную версию. Мне пришлось добавить лишние выражения в мои фильтры, чтобы перейти к следующему найденному лину. Надеюсь, что другие могут узнать из этого, так как нет четкого ответа на фильтрацию по трем столбцам с использованием find
.
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
Вы можете попробовать 'WorksheetFunction.Vlookup' – JamesFaix
Вы можете сортировать данные в "большом" листе? (BTW: 100+ строк не является большим числом строк!) – user3598756