異なる列の同じ値を同じ位置に保つ 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 つの範囲に結合します (例: 最初の列を新しいシートにコピーし、次の列に「1」を入力し、2 番目の列を最初の列の下にコピーし、このデータ セットの 2 番目の列に「10」を入力します)。
- ピボット テーブルを挿入し、列ラベルを最初の列にして、2 番目の列の合計を求めます (これで、一意の値がアルファベット順に並べ替えられ、2 番目の列には、名前が 1 つの列にのみ出現した場合は 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 はこのステージの結果を示しています。

インデックス作成

次に、NA 値に隣接しないように B 列を切り取って貼り付けます。これは、例では 2 つ下のセルです。その後、列 A と補助列を切り取って貼り付け、エントリを B 列と一致させます。下の画像を参照してください。

反復

完了するまでこのフェーズを繰り返します。列 B から開始し、列 A と INDEX 列 (補助列) を一致させることを忘れないでください。最後に INDEX 列を削除すれば完了です。

ほぼ完了しました

終わり!

答え4

実際に必要なのは、2 つの列を別々のテーブルとして扱う完全外部結合です。

私の知る限り、Power Query プラグインを使用しても、ネイティブ Excel ではこれは不可能です。

あなたできる結果を達成するもし長いテーブルには短いテーブルのすべてのエントリが含まれますが、例ではそうではないことが示されています。

2 つの列を追加して重複を削除するだけで、簡単です。また、カウント列を追加して、元のデータに同じ名前のコピーがいくつ存在するかを確認することもできます。その場合はお知らせください。

更新: 予想通り、Microsoft Access でこれを行うことができます。これを行うには、まず 2 つの列を別々のテーブルにする必要があります。次に、テーブル間に左外部結合と右外部結合の 2 つの結合を作成する必要があります。これらの関係を作成したら、簡単なクエリを実行して各テーブルから 1 つの列を選択できます。これで完了です。

必要に応じて、元のデータを Excel に残しておき、2 つの列を別々のテーブルに分割してリンクするだけで済みます。

関連情報