假设数据位于下面的 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(有几种方法可以获得相同的结果)。单击“确定”。您应该得到如下结果:
现在将数据从 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
功能与FLOOR
,MOD
, 和ROW
功能。
然后,我们通过测试当前行和所有先前行中是否存在该值来过滤掉重复项。我们使用MATCH
函数结合绝对和相对引用的巧妙使用来实现这一点。返回的是行号而不是值,以便可以在接下来的两列中使用。
然后,我们将所有列出的行号放在顶部,方法是:SMALL
和ROW
功能。
最后,我们只需要返回INDEX
组合列与已排序列的行对应。