
次のようなデータセットがあるとします
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 つの列を別々のテーブルに分割してリンクするだけで済みます。