2015-03-04 7 views
1

У меня есть список, содержащий идентификатор сотрудника в Col A, имя в Col B, фамилия в поле Col C. Мне нужно написать макрос, который дает форму пользователя для ввода First и last Фамилия и оттуда он поместит правильный идентификатор сотрудника в первую неиспользуемую ячейку в Col E, а затем вернется к пользовательской форме.Поиск идентификатора на основе имени и фамилии

Я уже знаю, как создать Userform, и на нем будут две кнопки, которые читают «Далее» и одну, которая читает «Конец». Кнопка «Далее» зациклирует Userform, а «End» просто закроет Userform.

Планируйте оставить Userform с именем Userform1 и обозначить поля ввода как «FirstName» и «LastName». Поэтому я знаю, что для ссылки на них из макроса я бы назвал Userform1.FirstName.Value или Userform1.LastName.Value в зависимости от того, какую часть мне нужно в данный момент.

Часть, на которую я не уверен, это как сопоставление двух переменных, а затем поиск влево для идентификатора. Я могу переместить идентификатор Col, чтобы он был после имени Cols, если это помогает, но я все еще не уверен, как писать, чтобы оба имени совпадали.

Что касается захвата ошибок, то я планировал иметь состояние MsgBox «Нет соответствующих записей». Если человек не существует в списке. Однако я не уверен, как справиться с супер маловероятной, но возможной ситуацией, если два человека в списке имеют одинаковое имя. Поэтому любые предложения по этому поводу будут очень признательны.

Я использую Excel 2013.

ответ

2

Попробуйте это для следующей кнопки

Private Sub NextButton_Click() 

Dim emptyRow As Long 
Dim matchFound As Boolean 
Dim matchCount As Long 
Dim matchRow As Long 
Dim i As Long 

'Determine the first empty cell in column E 
If Cells(1, 5).Value = "" Then 
    emptyRow = 1 
Else 
    emptyRow = Cells(Columns(5).Rows.Count, 5).End(xlUp).Row + 1 
End If 

matchFound = False 
matchCount = 0 
matchRow = 0 

'Loop through all of rows that have an employee id 
For i = 1 To Cells(Columns(1).Rows.Count, 1).End(xlUp).Row 
    If (UCase(FirstName.Value) = UCase(Cells(i, 2).Value)) And (UCase(LastName.Value) = UCase(Cells(i, 3).Value)) Then 
     matchCount = matchCount + 1 
     matchRow = i 
     matchFound = True 
    End If 
Next 

'Alert user of any errors 
If matchFound = False Then 
    MsgBox ("There are no matching entries") 
ElseIf matchCount > 1 Then 
    MsgBox ("There were multiple matches") 
Else 
'If there are no errors add employee id to the list 
    Cells(emptyRow, 5).Value = Cells(matchRow, 1).Value 
    emptyRow = emptyRow + 1 
End If 

'Clear the userform 
FirstName.Text = "" 
LastName.Text = "" 

End Sub 

я не уверен, что лучший курс действий, чтобы принять, если есть несколько матчей, так что сейчас я просто включил сообщение, чтобы предупредить об этом. Трудно было бы изменить код для отслеживания каждой из согласованных строк, а не только последней.

+0

Это идеальное решение для того, что мне нужно, спасибо вам, сэр. Один вопрос, хотя я этого раньше не видел: что делает UCase? –

+1

Это изменение всех символов в верхнем регистре, поэтому сравнение не чувствительно к регистру. –

+0

Идеальное мышление –

0

Я бы предложил использовать vlookup, поскольку он в основном разработан вокруг вашей проблемы. Он принимает вход, находит его в одном столбце, затем выводит ту же строку в другой столбец. Не должно быть сложно сделать вывод зависимым от двух vlookups, соответствующих одному и тому же выводу.

http://www.howtogeek.com/howto/13780/using-vlookup-in-excel/

Смежные вопросы