【问题标题】:Remove Duplicate Rows - Duplicates scattered over different columns in different rows删除重复行 - 重复分散在不同行的不同列中
【发布时间】:2020-10-16 19:46:15
【问题描述】:

假设我有这样的表:

第一行:111 |一个 | 222 |乙

第二行:222 |乙| 111 |一个

我只想保留其中的一行,该怎么做?

【问题讨论】:

  • 查看您之前的表格更改了标题..请拒绝更改。
  • 多贴一些数据,让我们看看。
  • 有多少列?你能输入一个帮助列并在那里输入公式吗?
  • 您在寻找脚本还是单元格公式?

标签: excel google-sheets duplicates


【解决方案1】:

如果您可以使用辅助列从第 2 行中查找列 B 到 I 中的重复项,则在辅助列的第二行中输入以下公式。

=Sort_and_CONCATENATE(B2:I2,"|")

并抄下公式。

此公式将对“B2:I2”范围内的单元格进行排序和合并。然后您可以在此列上使用删除重复项。

以下是VBA中用户定义的函数代码

Option Explicit
'============================================================================
Function Sort_and_CONCATENATE(myRng As Range, deLmt As String, Optional srtCriteria = 0)
'srtCriteria is criteria to sort; 0 or nothing for Ascending, Other digit for descending.
Dim myString As String, Lb As Long, Ub As Long, i As Long, j As Long
Dim arr, reverseArray
Dim strTemp As String

arr = myRng.Value
myString = Join(Application.Index(arr, 1, 0), deLmt)
arr = Split(Trim(myString), deLmt)
Lb = LBound(arr)
Ub = UBound(arr)

For i = Lb To Ub - 1
    For j = i + 1 To Ub
        If IsNumeric(arr(i)) = True And IsNumeric(arr(j)) = True Then
            If Val(arr(i)) > Val(arr(j)) Then
            strTemp = arr(i)
            arr(i) = arr(j)
            arr(j) = strTemp
            End If
        Else
            If IsDate(arr(i)) = True And IsDate(arr(j)) = True Then
                If DateValue(arr(i)) > DateValue(arr(j)) Then
                strTemp = arr(i)
                arr(i) = arr(j)
                arr(j) = strTemp
                End If
            Else
                If (arr(i)) > (arr(j)) Then
                strTemp = arr(i)
                arr(i) = arr(j)
                arr(j) = strTemp
                End If
            End If
        End If
    Next j
Next i

If srtCriteria = 0 Then
    Sort_and_CONCATENATE = Join(arr, deLmt)
    Else
    ReDim reverseArray(Ub)
        For i = 0 To Ub
            reverseArray(i) = arr(Ub - i)
        Next
    Sort_and_CONCATENATE = Join(reverseArray, deLmt)
End If

End Function

此外,使用this function,我们可以创建以下程序来删除重复项。 宏导致的 Excel 更改无法撤消。请在样本/重复数据上尝试宏。如果我们使用以下过程,我们不必使用帮助列。

Option Explicit
'============================================================================
Sub removeDuplicatesAcrossColumns()
Dim resultArr(), resultColl As New Collection, tblRng As Range, i As Long, j As Long
Set tblRng = Application.InputBox("Select Table Range", "Table Range", , , , , , 8)

For i = 1 To tblRng.Rows.Count
    If ExistsInCollection(resultColl, Sort_and_CONCATENATE(tblRng.Rows(i), "|")) = False Then
        resultColl.Add i, Sort_and_CONCATENATE(tblRng.Rows(i), "|")
        ReDim Preserve resultArr(1 To tblRng.Columns.Count, 1 To resultColl.Count)
        For j = 1 To tblRng.Columns.Count
            resultArr(j, resultColl.Count) = tblRng(i, j).Formula
        Next
    End If
Next
tblRng.ClearContents
Range(tblRng(1, 1).Address).Resize(UBound(resultArr, 2), tblRng.Columns.Count).Formula = Application.Transpose(resultArr)

End Sub
'============================================================================
Public Function ExistsInCollection(col As Collection, key As Variant) As Boolean
    On Error GoTo err
    ExistsInCollection = True
    IsObject (col.Item(key))
    Exit Function
err:
    ExistsInCollection = False
End Function
'============================================================================

在下面的 GIF 中,帮助列用于显示重复项。否则,在上述过程中不需要辅助列。

【讨论】:

    【解决方案2】:

    在 Google 表格中,您可以使用公式添加“帮助列”

    =join("|",sort(TRANSPOSE(table_row_reference)))
    

    然后使用Remove Duplicates 工具

    在 Excel O365 中,您可以执行相同操作,但公式为:

    =TEXTJOIN("|",,SORT(table_row_reference,,,TRUE))
    

    注意:table_row_reference 是对表中单行的引用,例如A1:D1

    在早期版本的 Excel (Excel 2010+) 中,您可以使用 Power Query

    let
        Source = Excel.CurrentWorkbook(){[Name="Table2"]}[Content],
    
            //Change all columns to type Text
            typed = Table.TransformColumnTypes(Source,
                        List.Transform(
                            Table.ColumnNames(Source),
                            each {_, type text}
                        )
                    ),
        #"Added Custom" = Table.AddColumn(typed, "Merged", each Text.Combine(List.Sort({[Column1],[Column2],[Column3],[Column4]}),"|")),
        #"Removed Duplicates" = Table.Distinct(#"Added Custom", {"Merged"}),
        #"Removed Columns" = Table.RemoveColumns(#"Removed Duplicates",{"Merged"})
    in
        #"Removed Columns"
    
    

    【讨论】:

      猜你喜欢
      • 2014-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-30
      • 1970-01-01
      • 2020-06-05
      • 2017-01-27
      • 1970-01-01
      相关资源
      最近更新 更多