【问题标题】:Iterative formulas in Excel to reformat data onto a new sheet without using VBAExcel 中的迭代公式可在不使用 VBA 的情况下将数据重新格式化到新工作表上
【发布时间】:2021-09-07 13:20:23
【问题描述】:

我对这个项目非常坚持,我希望也许我在正确的轨道上或在正确的地方问,因为我在 Excel 和使用函数方面非常新手在里面。

目前,我得到了一个数据集,该数据集的格式非常不幸,无法满足我的需求。在照片中,我创建了最简单的类似数据样本,尽管我正在使用的实际数据集通常约为 144 行 x 35 列。如果照片没有显示,我可以描述这些数据的最佳方式是:

  • A 列的代理名称将占据 3 个垂直合并单元格
  • B 列将包含“平均信用”、“信用金额”和“信用量”,每个单元格占用一个单元格并在该列中向下重复,直到到达代理名称的最后一个合并单元格
  • 从第 1 行开始,从 c 到 h 的日期将从 2021 年 6 月 1 日到 2021 年 6 月 6 日

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

我想做的是,在同一个工作簿的单独工作表上,使用某种公式或其他东西可以让我的数据成为一个简单的表格,其中包含日期、代理名称、平均信用、信用金额、和信用量作为我的标题,如下图所示:

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

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

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

【问题讨论】:

  • 为什么不能用vba?完成这项任务可能需要 Vba。
  • 我真的很想这样做,因为我确信它会让它变得如此简单,但我被告知,由于此工作簿的性质是使用 SharePoint 跨平台共享以及发送直接下载它可能会破坏代码或代码根本无法保存。我不知道这样做的有效性,我希望我知道,但我认为安全总比抱歉好。

标签: arrays excel sorting automation


【解决方案1】:

我看到了两种方法:

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

Power Query (PQ) 方法

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

首先将表格转换为 excel 表格并通过转到 Data 选项卡并选择 From Table/Range 导入 PQ 编辑器:

对有标题的表格说“是”:

这将打开 PQ 编辑器。选择代理名称字段,然后从转换选项卡中选择Fill Down

现在选择代理名称column1,然后右键单击并选择Unpivot Other Columns

现在您的数据几乎就在那里 - 它们被规范化为具有属性的列,

因此您需要将它们转换为您在上面提出的形式。下一步是选择 Column1,然后从 Transform 标签 中选择 Pivot。它将弹出一个窗口,您可以在其中选择 Value 作为您要旋转的字段:

点击确定,现在你可以看到你想要的表格了:

现在您需要将其恢复到 Excel 中。在首页标签上,点击关闭并加载到

然后选择表格新建工作表

你已经完成了。

如果您将新数据添加到数据中,您只需右键单击上面创建的表格并选择刷新,它就会使用新数据更新表格。如果你想将它应用到未来的数据表中,它很容易修改,而无需重复整个过程。

公式法

这已经是一篇很长的帖子了,这个方法需要一些认真的公式工程,所以我现在只强调这个方法,但是如果有趣的话,在 cmets 中说出来,我会完成这个帖子。

这是一个反透视的公式,但它不适合您的表格,因为:

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

用 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。它专为像您一样的问题而设计。

【讨论】:

  • 非常感谢,马克!使用电源查询创造了奇迹。我仍然对方法 2 所需的公式感到好奇,但这更多是出于个人的好奇心,我肯定会培训我的团队使用 power query 进行数据拉取。
  • Power Query 专为此类作业而设计。它被称为 ETL(提取转换和加载)工具。学习足够强大是很容易的。至于公式,我越想填充,我就越意识到这绝非易事。但即使这样可行,它仍然需要输出的一个支点,此时,您只需举起双手说“当 PQ 可以在几秒钟内将其切片时,为什么要做这一切?”。旋转会破坏公式给出的唯一值 - 无需刷新的即时结果。
  • 那么,如果这是答案,你能把它标记为答案吗?
  • 现在才看到,抱歉!我对这个网站的工作方式也不太了解,但我认为我将其标记为答案。非常感谢您的帮助
猜你喜欢
  • 2014-11-24
  • 2015-03-04
  • 1970-01-01
  • 1970-01-01
  • 2018-11-16
  • 2022-01-26
  • 1970-01-01
  • 1970-01-01
  • 2016-05-09
相关资源
最近更新 更多