Разделите и сравните объединенные строки в Excel - PullRequest
0 голосов
/ 05 апреля 2020

Рассмотрим следующие 2 ячейки со связанными строками:

    +------------+------------+------------+------------+
    |     A      |     B      |      C           D      |
+-- +------------+------------+------------+------------+
| 1 | A, B, C, D |  A, B, E   |            |            |
+---+------------+------------+------------+------------+

Мне нужно сравнить значения в A1 и B1 следующим образом:

  • in C1: имена, которые находятся в A1, но не в B1 (здесь: C, D)
  • в D1: имена, которые находятся в B1, но не в A1 (здесь: E

Имена - это всегда одно слово, а имена разделяются , (запятая).

Таким образом, желаемый вывод:

    +------------+------------+------------+------------+
    |     A      |     B      |      C           D      |
+-- +------------+------------+------------+------------+
| 1 | A, B, C, D |  A, B, E   | C, D       | E          |
+---+------------+------------+------------+------------+

Есть ли способ сделать это в Excel? Любая помощь будет принята с благодарностью!

Ответы [ 3 ]

1 голос
/ 05 апреля 2020

Сравнение строк с разделителями

enter image description here

Option Explicit

Function Split2(String1 As String, String2 As String, _
  Optional First1Second2 As Long = 1, _
  Optional Unique As Boolean = True, _
  Optional SourceDelimiter As String = ", ", _
  Optional TargetDelimiter As String = ", ") As String

    Dim vnt1 As Variant   ' First Source Array
    Dim vnt2 As Variant   ' Second Source Array
    Dim vntT As Variant   ' Target Array
    Dim i1 As Long        ' First Array Elements Counter
    Dim i2 As Long        ' Second Array Elements Counter
    Dim iT As Long        ' Target Array Elements Counter
    Dim strW As String    ' Current Write String

    ' Split Strings to Arrays.
    vnt1 = Split(String1, SourceDelimiter)
    vnt2 = Split(String2, SourceDelimiter)
    iT = -1

    ' Check arguments to redirect to appropriate subroutine.
    If Unique Then
        Select Case First1Second2
            Case 1: GoSub Compare1
            Case 2: GoSub Compare2
            Case Else
        End Select
    Else: GoSub Compare3: End If

    ' Join values from Target Array to resulting string.
    If iT > -1 Then Split2 = Join(vntT, TargetDelimiter)

Exit Function

Compare1:
    ' Calculate unique values in First String.
    For i1 = 0 To UBound(vnt1)
        For i2 = 0 To UBound(vnt2)
            If vnt1(i1) = vnt2(i2) Then Exit For
        Next
        If i2 > UBound(vnt2) Then strW = vnt1(i1): GoSub WriteToTarget
    Next
    Return

Compare2:
    ' Calculate unique values in Second String.
    For i2 = 0 To UBound(vnt2)
        For i1 = 0 To UBound(vnt1)
            If vnt2(i2) = vnt1(i1) Then Exit For
        Next
        If i1 > UBound(vnt1) Then strW = vnt2(i2): GoSub WriteToTarget
    Next
    Return

Compare3:
    ' Calculate same values in both strings.
    For i1 = 0 To UBound(vnt1)
        For i2 = 0 To UBound(vnt2)
            If vnt1(i1) = vnt2(i2) Then strW = vnt1(i1): _
              GoSub WriteToTarget: Exit For
        Next
    Next
    Return

WriteToTarget:
    ' Write current Write String to Target Array.
    iT = iT + 1
    If iT > 0 Then
        ReDim Preserve vntT(iT)
    Else: ReDim vntT(0): End If
    vntT(iT) = strW
    Return

End Function
1 голос
/ 06 апреля 2020

Это более простой подход, дайте мне знать, если я неправильно понимаю проблему:

  • Split(rngRemove, ","), чтобы сделать l oop и заменить строку, если она существует.
  • replace все "," by " " (многие созданные пробелы будут обработаны с trim command позже)
  • L oop и заменить
  • удалить unnecessary spaces и заменить их обратно на ","

Вот код:

Function GetString(rng As Range, rngRemove As Range) As String
    Dim j: j = Split(rngRemove, ",")
    Dim str_first As String: str_first = Replace(rng, ",", " ")

        For Each Item In j
            str_first = Replace(str_first, Item, "")
        Next

    GetString = Replace(Trim(str_first), " ", ",")  
End Function

enter image description here

1 голос
/ 05 апреля 2020

Если у вас Windows Excel 2010+, вы можете использовать Power Query с пользовательским столбцом, использующим функцию List.RemoveMatchingItems.

  • Получить данные с помощью Get & Transform из таблицы.
  • Добавить два пользовательских столбца:

    • Формула для 1: List.RemoveMatchingItems(Text.Split([Column1],","),Text.Split([Column2],","))
    • Формула для 2: List.RemoveMatchingItems(Text.Split([Column2],","),Text.Split([Column1],","))
  • Выберите двуглавую стрелку в верхней части новых столбцов и

    • извлеките значения с запятой в качестве разделителя

М-код

    Source = Excel.CurrentWorkbook(){[Name="Table6"]}[Content],
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Column1", type text}, {"Column2", type text}}),
    #"Added Custom" = Table.AddColumn(#"Changed Type", "Custom", each List.RemoveMatchingItems(Text.Split([Column1],","),Text.Split([Column2],","))),
    #"Extracted Values" = Table.TransformColumns(#"Added Custom", {"Custom", each Text.Combine(List.Transform(_, Text.From), ","), type text}),
    #"Added Custom1" = Table.AddColumn(#"Extracted Values", "Custom.1", each List.RemoveMatchingItems(Text.Split([Column2],","),Text.Split([Column1],","))),
    #"Extracted Values1" = Table.TransformColumns(#"Added Custom1", {"Custom.1", each Text.Combine(List.Transform(_, Text.From), ","), type text})
in
    #"Extracted Values1"

enter image description here

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