【问题标题】:Create a new row for each cell containing a value为每个包含值的单元格创建一个新行
【发布时间】:2015-10-09 16:26:34
【问题描述】:

我有一个类似这样的表:

ID | Item 1 | Item 2 | Item 3 | Qty 1 | Qty 2 | Qty 3
1  |        |    X   |    X   |       |   3   |   4 
2  |    X   |        |    X   |   2   |       |   1
3  |        |        |    X   |       |       |   9

我需要找到一种方法为每个 ID 的每个项目创建一个新行:

ID | Item | Qty
1  |   2  |  3
1  |   3  |  4
2  |   1  |  2

有没有办法通过公式、本机 Excel 工具或 VBA 来实现?

【问题讨论】:

  • 到目前为止,我已经尝试转置并尝试创建一个 if 语句,以便仅当单元格有数据时才在单元格中查找和放置。
  • =IF('1stCut'!B2"",'1stCut'!B2,(IF('1stCut'!C2"",'1stCut'!C2,(IF(' 1stCut'!D2"",'1stCut'!D2,(IF('1stCut'!E2"",'1stCut'!E2,(IF('1stCut'!F2"",'1stCut' !F2,(IF('1stCut'!G2"",'1stCut'!G2,(IF('1stCut'!H2"",'1stCut'!H2,(IF('1stCut'!I2"",'1stCut'!I2,(IF('1stCut'!J2"",'1stCut'!J2,(IF('1stCut'!K2"",'1stCut'!K2,(IF ('1stCut'!L2"",'1stCut'!L2,(IF('1stCut'!M2"",'1stCut'!M2,(IF('1stCut'!N2"",' 1stCut'!N2,(IF('1stCut'!O2"",'1stCut'!O2,(IF('1stCut'!P2"",'1stCut'!P2,(IF('1stCut'! Q2"",'1stCut'!Q2,(IF('1stCut'!R2"",'1stCut'!R2,""))))))))))))))))) ))))))))))))))))))))))
  • 所以您是说第二个表中每个 ID 的行数不是静态的?否则,Vlookup 就可以了。
  • 正确,ID需要为每个当前的Item值重复。
  • 我认为最简单的措辞是:对于在一行中的单元格中找到的每个值,创建一个包含该值的新行

标签: sql excel excel-formula unpivot vba


【解决方案1】:

使用详细描述的技术here 得到一个如下所示的表:

删除 ColumnC 为 (Blanks)X 的位置。选择 ColumnB 和 HOME > 编辑 - 查找和选择,替换...,查找内容:Qty,全部替换。调整列标签并全部居中。然后你应该有一个像这样的表:

您可以通过右键单击其中一个单元格 Table、Convert to Range 来选择将其转换为 Rage。

【讨论】:

  • 是的,我认为这是最好的方法。我不知道 alt + D+ P。您也可以只过滤掉 C 列中的 x 和空白,而不是根据需要删除它们。
  • 谢谢你!这给了我我需要的东西。
【解决方案2】:

您可以使用 Microsoft Query 来指向您的数据表。选择您的数据,然后在顶部公式栏左侧的框中键入名称,为其指定一个命名范围。

将您的工作簿保存到某个目录。然后选择它作为数据源:

  • 点击顶部的数据标签。
  • 选择“来自其他来源”按钮。
  • 从菜单中选择“来自 Microsoft Query”。
  • 选择“Excel 文件”数据源。
  • 查找并选择将工作簿保存为的数据文件。
  • 如果您收到未找到表的错误消息,请单击“确定”,然后 选择底部的“选项...”按钮并确保选中 显示所有类型的表格。
  • 选择您的数据所在的表格或工作表并移动所有列 移到右侧框,然后单击下一步。
  • 在过滤器对话框中再次单击下一步。
  • 在排序对话框中再次单击下一步。
  • 选择在 Microsoft Query 中查看数据或编辑查询,然后单击完成。
  • 单击 Microsoft Query 中的查看菜单并选择“SQL...”
  • 输入此 SQL 语句(并更改目录路径以匹配 您保存文​​件的位置:


    SELECT `Sheet1$`.ID, 
    `Sheet1$`.Qty1
    FROM `C:\Users\MyName\Desktop\data.xlsx`.`Sheet1$` `Sheet1$`
    WHERE (`Sheet1$`.Item1='x')
    union
    SELECT `Sheet1$`.ID, 
    `Sheet1$`.Qty2
    FROM `C:\Users\MyName\Desktop\data.xlsx`.`Sheet1$` `Sheet1$`
    WHERE (`Sheet1$`.Item2='x')
    union
    SELECT `Sheet1$`.ID, 
    `Sheet1$`.Qty3
    FROM `C:\Users\MyName\Desktop\data.xlsx`.`Sheet1$` `Sheet1$`
    WHERE (`Sheet1$`.Item3='x')
  • 点击确定
  • 选择文件菜单,然后选择“Return Data to Microsoft Excel”。
  • 为您的数据选择目标单元格,然后单击“确定”。

【讨论】:

  • 能够通过这两种解决方案达到目标...也感谢 Brian!
  • 欢迎您...很高兴为您提供帮助。 :) 这种方法要记住的一个优点是,如果您需要更改数据,您只需编辑数据表,右键单击结果表,然后选择“刷新”即可立即刷新。您无需再执行所有步骤即可重现您的输出。
猜你喜欢
  • 2014-10-30
  • 1970-01-01
  • 1970-01-01
  • 2018-12-03
  • 2023-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多