Как сжать разреженные данные в таблице с избыточными строками и столбцами

2

В Excel, как можно объединить, свернуть, сжать или удалить пустые ячейки из массива с дублирующимися заголовками в строках и столбцах?

+-----------+---------+------+---------+-------+---------+
|           |  1998   | 2001 |  2004   | 2004  |  2010   |
+-----------+---------+------+---------+-------+---------+
| Porcupine | 123,000 |      |         |       |         |
| Porcupine |         |      | 125,000 |       |         |
| Porcupine |         |      |         |       | 197,000 |
| Quark     | 3,750   |      |         |       |         |
| Quark     |         |      | 3,750   |       |         |
| Sloth     |         |      |         | 1,400 |         |
| Sloth     |         |      |         |       | 1,500   |
+-----------+---------+------+---------+-------+---------+

Желаемый результат:

+-----------+---------+---------+---------+
|           |  1998   |  2004   |  2010   |
+-----------+---------+---------+---------+
| Porcupine | 123,000 | 125,000 | 197,000 |
| Quark     | 3,750   | 3,750   |         |
| Sloth     |         | 1,400   | 1,500   |
+-----------+---------+---------+---------+
Мэтт Уилки
источник

Ответы:

1

@ Ответ Джона - хорошее решение VBA. Тем не мение....

Взгляните на статью Джона Уокенбаха о том, что я называю «разворотом»: http://spreadsheetpage.com/index.php/tip/creating_a_database_table_from_a_summary_table/

Вы бы использовали технику Walkenbach, чтобы сначала «развернуть» ваши данные в нормализованную разметку таблицы. Затем, как указывает @Jon выше, вы возвращаетесь, чтобы получить желаемый макет.

Вот еще один пост на этом форуме, очень похожий на ваш: у меня есть лист с двумя столбиками; в одном это имя, в другом есть один или несколько писем, разделенных запятой

(Я потерял счет, сколько раз я использовал технику «депивирования» Уокенбаха. С очень небольшой практикой вы можете стать экспертом в этом.)

F106dart
источник
Мне просто интересно, есть ли прогулка с использованием Excel 2007+. Звучит интересно, но я не могу понять, как заставить это работать с новым форматом сводной таблицы. Его макрос в нижней части листа отлично работает, так что это одно из решений.
gtwebb
2
Я должен был упомянуть: вы можете перейти к «старому» мастеру сводных таблиц в новых версиях Excel, нажав ALT + D, P. Затем вы сможете использовать метод Walkenbach.
F106dart
0

Я могу думать только о VBA - не думайте, что промежуточные итоги будут работать очень хорошо.

Предполагая, что ваши данные находятся на листе 1, и что у них есть заголовки в строке 1 и столбце A, и нет общих строк или чего-то в этом роде. Также предположим, что sheet2 пуст (так как именно здесь я буду публиковать данные)

Sub get_sparse_data()
xrow = 2
For irow = 2 to Sheet1.UsedRange.Rows.count

  For icol = 2 to Sheet1.UsedRange.columns.count
    If Len(Sheet1.cells(irow, icol).value)=0 Then
    Else
      Sheet2.cells(xrow, 1).formula = Sheet1.cells(irow, 1).value 'this is the row title
      Sheet2.cells(xrow, 2).formula = Sheet1.cells(1, icol).value 'this is the column title
      Sheet2.cells(xrow, 3).formula = Sheet1.cells(irow, icol).value 'this is the value from the table
      xrow = xrow + 1
    End if
  Next icol
Next irow
end Sub

Затем вы можете повернуть результирующие данные, которые находятся на Листе 2 (сначала убедитесь, что у вас есть имена столбцов в строке 1, иначе они не будут работать).

Обратите внимание, что вы можете изменить Sheet1.UsedRange.rows.count и Sheet1.UsedRange.Columns.Count, чтобы они просто соответствовали количеству строк / столбцов, которые вы хотите перебрать.

Джон
источник