arrays - Excel 中的迭代公式可在不使用 VBA 的情况下将数据重新格式化到新工作表上
问题描述
我非常坚持这个项目,我希望也许我在正确的轨道上或在正确的地方提问,因为当谈到 Excel 并使用其中的函数时,我是一个非常新手。
目前,我得到了一个以非常不幸的方式格式化的数据集,以满足我的需求。在照片中,我创建了最简单的类似数据样本,尽管我使用的实际数据集通常约为 144 行 x 35 列。如果照片没有显示,我可以描述这些数据的最佳方式是:
- A 列将具有代理名称,每个名称占用 3 个垂直合并单元格
- B 列将具有“平均信用”、“信用金额”和“信用量”,每个占用一个单元格并沿列向下重复,直到到达代理名称的最后一个合并单元格
- 从第 1 行 cols c 到 h 开始,日期将从 2021 年 6 月 1 日到 2021 年 6 月 6 日
然后 C2:H16 填写每个代理每天申请的信用对应的数字。如果代理当天没有申请信用,则相应的 3 个单元格将留空。
我想做的是,在同一个工作簿的单独工作表上,使用某种公式或可以让我的数据成为包含日期、代理名称、平均信用、信用金额和信用量的简单表格的东西作为我的标题,如下图:
理想情况下,如果日期下方有一个有效的非空白单元格,我什至只想在新工作表中放置值,但实际上我完全可以使用任何类型的嵌套公式,无论它是否过滤掉这些公式都可以完成工作或不。不幸的是,这必须在不使用 VBA 且不使用 Excel 中的内置功能区选项的情况下完成。
最初我希望我可以通过某种嵌套的 vlookup 和 if 语句来实现这一点,但我有点过头了。作为最后的努力,我计划在工作簿中创建 31 个额外的工作表,并在每张工作表上使用过滤器功能,同时过滤每张工作表上的不同列,即工作表 2 将过滤列 c 下的非空白数据点,表 3 将过滤 d 列下的非空白数据点等,虽然这很乏味,但我只需将数据复制并转置到一个完全独立的工作簿中。
非常感谢任何帮助、提示、提示或技巧。
解决方案
我看到两种方法:
- Power Query - 必须有 Excel for Windows 2010 或更高版本。
- 公式 - 必须有 Excel 2019 或 365。
电源查询 (PQ) 方法
这可能看起来很复杂,但它需要不到 5 分钟的时间,并且完全由鼠标完成。完成后,只需单击刷新即可更新数据。
首先将表格转换为 excel 表格并通过转到Data 选项卡并选择From Table/Range导入 PQ 编辑器:
这将打开 PQ 编辑器。选择代理名称字段,然后从“转换”选项卡中选择“向下填充”。
现在选择代理名称和column1,然后右键单击并选择Unpivot Other Columns。
现在您的数据几乎就在那里 - 它们被规范化为具有属性的列,
所以您需要将它们转换为您在上面提出的形式。下一步是选择Column1,然后从Transform 选项卡中选择Pivot。它将弹出一个窗口,您可以在其中选择Value作为要旋转的字段:
单击确定,现在您可以看到您想要的表格:
现在你需要把它放回 Excel。在主页选项卡上,单击关闭并加载到:
然后选择表和新工作表:
你完成了。
如果您将新数据添加到数据中,您只需右键单击上面创建的表并选择刷新,它将使用新数据更新表。如果你想将它应用到未来的数据表中,它很容易修改,而无需重复整个过程。
公式法
这已经是一个很长的帖子了,这个方法需要一些严肃的公式工程,所以我现在只强调这个方法,但如果它有趣,请在评论中说出来,我会完成这个帖子。
这是一个反透视的公式,但它不适合您的表格,因为:
- 它需要将这些合并的名称填充到下面的单元格中(即向下填充)和
- 它将空白单元格视为零。
在 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 数据透视表或通过编写另一个复杂的公式来旋转它来完成,这很难。
所以...如果您有 Excel for Windows 2010 或更高版本,我会选择 Power Query。它专为像您这样的问题而设计。
推荐阅读
- javascript - 将数据存储到firebase中的多个参考的最有效方法是什么?
- javascript - NativeScript Vue - 材料设计图标未显示
- vue.js - this.myClick() 在这个 vue js 方法中做了什么,我该如何测试它?
- c++ - 用于向量中结构的 C++ 访问索引或使用引用而不是值
- ios - swift UITextFieldDelegate 扩展
- python-3.x - 无法添加存储在谷歌驱动器中的文件夹的路径
- c - arc4random_buf 是否有最佳批量大小?
- android - Firebase ServerValue#TIMESTAMP 与 updateChildren()
- terminal - Gatsby eslint-loader 将所有错误记录到终端窗口 - 为什么?
- css - Bootstrap 4 div(带有btn类)中的垂直对齐文本,使用CSS Grid(并且没有flexbox)时没有固定高度