VBA Excel - Как отображать неравные значения в массиве Excel - PullRequest
0 голосов
/ 03 ноября 2019

two

Так что в настоящее время у меня есть два входа DATA в Excel Data 1 и Data 2 Мне нужна формула или какой-то вид для отображения результатов * в настоящее время это ручной процесс.

Ответы [ 3 ]

2 голосов
/ 04 ноября 2019

Если вы используете Excel 2016 или Office 365 с функцией TEXTJOIN, вы можете сделать это с помощью формулы массива

=TEXTJOIN(", ",,FILTERXML("<t><s>" & SUBSTITUTE(SUBSTITUTE(TEXTJOIN(",",TRUE,Data_1,Data_2)," ",""),",","</s><s>") & "</s></t>","//s[not( .=preceding::*) and not(.=following::*)]"))

Поскольку это формула массива, вынужно «подтвердить» это, удерживая ctrl + shift при нажатии , ввести . Если вы сделаете это правильно, Excel поместит фигурные скобки {...} вокруг формулы, как показано в строке формул

enter image description here

  • TEXTJOINстроки, использующие разделитель запятых
    • Если есть только две или три строки, вы можете использовать простую конкатенацию и избежать функции TEXTJOIN, но вам все равно нужен Excel 2013+, чтобы иметь FILTERXML функция
  • Удалить пробелы. Если все разделители равны <comma><space>, мы могли бы немного упростить формулу.
  • Создать XML, используя <comma> для определения узлов.
  • * xPathговорит, что возвращает все узлы, за которыми не следует или не предшествует его дубликат.
  • TEXTJOIN результирующий массив
1 голос
/ 03 ноября 2019

Подход с использованием функции 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

0 голосов
/ 03 ноября 2019
Function TEST(aString As String, aString2 As String, Optional Delimiter As String = ",") As String
    array1 = Split(aString, Delimiter)
    array2 = Split(aString2, Delimiter)

    Dim i 'As Integer
    Dim j 'As Integer
    Dim isFound 'As Boolean
    Dim output

    For i = 0 To UBound(array1)
        isFound = False
        For j = 0 To UBound(array2) - 1
            If array1(i) = array2(j) Then
                isFound = True
            End If
        Next 'j
        If Not isFound Then
            output = output + array1(i) & ", "
        End If
    Next 'i

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