
Вот моя ситуация. Мне нужно взять список из 38 тыс. клиентских счетов и отсортировать информацию по определенному шаблону, который я могу импортировать на наш новый веб-сайт. Однако способ представления данных делает это сложным...
Каждый адрес, сохраненный для 1 клиента, — это отдельная строка. Так что если у вас другой адрес выставления счета или доставки, это будет 2 строки. Иногда 3 строки. Мне нужно переместить эти строки в столбец (Адрес 1, Адрес 2 и т. д.) под 1 строкой. Так что если у CustomerA есть 3 сохраненных адреса, мне нужно взять эти 3 строки и переместить их в 3 столбца 1 строки. Надеюсь, это имеет смысл.
Я понятия не имею, будет ли лучшим путем формула, сводная таблица или VBA (я знаю в этой области столько же, сколько Джон Сноу). Я пробовал сводные таблицы, но это не особо работает. Я думал, что Index/Match может быть лучшим решением — мне просто придется дублировать формулу для каждого столбца Address, но это справится с задачей. Однако я не знаю, как я могу приспособиться к нескольким строкам.
Ниже приведен пример полученных мной данных. Строка 20 — это шаблон, в который мне нужно переместить строки. Столбец g_user id уникален для каждого клиента, но при наличии нескольких строк адресов для одного клиента это значение будет дублироваться в таблице. То же самое с customer_no.
http://www.filedropper.com/excelhelp
Если вам нужна дополнительная информация, сообщите мне, и я постараюсь объяснить подробнее.
ПРАВКА - Из опубликованной мной таблицы мне нужно взять строки 2 и 3 и переместить адресную информацию в новые столбцы в строке 1. Так как адрес занимает 2 столбца, город - 1, штат - 1, почтовый индекс - 1 и страна - 1, то в общей сложности получается 12 столбцов данных из этих 2 строк.
решение1
- Выберите пустую ячейку для размещения объединенного содержимого, введите формулу =CONCATENATE(TRANSPOSE(B2:B19)) в строку формул, затем вам нужно выбрать часть формулы TRANSPOSE(B2:B19) и нажать клавишу F9. Вы можете увидеть, что формула была изменена, как показано на снимках экрана ниже.
- Удалите фигурные скобки из формулы в строке формул, а затем нажмите клавишу Enter.
решение2
Мне нравится использовать VBA для такой задачи. Предполагая, что у вас есть уникальный идентификатор пользователя, как вы показываете в своей таблице-образце, вы можете сделать что-то вроде этого:
Sub Addresses_To_Columns()
Dim lastRow As Long
Dim addressCount As Integer: addressCount = 0
lastRow = Range("A" & Rows.Count).End(xlUp).Row
For i = lastRow To 3 Step -1
If Cells(i, 1).Value = Cells(i - 1, 1).Value Then
addressCount = addressCount + 1
Range(Cells(i - 1, 10), Cells(i - 1, (addressCount * 6) + 10)) = Range(Cells(i, 4), Cells(i, (addressCount * 6) + 4)).Value
Rows(i).Delete
Else
addressCount = 0
End If
Next i
End Sub
Этот код нужно будет настроить под ваш конкретный формат. Также обратите внимание, что это было сделано быстро в качестве проверки концепции и может не хватать некоторых общих рекомендаций. Пожалуйста, сделайте резервную копию данных, прежде чем пробовать этот код, поскольку он содержит команду удаления для избавления от дубликатов строк.
решение3
Спасибо всем за помощь и предложения, но я решил эту проблему другим методом.
Я просто объединил '-1','-2','-3' с "уникальными" идентификаторами клиентов. Затем я выполнил VLOOKUP для уникальных-1,-2,-3 значений для каждого нового столбца, который мне нужно было добавить.
Будем надеяться, что все это время и труд стоили той репутации, которую мы заслужили в результате этого испытания.
решение4
Очень простое решение, если я правильно понял ваш запрос. Убедитесь, что вы сделали резервную копию таблицы.
1) Добавьте необходимое количество новых столбцов в нужном месте. Допустим, новый столбец — N.
2) Я предполагаю, что идентификатор клиента находится в столбце A, и что строки с новым адресом для того же клиента имеют тот же номер в столбце A в этой строке. И, наконец, предполагаю, что первая строка для каждого клиента имеет наиболее полную информацию, помимо адреса, т. е. имя, телефон и т. д. (если нет, то используйте сортировку, сортируя сначала по номеру клиента, а затем по имени).
3) В ячейке N2 введите следующую формулу:
=if(and(a3=a2,a1<>a2),h3,"")
где H — столбец с адресами. Если в следующей строке тот же номер клиента (a3=a2), И эта строка — новый клиент, т. е. другой номер клиента по сравнению с предыдущей строкой (a1<>a2), ТО это возьмет адрес из следующей строки и поместит его в основную строку для этого клиента. Повторите для всех остальных частей этого адреса, чтобы вся информация была перемещена. Т. е. та же формула, но в O2 вместо N2 и ссылается на i3 вместо h3 и так далее.
4) Сделайте аналогичную формулу для 3-го адреса. То есть, предположив, что столбец X — это новый столбец для 3-го адреса, в X2 введите:
=if(and(a4=a2,a1<>a2),h4,"")
По сути то же самое, только берется информация с двух строк ниже.
5) К настоящему моменту все адреса должны быть в "главной" строке для каждого клиента. Теперь вам нужно скопировать все эти адреса и вставить их в те же места, используя Специальная вставка - значения. Это избавит вас от формул и просто будет иметь адреса в качестве данных, как будто вы их ввели.
6) Теперь используйте сортировку по имени клиента, чтобы собрать все строки, в которых есть пустые поля для имени (потому что это просто дополнительные адреса) в одном месте. Затем удалите все эти строки, убедившись, что все необходимые вам данные теперь находятся в правильной строке. Вуаля