Страницы: 1
RSS
Сопоставление двух массивов при перепутанных имени и фамилии
 
Всем привет!
Такая проблема - с разных сайтов имена людей выгружаются по-разному, с одного Фамилия+Имя с другого Имя+Фамилия. Заранее количество слов в Имени или Фамилии не известно. Возможны однофамильцы и полное совпадение по имени и фамилии.
Нужно сопоставить два списка из столбцов D и J, т.е. в столбце С верно проставить клиентов из столбца J в зависимости от столбца D. Там где однозначно указать верный ответ не возможно, указать количество вариантов, или еще как-то обозначить проблему. (это лучше в каком-то другом столбце, не С)
 
HiHiAndrey, здравствуйте! Все хорошо, но есть одна маленькая проблема: как объяснить программе, что "Смит" - это имя, а не фамилия? Как вариант- таблица соответствий, но кроме Вас ее навряд ли кто сделает  :)  
 
Отсортируйте в обоих столбцах слова в ячейках, сравнивайте эти сортированные. Заодно ещё и лишние пробелы по концам и внутри можно убить, если вдруг будут.
Изменено: Hugo - 12.12.2018 19:14:48
 
Так нужно?
Код
=ВПР(ПСТР(D8&" "&D8;ПОИСК(" ";D8)+1;ДЛСТР(D8));J$8:J$99;1;)
Алексей М.
 
Цитата
АlехМ написал:
Так нужно?
Почти) хотелось бы, наоборот, искать людей из столбца J в массиве D.
Пусть результат сопоставления будет в столбце L. Там не везде будет однозначно совпадать, но с этим ничего пока не сделать.
Нужно наверное искать совпадения по первому слову и по последнему.
 
Мой пост только я вижу? Вероятно нет смысла тратить время на эту тему...
 
HiHiAndrey,

Вариант в PQ во вложении:
 
Код
Sub FindThis()
  Dim re, ar, s$, i&, j&, nm
  ar = Range(Cells(8, 3), Cells(8, 4).End(xlDown)).Value
  s = Join(WorksheetFunction.Transpose(Range(Cells(8, 10), Cells(8, 10).End(xlDown)).Value), ":")
  Set re = CreateObject("VBScript.RegExp"):  re.Global = True:  re.IgnoreCase = True
  For i = 1 To UBound(ar)
    re.Pattern = Replace(Trim(ar(i, 2)), ".", "\."):  nm = Split(re.Pattern)
    If UBound(nm) = 1 Then
      re.Pattern = re.Pattern & "|" & nm(1) & " " & nm(0)
    Else
      re.Pattern = re.Pattern & "|" & nm(0) & " " & nm(2) & " " & nm(1) & "|" _
      & nm(1) & " " & nm(0) & " " & nm(2) & "|" & nm(1) & " " & nm(2) & " " & nm(0) & "|" _
      & nm(2) & " " & nm(0) & " " & nm(1) & "|" & nm(2) & " " & nm(1) & " " & nm(0)
    End If
    If re.test(s) Then ar(i, 1) = re.Execute(s)(0)
  Next
  Cells(8, 3).Resize(UBound(ar), 2).Value = ar
End Sub
Изменено: Ігор Гончаренко - 12.12.2018 20:00:04
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Hugo,вижу.

HiHiAndrey, Тогда так
Код
=ВПР(ПСТР(J8&" "&J8;ПРОСМОТР(2;1/(ПСТР(J8;СТРОКА($1:$99);1)=" ");СТРОКА($1:$99))+1;ДЛСТР(J8));D$8:D$99;1;)
Алексей М.
 
Всем большое спасибо! Задача решена
Страницы: 1
Наверх