
Представьте, что у меня есть следующий набор данных:
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, которая делает то, что вы ищете. Другой вариант — использовать Macro или VBA для автоматизации рабочего процесса, предложенного ниже.
На рисунке 1 показан исходный пример данных:
Начните с сортировки каждого столбца отдельно. Сохраните эту сортировку, которая не влияет на другой столбец. Затем добавьте еще один столбец, чтобы облегчить процесс, и напишите функцию сопоставления индексов, чтобы найти совпадения для каждой записи столбца A из столбца B:
=INDEX($C$1:$C$10,MATCH(A2,$C$1:$C$10,0),1)
На рисунке 2 показаны результаты этого этапа:
Теперь вырежьте и вставьте столбец B, чтобы избежать примыкания к значениям NA. Это две ячейки ниже в примере. Затем вырежьте и вставьте столбец A и вспомогательный столбец, чтобы сопоставить записи со столбцом B. Смотрите изображение ниже:
Повторяйте эту фазу до завершения. Помните, что нужно начать с col B, а затем сопоставить col A и INDEX col (вспомогательный столбец). Наконец, удалите столбец INDEX, и все готово.
решение4
На самом деле вы просите полное внешнее соединение, рассматривающее два столбца как отдельные таблицы.
Насколько мне известно, в стандартном Excel это невозможно даже с помощью плагина Power Query.
Тыможетдостичь результатовЕСЛИболее длинная таблица охватывает все записи в более короткой таблице, но ваш пример показывает, что это не так.
Что вы можете сделать, так это добавить два столбца и затем дедуплицировать, это достаточно просто. Вы также можете добавить столбец подсчета, чтобы увидеть, сколько копий одного и того же имени существовало в исходных данных. Дайте мне знать, если вы хотите это сделать.
ОБНОВЛЕНИЕ: Как я и предполагал, вы можете сделать это с помощью Microsoft Access. Для этого вам сначала нужно иметь два столбца в качестве отдельных таблиц. Затем вам нужно создать ДВА соединения между таблицами, левое внешнее соединение и правое внешнее соединение. После того, как вы создали эти связи, вы можете сделать простой запрос, чтобы выбрать один столбец из каждой таблицы. Вот и все.
При желании вы можете оставить исходные данные в Excel и просто сделать ссылку на них, разделив два столбца на отдельные таблицы.