2012-02-28 22:05:49 +0000 2012-02-28 22:05:49 +0000
10
10

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

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

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

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

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

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

Ответы (5)

6
6
6
2012-02-29 12:18:49 +0000

Это VBA, или макрос, который можно запустить на листе. Вы должны нажать alt+F11, чтобы вызвать подсказку Visual Basic for Application, перейти к своей рабочей книге и 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 совершенно не нужен, но это никому не навредит…

REVISITED 02/28/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
2
2
2
2013-07-17 18:08:36 +0000

Еще один вариант:

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

EDIT:

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

0
0
0
2012-02-29 18:12:36 +0000

Ниже приведены шаги по созданию отдельной таблицы с конденсированными данными.

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

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

Несколько записей:

  • Конечно, вам нужно будет настроить адреса в соответствии с вашими данными. Для справки, Sheet1 - это оригинальные данные в колонках от A до D.
  • Я предполагаю, что ваши данные (или заголовки) начинаются с первого ряда. Вероятно, это правда, если это дамп данных. Формулу придется скорректировать, если это не так.
  • я предполагаю, что в вашей таблице меньше миллиона строк. Если у вас как-то больше, измените 1000000s в формуле на что-то большее, чем количество строк.
  • Если в вашей таблице много тысяч строк (100,000+), вы можете подумать об использовании вместо этого VBA-решения, так как формулы массивов могут затуманиваться большими массивами.
0
0
0
2016-07-15 16:44:30 +0000

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

В приведенном выше примере вставьте эти (4) функции в ячейки, E2, F2, G2 и H2 соответственно (опорные ячейки функций F&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 в другом месте и отсортируйте их по клиенту, чтобы удалить все лишние строки.

0
0
0
2012-02-28 22:15:04 +0000

Самый эффективный способ сделать это - сбросить все данные в таблицу разворота и бросить ‘Клиент’ в Row Labels (Метки строк), а затем проследить за другими столбцами. Вы можете бросить ‘Год’ в заголовок колонки, если хотите увидеть разбивку по годам

Поворотные таблицы можно найти в разделе “Вставка в Excel 2010”.

Похожие вопросы

6
13
9
10
5