
У меня есть рабочий лист, в котором в столбце A указаны различные имена в разных форматах:
A1 Джон Смит
A2 Джонс, Мэри
A3 Салли Гомес
A4 Семья Гонсалес
В столбце B указаны похожие данные:
B1 Семейный траст Смит
B2 Боб и Мэри Джонс
B3 Блэквелл, Джон
B4 Лус Гонсалес
Я хотел бы определить случаи, когда в столбце A и столбце B встречается одна и та же фамилия. В приведенных выше примерах формула, если ее поместить в столбец C, даст результат
C1 ИСТИНА (потому что «Смит» встречается и в A1, и в B1)
C2 ИСТИНА (потому что «Джонс» встречается и в A2, и в B2)
C3 ЛОЖЬ (потому что между A3 и B3 нет общих слов)
C4 ИСТИНА (потому что «Гонсалес» встречается и в A4, и в B4)
Возможно ли это вообще?
решение1
Учитывая ваши комментарии, а также ваш вопрос, похоже, вы хотите вернуть TRUE, если любое слово в одной фразе совпадает со словом в соседней фразе. Один из способов сделать это — использовать определяемую пользователем функцию (VBA). Следующий код исключает все слова, которые находятся в arrExclude
, которые вы можете добавлять по своему усмотрению. Он также исключит все символы, которые не являются буквами, цифрами или пробелами, и все слова, которые состоят только из одного символа.
Посмотрите, подойдет ли это вам.
Другой вариант — взглянуть на бесплатную надстройку нечеткого поиска, предоставляемую MS для Excel версии 2007 и более поздних.
Чтобы ввести эту пользовательскую функцию (UDF), alt-F11
откройте редактор Visual Basic. Убедитесь, что ваш проект выделен в окне Project Explorer. Затем в верхнем меню выберите Insert/Module
и вставьте код ниже в открывшееся окно.
Чтобы использовать эту пользовательскую функцию (UDF), введите формулу, например:
=WordMatch(A1,B1)
в какой-то камере.
ПРАВКА2: Find Matches
сегмент изменен, чтобы проверить, будет ли он работать лучше на Mac
Option Explicit
Option Base 0
Option Compare Text
Function WordMatch(S1 As String, S2 As String) As Boolean
Dim arrExclude() As Variant
Dim V1 As Variant, V2 As Variant
Dim I As Long, J As Long, S As String
Dim RE As Object
Dim sF As String, sS As String
'Will also exclude single letter words
arrExclude = Array("The", "And", "Trust", "Family", "II", "III", "Jr", "Sr", "Mr", "Mrs", "Ms")
'Remove all except letters, digits, and spaces
'remove extra spaces
'Consider whether to retain hyphens
Set RE = CreateObject("vbscript.regexp")
With RE
.Pattern = "[^A-Z0-9 ]+|\b\S\b|\b(?:" & Join(arrExclude, "|") & ")\b"
.Global = True
.ignorecase = True
End With
With WorksheetFunction
V1 = Split(.Trim(RE.Replace(S1, "")))
V2 = Split(.Trim(RE.Replace(S2, "")))
End With
'Find Matches
If UBound(V1) <= UBound(V2) Then
sS = " " & Join(V2) & " "
For I = 0 To UBound(V1)
sF = " " & V1(I) & " "
If InStr(sS, sF) > 0 Then
WordMatch = True
Exit Function
End If
Next I
Else
sS = " " & Join(V1) & " "
For I = 0 To UBound(V2)
sF = " " & V2(I) & " "
If InStr(sS, sF) > 0 Then
WordMatch = True
Exit Function
End If
Next I
End If
WordMatch = False
End Function
РЕДАКТИРОВАТЬ:Вот скриншот результатов, на котором показаны как ваши исходные примеры, так и примеры, которые вы привели в комментарии ниже, где указали, что у вас возникла проблема.
решение2
Самая сложная часть этого упражнения — определить, что в столбце A является фамилией. В вашем примере это либо:
- Первое слово, если в имени есть запятая
- Второе слово
Если это правило верно, то вы можете просто воспользоваться такой формулой:
=NOT(ISERROR(FIND(last_name, B1:B4)))
Формула для определения фамилии немного сложнее. По сути, вам нужно выяснить, в каких позициях символов находятся пробелы, а затем вытащить буквы между ними. Есть хорошее объяснение в этой теме:
решение3
В ячейке C1 используйте эту формулуСвязь
=IF(VLOOKUP(B1:B4,A:A,1)=B1,"",B1)
решение4
Выделите оба столбца > условное форматирование (вкладка «Главная») > правила выделения ячеек > дублирующиеся значения. Это выделит все дубликаты в обоих столбцах.
Убедитесь, что вы выделяете столбцы, а не ячейки.