Это 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
Другой вариант:
Special
- & GT;Blanks
- & GT;OK
=
Нажмите ↑ , затем CTRL + ENTERSpecial
- & GT;Blanks
- & GT;OK
=IF(
Нажмите ← тип=
Нажмите ← Нажмите ↓ тип,
Нажмите ↓ тип,0)
затем CTRL + ENTERCopy
а такжеPaste Special as Values
РЕДАКТИРОВАТЬ:
Объяснение: Я пытаюсь использовать GoTo Blanks вариант. После того, как вы выбрали пробелы, вы можете ввести ту же формулу для всех выбранных пустых ячеек. Что касается вопроса ОП, данные выглядят так последовательный заготовки, т.е.
Value A
заготовки столбцов имеют одинаковыеCustomerID
как выше непустой ряд. Таким же образомValue B
заготовки столбцов имеют одинаковыеCustomerID
как ниже непустой ряд.источник
Наиболее эффективный способ сделать это - сбросить все данные в сводную таблицу и поместить «Клиент» в метки строк, а затем выполнить другие столбцы. Вы можете поместить «Год» в заголовок столбца, если хотите увидеть разбивку по годам.
Сводные таблицы можно найти в разделе «Вставка в Excel 2010».
источник
Вот шаги для создания отдельной таблицы со сжатыми данными.
Customer
а такжеYear
, Это обеспечит основу для сжатого стола.В 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 + сдвиг + Войти ,
Заполните формулу вниз по столбцу. Затем заполните, чтобы заполнить
Value B
колонна также. Вуаля!Несколько заметок:
1000000
s в формуле к чему-то большему, чем количество строк.источник
Каждый использует для этого много VBA-кода или сложных функций. У меня есть метод, который реализуется за секунду, но он гораздо более понятен и его очень легко настроить в зависимости от различных других возможностей.
В приведенном выше примере вставьте эти (4) функции в ячейки E2, F2, G2 и H2 соответственно (ссылки на функции F & amp; G приведены выше):
Перетащите эти формулы как можно ниже. Он генерирует одну строку данных каждый раз, когда присутствуют 2 строки, оставляя отдельные строки без изменений. Вставьте специальные значения (для удаления формул) столбцов E-F-G-H в другое место и отсортируйте их по клиенту, чтобы удалить все лишние строки.
источник