Как объединить значения из нескольких строк в одну строку в Excel?

10

У меня есть дамп данных в Excel, который состоит из ежегодных данных о клиентах для двух разных значений. Данные были предоставлены в отдельной строке для значения для каждого года и клиента. То есть это выглядит так:

enter image description here

Я застрял в строке для клиента 1 для значения A в 2009 году и отдельный ряд для значения B для так же клиент в так же год.

В некоторых случаях нет значения A или значения B. В приведенном выше примере вы можете видеть, что у Customer 1 нет значения B в 2011 году, поэтому для этого не было создано ни одной строки. И хотя это не представлено в примере, некоторые клиенты не будут иметь данных ни для одного значения за год (и, следовательно, не будут строки для этого клиента в этом году). В этой ситуации не хватает скандала для этого клиента в этом году.

Я хочу получить это на листе, где есть один ряд за и то и другое значения для каждого года и клиента. Я хочу, чтобы данные выглядели так:

enter image description here

Каков наиболее эффективный способ создать такой результат?

Greg R.
источник

Ответы:

6

Это VBA или макрос, который вы можете запустить на своем листе. Вы должны ударить альт + F11 чтобы вызвать приглашение Visual Basic для приложений, перейдите в свою книгу и right click - insert - module и вставьте этот код туда. Затем вы можете запустить модуль из VBA, нажав F5 , Этот макрос называется «тест»

Sub test()
'define variables
Dim RowNum as long, LastRow As long
'turn off screen updating
Application.ScreenUpdating = False
'start below titles and make full selection of data
RowNum = 2
LastRow = Cells.SpecialCells(xlCellTypeLastCell).Row
Range("A2", Cells(LastRow, 4)).Select
'For loop for all rows in selection with cells
For Each Row In Selection
    With Cells
    'if customer name matches
    If Cells(RowNum, 1) = Cells(RowNum + 1, 1) Then
        'and if customer year matches
        If Cells(RowNum, 4) = Cells(RowNum + 1, 4) Then
            'move attribute 2 up next to attribute 1 and delete empty line
            Cells(RowNum + 1, 3).Copy Destination:=Cells(RowNum, 3)
            Rows(RowNum + 1).EntireRow.Delete
        End If
     End If
    End With
'increase rownum for next test
RowNum = RowNum + 1
Next Row
'turn on screen updating
Application.ScreenUpdating = True

End Sub

Это будет проходить через отсортированная таблица и объединить последовательные ряды которые соответствуют как клиенту, так и году и удаляют пустую строку. Таблица должна быть отсортирована так, как вы ее представили, по возрасту клиентов и по возрасту, этот конкретный макрос не будет выходить за пределы последовательных строк ,

Изменить - это вполне возможно, мой with statement совершенно не нужно, но никому не вредит ..

ПЕРЕСМОТРЕНО 28.02.14

Кто-то использовал этот ответ в другом вопрос и когда я вернулся, я думал, что этот VBA плохой. Я переделал это -

Sub CombineRowsRevisited()

Dim c As Range
Dim i As Integer

For Each c In Range("A2", Cells(Cells.SpecialCells(xlCellTypeLastCell).Row, 1))
If c = c.Offset(1) And c.Offset(,4) = c.Offset(1,4) Then
            c.Offset(,3) = c.Offset(1,3)
            c.Offset(1).EntireRow.Delete
End If

Next

End Sub

Пересмотрено 05/04/16

Снова спросил Как объединить значения из нескольких строк в одну строку? Есть модуль, но нужны переменные, объясняющие и опять же, это довольно бедно.

Sub CombineRowsRevisitedAgain()
    Dim myCell As Range
    Dim lastRow As Long
    lastRow = Cells(Rows.Count, "A").End(xlUp).Row

    For Each myCell In Range(Cells("A2"), Cells(lastRow, 1))
        If (myCell = myCell.Offset(1)) And (myCell.Offset(0, 4) = myCell.Offset(1, 4)) Then
            myCell.Offset(0, 3) = myCell.Offset(1, 3)
            myCell.Offset(1).EntireRow.Delete
        End If
    Next
End Sub

Однако, в зависимости от проблемы, может быть лучше step -1 на номер строки, поэтому ничего не пропускается.

Sub CombineRowsRevisitedStep()
    Dim currentRow As Long
    Dim lastRow As Long
    lastRow = Cells(Rows.Count, 1).End(xlUp).Row

    For currentRow = lastRow To 2 Step -1
        If Cells(currentRow, 1) = Cells(currentRow - 1, 1) And _
        Cells(currentRow, 4) = Cells(currentRow - 1, 4) Then
            Cells(currentRow - 1, 3) = Cells(currentRow, 3)
            Rows(currentRow).EntireRow.Delete
        End If
    Next

End Sub
Raystafarian
источник
Сценарий работал прекрасно, спасибо!
Greg R.
2

Другой вариант:

  1. Выберите столбец B, нажмите CTRL + G - & GT; Special - & GT; Blanks - & GT; OK
  2. Тип = Нажмите , затем CTRL + ENTER
  3. Выберите столбец C, нажмите CTRL + G - & GT; Special - & GT; Blanks - & GT; OK
  4. Тип =IF( Нажмите тип = Нажмите Нажмите тип , Нажмите тип ,0) затем CTRL + ENTER
  5. Выберите все данные и Copy а также Paste Special as Values
  6. Удалить дубликаты.

