假设我有以下一组数据
A B
AnthonyMorgan EvelynThomas
JoePatterson RussellRobinson
JohnAnderson ChristopherMiller
CarolynMorris RyanStewart
DorisKing SarahPrice
AlanJohnson MarilynHall
JonathanHall EricCooper
AndreaPowell GregorySimmons
PaulaCooper JackRussell
AndrewPeterson SeanEvans
JohnWilliams JudyBell
LillianLewis JohnWilliams
SteveRoberts LillianLewis
MatthewGray SteveRoberts
ChristinaClark MatthewGray
PeterAllen
SharonHill
MaryTurner
DorisGonzales
VictorWhite
JoanFoster
ChristinaClark
RubyBryant
RogerColeman
JosephLong
AndrewPeterson
我想按列排序,A
这样不同列中的相同值会保持在一起。最终结果是:
A B
AlanJohnson
AndreaPowell
AndrewPeterson AndrewPeterson
AnthonyMorgan
CarolynMorris
ChristinaClark ChristinaClark
ChristopherMiller
DorisGonzales
DorisKing
EricCooper
EvelynThomas
GregorySimmons
JackRussell
JoanFoster
JoePatterson
JohnAnderson
JohnWilliams JohnWilliams
JonathanHall
JosephLong
JudyBell
LillianLewis LillianLewis
MarilynHall
MaryTurner
MatthewGray MatthewGray
PaulaCooper
PeterAllen
RogerColeman
RubyBryant
RussellRobinson
RyanStewart
SarahPrice
SeanEvans
SharonHill
SteveRoberts SteveRoberts
VictorWhite
任何想法?
答案1
尝试这个宏:
Sub Interleaver()
Dim nA As Long, nB As Long
Dim rc As Long, i As Long, j As Long
rc = Rows.Count
nA = Cells(rc, "A").End(xlUp).Row
nB = Cells(rc, "B").End(xlUp).Row
Range("A1:A" & nA).Copy Range("C1")
Range("B1:B" & nB).Copy Range("C" & nA + 1)
For i = 1 To nA + nB
If i <= nA Then
Cells(i, "D") = "A"
Else
Cells(i, "D") = "B"
End If
Next i
Range("C1:D" & nA + nB).Sort Key1:=Range("C1"), Order1:=xlAscending, Header:=xlNo, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal
Range("A1:A" & nA).Clear
Range("B1:B" & nB).Clear
j = 2
If Range("D1").Value = "A" Then
Cells(1, "A") = Cells(1, "C")
Else
Cells(1, "B") = Cells(1, "C")
End If
For i = 2 To nA + nB
If Cells(i, "C") = Cells(i - 1, "C") Then
j = j - 1
Range("A" & j & ":B" & j) = Cells(i, "C")
j = j + 1
Else
If Cells(i, "D").Value = "A" Then
Cells(j, "A") = Cells(i, "C")
Else
Cells(j, "B") = Cells(i, "C")
End If
j = j + 1
End If
Next i
End Sub
它将产生:
答案2
我认为没有直接的方法可以做到这一点。试试这个:
- 将您的数据合并到一个记住原始位置的范围内(例如,将您的第一列复制到新工作表并在下一列中填写“1”,将第二列复制到第一列下方并在第二列中填写“10”以表示这组数据)。
- 插入数据透视表,列标签应该是您的第一列并要求第二列的总和(现在您已按字母顺序排列了唯一值,如果名称仅出现在一列中,则在第二列中为 1 或 10,如果名称出现在两列中,则为 11)。
- 假设数据透视表中的数据从 A5 开始,请在 C5 中输入此数据:=if(mod(b5,2)=1,a5,"")
并在 d5 中输入此数据:=if(b5>9,a5,"")
答案3
另一个工作流程如下。请注意,它是手动执行的,因为我不知道有任何 Excel 函数可以完成您要查找的操作。另一个选项是使用宏或 VBA 来自动化下面建议的工作流程。
图 1 显示了初始示例数据:
首先对每个列分别进行排序。保持排序不会影响其他列。然后添加另一个列来帮助该过程,并编写一个索引匹配函数来从 B 列中为每个 A 列条目查找匹配项:
=INDEX($C$1:$C$10,MATCH(A2,$C$1:$C$10,0),1)
图 2 展示了此阶段的结果:
现在剪切并粘贴 B 列以避免与 NA 值相邻。这是示例中的两个单元格。然后剪切并粘贴 A 列和辅助列以将条目与 B 列匹配。参见下图:
重复此阶段直至完成。记住从 B 列开始,然后匹配 A 列和 INDEX 列(辅助列)。最后删除 INDEX 列,您就完成了。
答案4
您真正要求的是将两列作为单独的表进行完整的外连接。
据我所知,即使借助 Power Query 插件,在原生 Excel 中也不可能实现这一点。
你能取得成果如果较长的表格包含较短的表格中的所有条目,但是您的示例表明事实并非如此。
您可以做的是将两列附加,然后进行重复数据删除,这很容易。您还可以添加计数列,以便查看原始数据中存在多少个同名副本。如果您想这样做,请告诉我。
更新:正如我所料,您可以使用 Microsoft Access 执行此操作。为此,您首先需要将两列作为单独的表。然后,您必须在表之间创建两个连接,一个左外部连接和一个右外部连接。创建这些关系后,您可以执行一个简单的查询来从每个表中选择单个列。就是这样。
如果愿意,您可以将原始数据保留在 Excel 中,只要将两列分成单独的表即可链接到该数据。