Excel 排序在同一位置的不同列中保持相等的值

Excel 排序在同一位置的不同列中保持相等的值

假设我有以下一组数据

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 中,只要将两列分成单独的表即可链接到该数据。

相关内容