Как выполнить поиск нескольких подстрок в ячейке с помощью UsedRange.Найти (что:=, посмотрите:=)

#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* и просмотреть на другом листе. Я делаю это на обоих листах, потому что у некоторых могут быть средние имена на одном, у некоторых могут быть средние имена на другом.

Если только один из листов имеет средние имена, это становится намного проще, вы выполняете ВПР с подстановочными знаками с листа без средних имен на лист, который может иметь средние имена.