#excel #vb.net
#excel #vb.net
Вопрос:
У меня есть две электронные таблицы Excel, в которых перечислены имена пользователей в разных форматах.
На одном листе перечислены имена в формате «First Last», упорядочены имена по отделам и не указаны их идентификационные номера. На другом листе перечислены имена в формате «Последнее, первое», упорядочены по алфавиту, не отображается их отдел и отображается их идентификационный номер.
Что мне нужно сделать, так это получить имена и идентификационные номера людей из определенных отделов. Перестановка имени и фамилии для соответствия не была проблемой. Проблема, с которой я сталкиваюсь, заключается в том, что иногда имена не совпадают.
Например: на листе 1 указано имя как «Джон Смит», на листе 2 указано имя как «Смит-младший, Джон»
В этом примере я бы искал в листе 2 «Смит, Джон» и не дал никаких результатов.
К сожалению, этими листами управляют другие люди, поэтому я не могу вносить изменения в листы.
Здесь я разделяю имя с листа 1 и форматирую его как лист 2.
Dim nameTemp() As String = Split(CType(curSheet.Range("J" amp; xlRow).Value, String))
name = Trim(nameTemp(1)) ", " Trim(nameTemp(0))
Здесь я ищу совпадения на втором листе. При этом отсутствуют любые имена, имеющие Jr, III, II и т.д. указан на втором листе, но не на первом.
idRange = curSheet.UsedRange.Find(What:=name, LookAt:=XlLookAt.xlPart)
То, что я искал, — это способ поиска ячеек, содержащих обе подстроки:
nameTemp(0) and nameTemp(1)
Используя UsedRange.Найдите метод, если это вообще возможно.
Я пробовал:
idRange = curSheet.UsedRange.Find(What:=(nameTemp(0) And nameTemp(1)), LookAt:=XlLookAt.xlPart)
И
idRange = curSheet.UsedRange.Find(What:=nameTemp(0)What:=nameTemp(1), LookAt:=XlLookAt.xlPart)
И другие сценарии, которые я не документировал.
Комментарии:
1. В этом случае вам нужно выполнить два отдельных поиска, вы не можете поместить две вещи в одно «Что».
2. Итак, найдите диапазоны для первого имени, затем найдите диапазоны для второго имени, а затем выполните пересечение или что-то подобное?
3. Если вы хотите проверить, найдены ли оба, вы просто проверяете, что оба диапазона
Not Nothing
. Однако у вас возникнут проблемы с непоследовательным текстом и т. Д.
Ответ №1:
Не ответ, но слишком длинный, чтобы быть комментарием.
Обычно, когда я сталкиваюсь с подобными проблемами, я сначала пытаюсь сделать так, чтобы имена на обоих листах соответствовали следующему формату: последний, первый средний. Как только я добьюсь этого, я выполняю ВПР на обоих листах друг с другом, используя подстановочный знак:
VLOOKUP(MID(FullName, 1, LEN(FullName)*.90))amp;"*", Range, 1, FALSE)
Это сокращает имена до 90%, на случай, если в одном списке есть отчества / инициалы, а в другом их нет. Таким образом, потребуется Smith, John Jr, обрезать его Smith, Joh*
и просмотреть на другом листе. Я делаю это на обоих листах, потому что у некоторых могут быть средние имена на одном, у некоторых могут быть средние имена на другом.
Если только один из листов имеет средние имена, это становится намного проще, вы выполняете ВПР с подстановочными знаками с листа без средних имен на лист, который может иметь средние имена.