РЕДАКТИРОВАТЬ:

Объяснение: Я пытаюсь использовать GoTo Blanks вариант. После того, как вы выбрали пробелы, вы можете ввести ту же формулу для всех выбранных пустых ячеек. Что касается вопроса ОП, данные выглядят так последовательный заготовки, т.е. Value A заготовки столбцов имеют одинаковые CustomerID как выше непустой ряд. Таким же образом Value B заготовки столбцов имеют одинаковые CustomerID как ниже непустой ряд.

zx8754
источник
Привет zx8754. Не могли бы вы добавить несколько объяснений, в чем заключается идея вашего решения?
nixda
@nixda Объяснение добавлено, извините, но шаги были достаточно ясны.
zx8754
0

Наиболее эффективный способ сделать это - сбросить все данные в сводную таблицу и поместить «Клиент» в метки строк, а затем выполнить другие столбцы. Вы можете поместить «Год» в заголовок столбца, если хотите увидеть разбивку по годам.

Сводные таблицы можно найти в разделе «Вставка в Excel 2010».

xXPhenom22Xx
источник
Однако вы столкнетесь с проблемами в ячейках, которые не имеют значения в столбце B, поскольку Excel не сможет узнать, что значения в B2 и B3 так или иначе связаны между собой.
xXPhenom22Xx
По общему признанию, у меня мало опыта работы с сводными таблицами, но я не думаю, что сводные таблицы решают проблему, с которой я столкнулся. Мне нужны данные для всех значений для клиента в одной строке в год, чтобы я мог ими манипулировать (например, создать столбец с добавлением значения A + значение B), а не просто изменить способ просмотра через сводную таблицу. Я буквально хочу, чтобы данные на листе были по-разному структурированы.
Greg R.
Да, было бы сложно, если бы у вас не было чередующихся столбцов с пропущенными данными, как в примере. Если это не так, то у Excel нет способа логически сделать то, что вы хотите.
xXPhenom22Xx
Грег - вы можете решить проблему следующим образом: как только она окажется в сводной таблице в нужном вам формате, скопируйте ее из сводной таблицы в другое место (на тот же лист или на другой) - и тогда вы сможете манипулировать ею так, как вам нравится включая добавление столбцов, формул и т. д.
yosh m
0

Вот шаги для создания отдельной таблицы со сжатыми данными.

  1. Скопируйте всю таблицу и вставьте ее на новый лист.
  2. Выберите новую таблицу и удалите дубликаты (лента данных -> Удалить дубликаты) в столбцах. Customer а также Year, Это обеспечит основу для сжатого стола.
  3. В B2 (первая запись для Value A ) введите следующее:

    =IFERROR(INDEX(Sheet1!B$1:B$11,MIN(IF(Sheet1!$A$1:$A$11=$A2,IF(Sheet1!$D$1:$D$11=$D2,IF(Sheet1!B$1:B$11<>"",ROW(Sheet1!$A$1:$A$11),1000000),1000000),1000000))),"")

    Введите формулу в виде формулы массива, нажав Ctrl + сдвиг + Войти ,

  4. Заполните формулу вниз по столбцу. Затем заполните, чтобы заполнить Value B колонна также. Вуаля!

Несколько заметок:

  • Вам, конечно, нужно настроить адреса в соответствии с вашими данными. Для справки: Лист1 - это исходные данные в столбцах от А до D.
  • Я предполагаю, что ваши данные (или заголовки) начинаются со строки 1. Это, вероятно, верно, если это дамп данных. Формула должна быть скорректирована, если это не так.
  • Я предполагаю, что в вашей таблице меньше миллиона строк. Если у вас есть что-то большее, измените 1000000 s в формуле к чему-то большему, чем количество строк.
  • Если в вашей таблице много тысяч строк (более 100 000), вы можете вместо этого использовать решение VBA, поскольку формулы массивов могут увязнуть с большими массивами.
Excellll
источник
0

Каждый использует для этого много VBA-кода или сложных функций. У меня есть метод, который реализуется за секунду, но он гораздо более понятен и его очень легко настроить в зависимости от различных других возможностей.

В приведенном выше примере вставьте эти (4) функции в ячейки E2, F2, G2 и H2 соответственно (ссылки на функции F & amp; G приведены выше):

=IF(D2=D3, A2,         IF(D2<>D1, A2,            ""))    
=IF(D2=D3, MAX(B2:B3), IF(D2<>D1, B2,            ""))    
=IF(D2=D3, MAX(B2:B3), IF(D2<>D1, IF(C2=0,"",C2),""))    
=IF(D2=D3, D2,         IF(D2<>D1, D2,            ""))

Перетащите эти формулы как можно ниже. Он генерирует одну строку данных каждый раз, когда присутствуют 2 строки, оставляя отдельные строки без изменений. Вставьте специальные значения (для удаления формул) столбцов E-F-G-H в другое место и отсортируйте их по клиенту, чтобы удалить все лишние строки.

Kindlin
источник