excel - 从字符串 excel 中检索多个匹配项
问题描述
对不起,如果这是一个愚蠢的问题,但我已经绞尽脑汁好几天了,我似乎无法提出解决方案。
我有一个短语列表和一个需要搜索、提取和替换的关键字列表。
例如,我在工作表 1 列 A 中有以下关键字列表,这些关键字需要提取并替换为 B 列中的关键字。
red - orange
blue - violet
green - pink
yellow - brown
在表 2 中,我在 A 列中有一个短语列表。
The girl with blue eyes had a red scarf.
I saw a yellow flower.
My cousin has a red car with blue rims and green mirrors.
我想在 B 列中提取与每个短语匹配的关键字,它们的显示顺序与它们的显示顺序完全相同:
COLUMN A COLUMN B
The girl with blue eyes had a red scarf. violet, orange
I saw a yellow flower. brown
My cousin has a red car with blue rims and green mirrors. orange, violet, pink
有什么办法可以通过公式或VBA来实现?这也需要与 Excel 2016 一起使用,所以我不能使用像“TEXTJOIN”这样的花哨功能。
提前谢谢大家!
干杯!
乐
我能够找到一些代码几乎可以完成我需要它做的事情,但它没有保持正确的顺序。
无论如何它可以被修改以产生所需的结果?不幸的是,我对 VBA 不是很好。:(
Sub test()
Dim datacount As Long
Dim termcount As Long
datacount = Sheets("Sheet1").Cells(Rows.Count, "A").End(xlUp).Row
termcount = Sheets("Sheet2").Cells(Rows.Count, "A").End(xlUp).Row
For i = 1 To datacount
dataa = Sheets("Sheet1").Cells(i, "A").Text
result = ""
For j = 1 To termcount
terma = Sheets("Sheet2").Cells(j, "A").Text
termb = Sheets("Sheet2").Cells(j, "B").Text
If InStr(dataa, terma) > 0 Then
If result = "" Then
result = result & termb
Else
result = result & ", " & termb
End If
End If
Next j
Sheets("Sheet1").Cells(i, "B").Value = result
Next i
End Sub
解决方案
我建议您使用自 Excel 2013 以来的内置函数Power Query 。
假设 Sheet1 上的颜色文本字符串位于名为Tbl_LookUp的表中
假设 Sheet2 上的短语在另一个名为Tbl_Phrases的表中
转到Data
Excel 的选项卡并将两个表加载到 Power Query 编辑器(您可以在 Excel 2016 中搜索如何将数据从表加载到 PQ 编辑器)。请注意,屏幕截图来自 Excel 365。
加载后,转到Tbl_Phrases查询,然后执行以下步骤:
- 添加从 1 开始的索引列
- 按分隔符拆分短语列,
space
用作分隔符并选择将结果放入rows
- 将当前查询与Tbl_LookUp查询合并,使用该
Phrase
列匹配该Old Text
列 - 展开新列以显示列中的
New Text
内容 New Text
按列分组Index
,可以选择对New Text
列中的值求和,分组后会报错。转到公式字段并将公式的这一部分替换List.Sum([New Text])
为Text.Combine([New Text],", ")
。按回车键,错误将更正为所需的文本字符串。
以下是上述查询的完整M 代码。您可以将其复制并粘贴到高级编辑器中,而无需手动完成每个步骤:
let
Source = Excel.CurrentWorkbook(){[Name="Tbl_Phrases"]}[Content],
#"Changed Type" = Table.TransformColumnTypes(Source,{{"Phrases", type text}}),
#"Added Index" = Table.AddIndexColumn(#"Changed Type", "Index", 1, 1, Int64.Type),
#"Split Column by Delimiter" = Table.ExpandListColumn(Table.TransformColumns(#"Added Index", {{"Phrases", Splitter.SplitTextByDelimiter(" ", QuoteStyle.Csv), let itemType = (type nullable text) meta [Serialized.Text = true] in type {itemType}}}), "Phrases"),
#"Changed Type1" = Table.TransformColumnTypes(#"Split Column by Delimiter",{{"Phrases", type text}}),
#"Merged Queries" = Table.NestedJoin(#"Changed Type1", {"Phrases"}, Tbl_LookUp, {"Old Text"}, "Tbl_Replace", JoinKind.LeftOuter),
#"Expanded Tbl_Replace" = Table.ExpandTableColumn(#"Merged Queries", "Tbl_Replace", {"New Text"}, {"New Text"}),
#"Grouped Rows" = Table.Group(#"Expanded Tbl_Replace", {"Index"}, {{"Look up color", each Text.Combine([New Text],", "), type nullable text}})
in
#"Grouped Rows"
当您在Tbl_Phrases查询中完成添加索引列时,即上面的第 1 步,您可以制作查询的副本(只需右键单击原始查询并选择“复制”),然后您将有第二个查询称为Tbl_Phrases (2)。在您完成编辑原始查询并以所需的文本字符串结束之前,无需处理此查询。
然后,您可以使用索引列将Tbl_Phrases (2)查询与Tbl_Phrases查询合并。展开新列以显示列中的内容look up colour
。最后,将该Phrases
列与look up color
带有 delimiter的列合并(space)-(space)
,并删除索引列,然后您应该拥有所需的文本字符串。
这是Tbl_Phrases (2)查询的M 代码。提醒一下,您必须先完成Tbl_Phrases查询,否则合并查询步骤将导致错误:
let
Source = Excel.CurrentWorkbook(){[Name="Tbl_Phrases"]}[Content],
#"Changed Type" = Table.TransformColumnTypes(Source,{{"Phrases", type text}}),
#"Added Index" = Table.AddIndexColumn(#"Changed Type", "Index", 1, 1, Int64.Type),
#"Merged Queries" = Table.NestedJoin(#"Added Index", {"Index"}, Tbl_Phrases, {"Index"}, "Tbl_Phrases", JoinKind.LeftOuter),
#"Expanded Tbl_Phrases" = Table.ExpandTableColumn(#"Merged Queries", "Tbl_Phrases", {"Look up color"}, {"Look up color"}),
#"Merged Columns" = Table.CombineColumns(#"Expanded Tbl_Phrases",{"Phrases", "Look up color"},Combiner.CombineTextByDelimiter(" - ", QuoteStyle.None),"Merged"),
#"Removed Columns" = Table.RemoveColumns(#"Merged Columns",{"Index"})
in
#"Removed Columns"
然后,您可以将Tbl_Phrase (2)查询加载到同一工作簿中的所需工作表(或 Sheet2 上的某个位置)。
如果您有任何问题,请告诉我。
推荐阅读
- java - 从当前格林威治标准时间到格林威治标准时间晚上 9 点获取差异
- spring-boot - Spring Boot 手动提交事务
- hibernate - 与 JPA 存储库一起使用时 SQL 语句不起作用
- python - 需要帮助来加速此代码 - Python 和 numpy
- ubuntu-16.04 - 在 cloud-config 中使用 Jinja 模板“ssh-rsa {{ v1.public_ssh_keys }}”会给出警告“找不到 text/jinja2 类型支持的子处理程序”
- swift - iPhone Xs 中的“主线程检查器:在后台线程上调用 UI API”错误,在模拟器中工作正常
- python - Boost Python自己的模块抛出分段错误`GlobalError::PushToStack()`
- windows - IIS 管理器丢失和 HTTP 错误 503
- javascript - Jest 遇到了一个意外的令牌:实现 try/catch
- javascript - 如何根据属性的值从对象中提取