如何合并 Excel 中的多列以便在新列中保留唯一值?

如何合并 Excel 中的多列以便在新列中保留唯一值?

假设数据位于下面的 Col1 和 Col2 中。我们如何通过合并 Col1 和 Col2 来创建 Col3?

Col1  Col2   Col3
------------------
  a      b      a
  b      c      b
  c      d      c
  g      e      d
         f      e
                f
                g

答案1

在文件的临时副本中执行此操作,以防万一发生爆炸或融化,因为“撤消”并不总是有效。按顺序将两列中的数据复制到另一个临时列中;我们称之为 V。如果您现有的数据有标题,请从 A 列复制标题;否则,在单元格 V1 中输入一些虚拟值。

复制数据的图示

单击第 V 列中的某处。现在转到“数据”选项卡,“排序和筛选”组,然后单击“高级”:

         “排序和过滤”组,其中“高级”突出显示

这将打开“高级过滤器”对话框:

        “高级过滤器”对话框

确认“列表范围”在 V 列中显示您的数据。选择“复制到另一个位置”和“仅唯一记录”。在“复制到”字段中输入“W1”——或者单击该字段,然后单击 W1(有几种方法可以获得相同的结果)。单击“确定”。您应该得到如下结果:

           将 V 中的数据排序到 W 中并删除重复项

现在将数据从 W 列复制到 C 列。如果需要,请排序。然后清除 V 列和 W 列。

披露:以上答案部分摘自我的答案按共享值对数据列进行分组

答案2

这个 VBA 应该可以做到。我确信有公式方法,但我发现在这种情况下 VBA 更容易阅读

Sub FindUniques()
'Define and set variables
Dim rangeIn As Range, rangeOut As Range
Set rangeIn = Application.Selection
Set rangeIn = Application.InputBox("Input Range", "Input Range", rangeIn.Address, Type:=8)
Set rangeOut = Application.InputBox("Select the first cell to output to", "Output Range Start", Type:=8)

Dim colLoop, rowLoop

Dim dic As Object
Set dic = CreateObject("Scripting.Dictionary")

Dim curVal


'Loop through range columns
For colLoop = 1 To rangeIn.Columns.Count
    'Loop through range rows
    For rowLoop = 1 To rangeIn.Rows.Count
        'Get the value of cell in current column, current row
        curVal = rangeIn.Cells(rowLoop, colLoop).Value
        'Check if we've already added this to the dictionary. If we have, it's not unique, skip it
        If Not dic.Exists(curVal) And curVal <> "" Then
            'Write the value in place of our output
            rangeOut.Value = curVal
            'Add the value to our dictionary so it'll be skipped if it comes up again
            dic(curVal) = ""
            'Go to the next cell down ready to write the next one
            Set rangeOut = rangeOut.Offset(1, 0)
        End If
    Next
Next
End Sub

答案3

这是使用隐藏列的一种方法,不需要 VBA。但是,这不会对最后一列进行排序。

在此处输入图片描述

输入这些公式后,您可以通过右键单击标题并选择隐藏来隐藏中间的三列:

在此处输入图片描述

接下来你将得到以下内容:

在此处输入图片描述

Col1 和 Col2 之后的四列中的公式必须复制到至少 Col1 和 Col2 最大长度的两倍。我建议选择一个任意大的数字,确保 Col1 和 Col2 的行数永远不会超过这个数字,然后就忘掉它吧。

这假设您的 Col1 和 Col2 位于 A 列和 B 列,并且包含标题行,且标题行位于第 1 行。如果不包含标题行,则必须稍微修改这些。

组合列的公式:

=OFFSET($A$2, FLOOR((ROW() - ROW($2:$2)) / 2, 1), MOD(ROW() - ROW($2:$2), 2))

过滤列的公式:

=IF(C2 = 0, "", IF(ISERROR(MATCH(C2, C$1:C1, 0)), ROW(), ""))

排序列的公式:

=SMALL(D:D, ROW() - ROW($1:$1))

Col3 列的公式:

=IFERROR(INDEX(C:C, E2), "")

其工作方式是首先从第一行开始合并 Col1 和 Col2,然后向下进行(单元格 A2、单元格 B2、单元格 A3、单元格 B3 等)。它通过使用OFFSET功能与FLOORMOD, 和ROW功能。

然后,我们通过测试当前行和所有先前行中是否存在该值来过滤掉重复项。我们使用MATCH函数结合绝对和相对引用的巧妙使用来实现这一点。返回的是行号而不是值,以便可以在接下来的两列中使用。

然后,我们将所有列出的行号放在顶部,方法是:SMALLROW功能。

最后,我们只需要返回INDEX组合列与已排序列的行对应。

答案4

仅限 Google 表格

这仅在使用 Google Sheets 时可用,但它们对数组的处理更为复杂

你可以用简单的一行代码完成

=SORT(UNIQUE({A1:A4;B1:B5}))

分解

要将多个范围组合成一个数组,请使用{}分号分隔多个范围;

={A1:A4;B1:B5}

这将生成一个包含两个范围的垂直列

然后使用UniqueSort它们都将采用数组值来产生最终的列结果

相关内容