Excel 中的迭代公式在不使用 VBA 的情况下将数据重新格式化为新的 sheet
Iterative formulas in Excel to reformat data onto a new sheet without using VBA
我非常喜欢这个项目,我希望也许我在正确的轨道上或在正确的地方去问,因为我在 Excel 并在其中使用函数。
目前,我得到的数据集的格式非常不符合我的需要。在照片中,我创建了我能创建的最简单的类似数据样本,尽管我正在处理的实际数据集通常约为 144 行 x 35 列。如果照片没有显示,我可以描述此数据的最佳方式是:
- A 列将包含代理名称,每个代理名称占用 3 个垂直合并的单元格
- B 列将有“平均信用”、“信用金额”和“信用量”,每个占据一个单元格并在列中重复,直到到达代理名称的最后一个合并单元格
- 从第 1 行开始,c 到 h 的日期将从 6/1/2021 到 6/6/2021
然后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 列下的非空白数据点等,虽然这会很乏味,但我只是将数据复制并转置到一个完全独立的工作簿。
非常感谢任何帮助、提示、提示或技巧。
我看到两种方法:
- Power Query - Windows 2010 或更高版本必须有 Excel。
- 公式 - 必须 Excel 2019 或 365.
Power Query (PQ) 方法
这看起来可能有点复杂,但只需不到 5 分钟的时间,并且完全由鼠标完成。完成后,只需单击刷新即可更新数据。
首先将 table 转换为 excel table 并通过转到 数据选项卡 和 selecting 来自 Table/Range:
这将打开 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。它专为解决您的问题而设计。
我非常喜欢这个项目,我希望也许我在正确的轨道上或在正确的地方去问,因为我在 Excel 并在其中使用函数。
目前,我得到的数据集的格式非常不符合我的需要。在照片中,我创建了我能创建的最简单的类似数据样本,尽管我正在处理的实际数据集通常约为 144 行 x 35 列。如果照片没有显示,我可以描述此数据的最佳方式是:
- A 列将包含代理名称,每个代理名称占用 3 个垂直合并的单元格
- B 列将有“平均信用”、“信用金额”和“信用量”,每个占据一个单元格并在列中重复,直到到达代理名称的最后一个合并单元格
- 从第 1 行开始,c 到 h 的日期将从 6/1/2021 到 6/6/2021
然后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 列下的非空白数据点等,虽然这会很乏味,但我只是将数据复制并转置到一个完全独立的工作簿。
非常感谢任何帮助、提示、提示或技巧。
我看到两种方法:
- Power Query - Windows 2010 或更高版本必须有 Excel。
- 公式 - 必须 Excel 2019 或 365.
Power Query (PQ) 方法
这看起来可能有点复杂,但只需不到 5 分钟的时间,并且完全由鼠标完成。完成后,只需单击刷新即可更新数据。
首先将 table 转换为 excel table 并通过转到 数据选项卡 和 selecting 来自 Table/Range:
这将打开 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。它专为解决您的问题而设计。