如何压缩具有冗余行和冗余列的表中的稀疏数据

如何压缩具有冗余行和冗余列的表中的稀疏数据

在 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

@Jon 的答案是一个不错的 VBA 解决方案。但是……

请看一下 Jon Walkenbach 关于我所说的“去枢轴化”的文章: http://spreadsheetpage.com/index.php/tip/creating_a_database_table_from_a_summary_table/

您可以使用 Walkenbach 的技术首先将数据“去透视”为规范化的表格布局。然后,如 @Jon 上面所指出的,您可以重新透视以获得所需的布局。

这是该论坛上的另一篇帖子,其中的问题与您的问题非常相似: 我有一张有 2 个列的表格;其中一个是姓名,另一个有一个或多个电子邮件,以逗号分隔

(我已经记不清用过 Walkenbach 的“去枢轴”技术多少次了。只需很少的练习,您就可以成为这项技术的专家。)

答案2

我能想到的唯一方法是使用 VBA – 但我认为小计的效果不会很好。

假设您的数据在 Sheet1 上,并且其标题位于第 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

然后,您可以透视 Sheet2 上的结果数据(但首先确保第 1 行中有列名,否则它将不起作用)。

请注意,您可以将 Sheet1.UsedRange.rows.count 和 Sheet1.UsedRange.Columns.Count 更改为您想要循环的行数/列数。

相关内容