Excel 中的迭代公式在不使用 VBA 的情况下将数据重新格式化为新的 sheet

Iterative formulas in Excel to reformat data onto a new sheet without using VBA

我非常喜欢这个项目,我希望也许我在正确的轨道上或在正确的地方去问,因为我在 Excel 并在其中使用函数。

目前,我得到的数据集的格式非常不符合我的需要。在照片中,我创建了我能创建的最简单的类似数据样本,尽管我正在处理的实际数据集通常约为 144 行 x 35 列。如果照片没有显示,我可以描述此数据的最佳方式是:

然后C2:H16填写每个代理人每天申请的credit对应的数字。如果代理当天没有申请信用,则相应的 3 个单元格留空。

我想做的是,在同一个工作簿中的单独 sheet 上,使用某种公式或可以使我的数据成为简单的 table 和日期的东西, agent name, average credit, credit amount, credit volume as my headers,如下图:

理想情况下,如果日期下有一个有效的非空白单元格,我什至只想在新的 sheet 中放置值,但实际上我完全可以接受任何类型的嵌套公式无论是否过滤掉这些,都能完成工作。不幸的是,这必须在不使用 VBA 且不使用 Excel.

中的 built-in 功能区选项的情况下完成

最初我希望我可以通过某种嵌套的 vlookup 和 if 语句来实现这一点,但我有点不知所措。作为最后的努力,我计划在工作簿中创建 31 个额外的 sheet,并且在每个 sheet 上使用过滤函数,同时在每个 sheet 上过滤不同的列,即sheet 2 将过滤 c 列下的非空白数据点,sheet 3 将过滤 d 列下的非空白数据点等,虽然这会很乏味,但我只是将数据复制并转置到一个完全独立的工作簿。

非常感谢任何帮助、提示、提示或技巧。

我看到两种方法:

  1. Power Query - Windows 2010 或更高版本必须有 Excel。
  2. 公式 - 必须 Excel 2019 或 365.

Power Query (PQ) 方法

这看起来可能有点复杂,但只需不到 5 分钟的时间,并且完全由鼠标完成。完成后,只需单击刷新即可更新数据。

首先将 table 转换为 excel table 并通过转到 数据选项卡 和 selecting 来自 Table/Range:

对 table 说是 headers:

这将打开 PQ 编辑器。 Select 代理名称 字段和 转换选项卡 、select 向下填充.

现在 select 代理名称column1 然后 right-click 并选择 Unpivot Other Columns.

现在您的数据就差不多了 - 它们已标准化为具有属性的列,

所以您需要将它们转换为上面建议的形式。下一步是 select Column1 然后 Pivot 来自 Transform 选项卡 。它将显示一个 window,您可以在其中 select Value 作为您要旋转的字段:

点击确定,现在您可以看到您想要的table:

现在您需要将其恢复到 Excel。在主页选项卡上,单击关闭并加载到:

然后选择Table新建工作表:

大功告成。

如果您将新数据添加到您的数据中,您可以 right-click 您在上面创建的 table 和 select 刷新,它将更新 table新数据。如果您想将其应用到以后的 table 数据中,无需重复整个过程即可轻松修改。

公式方法

这已经很长了post而且这个方法需要一些严肃的公式工程,所以我现在只强调这个方法,但如果它有趣,请在评论中说出来,我会完成post.

这是一个逆轴公式,但它不适合您的 table 因为:

  • 它需要将那些合并的名称填充到下面的单元格中 (即fill-down)和
  • 它将空白单元格视为零。

用 Power Query 的说法,我们会说你想要“Unpivot C1:H16 By A1:B16 ".

=LET( unPivMatrix, C1:H16,
      byMatrix, A1:B16,
       upC, COLUMNS( unPivMatrix ),
       byC, COLUMNS( byMatrix ),
       dmxR, MIN( ROWS( unPivMatrix ), ROWS( byMatrix ) ) - 1,
       upCells, dmxR * upC,
       upSeq, SEQUENCE( upCells,, 0 ),
       upHdr, INDEX( INDEX( unPivMatrix, 1, ),  1,  SEQUENCE( upC ) ),
       upBody, INDEX( unPivMatrix,  SEQUENCE( dmxR ) + 1,  SEQUENCE( 1, upC ) ),
       byBody, INDEX( byMatrix,  SEQUENCE( dmxR ) + 1,  SEQUENCE( 1, byC ) ),
       attr, INDEX( upHdr, MOD( upSeq, upC ) + 1 ),
       mux, INDEX( upBody, upSeq/upC + 1, MOD( upSeq, upC ) + 1 ),
       demux, IFERROR( INDEX(
                             IFERROR( INDEX( byBody,
                                             IFERROR( INT( SEQUENCE( upCells, byC,0 )/byC/upC ) + 1, MOD( upSeq, upC ) + 1 ),
                                                      SEQUENCE( 1, byC + 1 ) ),
                                       attr ),
                             upSeq + 1, SEQUENCE( 1, byC + 2 ) ),
                        mux ),
       demux
     )

要修改它需要相当于 Fill-Down,这有点挑战,但有可能。最后还需要一个过滤器来删除那些零。

这不会提供您的最终输出,它只会为您提供第一步。然后,您需要旋转未旋转的输出,这可以通过正常的 excel 旋转 table 或通过编写另一个复杂的公式来旋转它来完成,这很难。

所以...如果您有 Excel 用于 Windows 2010 或更高版本,我会选择 Power Query。它专为解决您的问题而设计。