我有一个Excel工作表,该工作表具有数据库中的值。一个单元格有多个选择问题的答案,这些问题是用管道分隔的。例如,一个用户可能问你有什么颜色的车?使用以下选项:
A. Black
B. White
C. Red
D. Yellow
因此用户可以用A,C和D进行响应。这些值存储在一个单元格中,例如“ A.黑色| C。红色| D。黄色”。我想将这些值分别在A列,B中分开列,C列和D列。
我尝试使用“文本到列”功能,但这确实知道A列应仅包含As。
我稀疏,我需要在每列中添加一个公式以查找“ A。”,“ B。”,“ C”。或“ D”。然后找到下一个可用的管道字符。我想我可能需要某种子串。可能是这样的:
=LEFT(C2,LEN(C2)-FIND("A.",C2))
但是我不知道如何找到下一个出现的管道符号-有什么想法吗? excel中可能有nextIndexOf函数吗?
非常感谢
答案 0 :(得分:0)
我认为这将需要VBA或Power Query,因为您正在谈论必须分析数据以确定它进入哪一列。在Power Query中实际上很容易做到,但是如果您甚至从未听说过Power Query(它内置于Excel 2016+中,并且是2013年的免费外接程序),那么此解决方案可能会超出范围,而无需进行详细说明什么是Power Query。
话虽这么说,对于感兴趣的任何人,我都将这些虚拟数据集转换为带有Power Query的输出表,我相信这是问题的所在。
这是查询的代码。快速总结是我们用管道定界符将其拆分并为其编制索引。然后,主要技巧是将Group函数与Transpose函数结合使用,以将拆分的列转换为未透视的数据集。从小组中撤出后,我们可以从答案中拆分“ ABCD”部分,然后将其移开以使ABCD列与原始条目对齐。
let
Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
#"Split Column by Delimiter" = Table.SplitColumn(Source, "Column1", Splitter.SplitTextByDelimiter("|", QuoteStyle.Csv), {"Column1.1", "Column1.2", "Column1.3", "Column1.4"}),
#"Added Index" = Table.AddIndexColumn(#"Split Column by Delimiter", "Index", 1, 1),
#"Grouped Rows" = Table.Group(#"Added Index", {"Index"}, {{"Rows", each Table.Transpose(Table.RemoveColumns(_, {"Index"})), type table}}),
#"Expanded Rows" = Table.ExpandTableColumn(#"Grouped Rows", "Rows", {"Column1"}, {"Rows.Column1"}),
#"Filtered Rows" = Table.SelectRows(#"Expanded Rows", each ([Rows.Column1] <> null)),
#"Split Column by Delimiter1" = Table.SplitColumn(#"Filtered Rows", "Rows.Column1", Splitter.SplitTextByDelimiter(". ", QuoteStyle.Csv), {"Selection", "Answer"}),
#"Pivoted Column" = Table.Pivot(#"Split Column by Delimiter1", List.Distinct(#"Split Column by Delimiter1"[Selection]), "Selection", "Answer")
in
#"Pivoted Column"