Если у вас O365 или Excel 2016 с функцией TEXTJOIN
:
=NOT(ISERROR(FILTERXML("<t><s>" &TEXTJOIN("</s><s>",TRUE,TRIM(B2),TRIM(C2),SUBSTITUTE(TRIM(D2),"; ","</s><s>"))& "</s></t>","//s[.=./following-sibling::*]")))
Если у вас нет TEXTJOIN
, но есть FILTERXML
, вы можете использовать:
=NOT(ISERROR(FILTERXML("<t><s>"&TRIM(B2)&"</s><s>"&TRIM(C2)&"</s><s>"&SUBSTITUTE(TRIM(D2),"; ","</s><s>")&"</s></t>","//s[.=./following-sibling::*]")))
Мы создаем XML всех имен в отдельных узлах, а затем ищем дубликаты.
Без NOT(ISERROR(…
часть, формула будет возвращать имя дубликата (или массив имен, если существует более одного набора дубликатов).
ПРИМЕЧАНИЕ: Формула зависит от разделителя вСтолбец D составляет ;
(semicolon-space
).Если пробел не всегда будет присутствовать, формуле потребуется модификация, чтобы удалить ее, если она есть (вложенные заменители или TRIM'ы сделают это).
например,
=NOT(ISERROR(FILTERXML("<t><s>"&TRIM(B11)&"</s><s>"&TRIM(C11)&"</s><s>"&SUBSTITUTE(SUBSTITUTE(TRIM(D11),"; ",";"),";","</s><s>")&"</s></t>","//s[.=./following-sibling::*]")))
Результаты второго теста
Если у вас более ранняя версия Excel и вы можете использовать решение VBA, попробуйте:
Option Explicit
Function hasDups(rg As Range, Optional sDelim As String = ";") As Boolean
Dim myDict As Object
Dim x, y, s As String, i As Long, c As Range
Set myDict = CreateObject("scripting.dictionary")
For Each c In rg
x = Split(c.Value2, sDelim)
For Each y In x
If Len(Trim(y)) > 0 Then
If Not myDict.exists(Trim(y)) Then
myDict.Add Trim(y), y
Else
hasDups = True
Exit Function
End If
End If
Next y
Next c
End Function