为每个包含值的单元格创建一个新行

Posted

技术标签:

【中文标题】为每个包含值的单元格创建一个新行【英文标题】: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值重复。 我认为最简单的措辞是:对于在一行中的单元格中找到的每个值,创建一个包含该值的新行 【参考方案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! 欢迎您...很高兴为您提供帮助。 :) 这种方法要记住的一个优点是,如果您需要更改数据,您只需编辑数据表,右键单击结果表,然后选择“刷新”即可立即刷新。您无需再执行所有步骤即可重现您的输出。

以上是关于为每个包含值的单元格创建一个新行的主要内容,如果未能解决你的问题,请参考以下文章

在包含特定值的单元格旁边插入单元格

将字符串值分配给pandas中的单元格

VBA宏在Excel中格式化1个包含文本行的单元格,并将这些行添加到单独的行中

单个单元格中的计数或总和(?)项目,与Excel中的列表中的条件匹配

将 pandas 中的一个单元格拆分为多行

如何保持每个单元格中合并单元格的值?