Как искать несколько подстрок в ячейке, используя UsedRange.Find (What: =, LookAt: =) - PullRequest
0 голосов
/ 17 апреля 2019

У меня есть две таблицы Excel, в которых перечислены имена людей в разных форматах.
На одном листе перечислены имена, отформатированные как «First Last», упорядочены имена по отделам и не указаны их идентификационные номера. На другом листе перечислены имена, отформатированные как «Last, First», упорядочены в алфавитном порядке, не отображается их отдел и указан их идентификационный номер.

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

Например: На листе 1 указано имя «Джон Смит» На листе 2 указано имя «Смит-младший, Джон»

В этом примере я бы искал на листе 2 слова «Смит, Джон» и не дал результатов.

К сожалению, этими листами управляют другие люди, поэтому я не могу вносить изменения в листы.

Здесь я разделил имя от листа 1 и отформатировал его как лист 2.

Dim nameTemp() As String = Split(CType(curSheet.Range("J" & 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.Find, если это возможно.

Я пробовал:

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 Ответ

0 голосов
/ 17 апреля 2019

Не ответ, но слишком длинный, чтобы быть комментарием.

Обычно, когда я сталкиваюсь с подобными проблемами, я сначала пытаюсь сделать так, чтобы имена на обоих листах следовали следующему формату: Last, First Middle. После этого я делаю vLookup на обоих листах друг с другом, используя подстановочный знак:

VLOOKUP(MID(FullName, 1, LEN(FullName)*.90))&"*", Range, 1, FALSE)

Это обрезает имена до 90%, если в одном списке есть отчество / инициалы, а в другом нет. Так что потребуется Смит, Джон младший, обрезать его до Smith, Joh* и VLookup, что на другом листе. Я делаю это на обоих листах, потому что у некоторых могут быть отчества на одном, у других могут быть отчества на другом.

Если только один из Листов имеет отчество, становится намного проще, вы делаете подстановочный знак VLOOKUP из листа без отчеств в лист, который может иметь отчество.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...