Як об’єднати значення з декількох рядків у один рядок у Excel?


10

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

введіть тут опис зображення

Я застряг із рядком для клієнта 1 для вартості A у 2009 році та окремим рядком для значення B для того ж клієнта в тому ж році.

У деяких випадках немає значення A або Value B. У наведеному вище прикладі ви бачите, що у Клієнта 1 немає значення B у 2011 році, тому для цього не було створено жодної рядки. І хоча вони не представлені в прикладі, деякі клієнти не матимуть жодних даних про значення протягом року (і, отже, не буде рядків для цього клієнта в тому році). У цій ситуації не вистачає суперечок для цього замовника в тому році.

Я хочу перенести це на робочий аркуш, де є один ряд для обох значень для кожного року та клієнта. Тобто, я хочу, щоб дані виглядали так:

введіть тут опис зображення

Який найефективніший спосіб досягти цього результату?

Відповіді:


6

Це 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зовсім непотрібне, але це нікому не шкодить ..

ПЕРЕМОЖЕНО 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

2

Ще один варіант:

  1. Виберіть стовпчик B, натисніть 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. Видаліть дублікати.

Редагувати:

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


Привіт zx8754. Не могли б ви додати трохи пояснень, що ідея вашого рішення?
nixda

@nixda Пояснення додано, вибачте, що кроки досить чіткі.
zx8754

0

Найефективніший спосіб зробити це - скинути всі дані у зведену таблицю та опустити "Клієнт" у мітки рядків, а потім дотримуватися інших стовпців. Ви можете опустити "Рік" у заголовок стовпця, якщо хочете бачити розбиття за роками

Зведені таблиці можна знайти в розділі Вставити в Excel 2010


Ви зіткнетесь із проблемами, хоч із клітинками, які не мають значення у стовпці B, оскільки Excel не зможе знати, що значення у В2 та В3 певним чином пов'язані.
xXPhenom22Xx

Я, правда кажучи, не маю досвіду роботи з Pivot Tables, але я не думаю, що Pivot Tables вирішує проблему, яку я маю. Я хочу, щоб дані для всіх значень для клієнта були в одному ряду на рік, щоб я міг ними маніпулювати (наприклад, створити стовпець, додаючи значення A + значення B), а не просто змінити те, як я переглядаю їх за допомогою зведеної таблиці. Я буквально хочу, щоб дані були структуровані по-різному на робочому аркуші.
Грег Р.

Так, було б важко, якщо б у вас завжди не було чергування стовпців із відсутніми даними, як у прикладі. Якщо це не так, то Excel не може логічно робити те, що ви хочете.
xXPhenom22Xx

Грег - ви можете вирішити проблему таким чином: як тільки вона знаходиться у зведеній таблиці у потрібному форматі, скопіюйте її зі зведеної таблиці в інше місце (той самий аркуш чи інший) - і тоді ви зможете маніпулювати нею, як завгодно. , включаючи додавання стовпців, формул тощо
yosh m

0

Ось етапи створення окремої таблиці зі стислими даними.

  1. Скопіюйте всю таблицю і вставте її на новий аркуш.
  2. Виберіть нову таблицю та видаліть дублікати (стрічка даних -> Видалити копії) на стовпцях Customerта Year. Це забезпечить основу для зведеної таблиці.
  3. У В2 (перший запис для 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+ Shift+ Enter.

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

Кілька приміток:

  • Звичайно, вам потрібно буде налаштувати адреси, щоб вони відповідали вашим даним. Для довідки, Sheet1 - це вихідні дані у стовпцях від A до D.
  • Я припускаю, що ваші дані (або заголовки) починаються з рядка 1. Це, мабуть, вірно, якщо це дамп даних. Формулу доведеться коригувати, якщо це не так.
  • Я припускаю, що ваша таблиця має менше мільйона рядків. Якщо у вас чомусь є більше, змініть 1000000s у формулі на щось більше, ніж ваша кількість рядків.
  • Якщо у вашій таблиці налічується багато тисяч рядків (100 000+), ви можете замість цього скористатися рішенням VBA, оскільки формули масиву можуть завалитися великими масивами.

0

Кожен використовує для цього багато коду 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 рядки, не залишаючи жодних змін. Вставте спеціальні значення (для видалення формул) стовпців EFGH в іншому місці і відсортуйте їх за замовниками, щоб видалити всі зайві рядки.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.