Подход с использованием функции Filter()
Function test(ByVal a, ByVal b, Optional Delim$ = ",") As String
'Purpose: return non unique values by comparing two comma separated string lists a vs. b
a = Split(a, Delim): b = Split(b, Delim)
Dim elem
For Each elem In b
a = Filter(a, elem, False) ' Include:=False, i.e. exclude non uniques
Next elem
test = Join(a, Delim & " ")
End Function
Аргумент:
Строка результата 669, 781, 893, 894, 895
КСТАТИ результат не должен включать 782 (ср. ОП), поскольку это не такэто уникальный предмет
Caveat / Edit
Приведенный выше подход предполагает использование только трех цифр. Поскольку в основном функция Filter
выполняет частичный поиск , это приведет к нежелательным результатам, если вы будете искать, например, 7
, исключая, таким образом, любое число, содержащее 7
. ~~> См. Исправленный код
Исправленный код
Разрешает только полные совпадения строк:
Вариант a) 2-й список содержит дублеты, ноявляется только подмножеством 1-го списка
Function test(ByVal a, ByVal b, Optional Delim$ = ",") As String
'Purpose: return non unique values by comparing two comma separated string lists a vs. b
a = "$" & Replace(a, Delim, "$" & Delim & "$") & "$"
a = Split(a, Delim): b = Split(b, Delim)
Dim elem
For Each elem In b
a = Filter(a, "$" & elem & "$", False) ' Include:=False, i.e. exclude non uniques
Next elem
test = Replace(Join(a, Delim & " "), "$", vbNullString)
End Function
Вариант б) 2-й список содержит также новые номера, отличающиеся от 1-го списка
Это может быть водонепроницаемыйрешение вашего вопроса (результаты, соответствующие точному решению @RonRosenfeld).
Function test(ByVal a, ByVal b, Optional Delim$ = ",", Optional ByVal cnt% = 1) As String
'Purpose: return non unique values by comparing two comma separated string lists a vs. b
If cnt = 1 Then ' recursive call to check 2nd string against 1st one
test = test(b, a, Delim, 2)
If Len(test) > 1 Then test = Mid(test, 1, Len(test) - 1)
End If
a = "$" & Replace(a, Delim, "$" & Delim & "$") & "$"
a = Split(a, Delim): b = Split(b, Delim)
Dim elem
For Each elem In b
a = Filter(a, "$" & elem & "$", False) ' Include:=False, i.e. exclude non uniques
Next elem
test = Replace(Join(a, Delim), "$", vbNullString) & Delim & test
If cnt = 0 Then test = Replace(test, Delim, Delim & " ") ' add blank after delimiters
End Function