为每个包含值的单元格创建一个新行
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! 欢迎您...很高兴为您提供帮助。 :) 这种方法要记住的一个优点是,如果您需要更改数据,您只需编辑数据表,右键单击结果表,然后选择“刷新”即可立即刷新。您无需再执行所有步骤即可重现您的输出。以上是关于为每个包含值的单元格创建一个新行的主要内容,如果未能解决你的问题,请参考以下文章
VBA宏在Excel中格式化1个包含文本行的单元格,并将这些行添加到单独的行中