![如何根据列表中的项目过滤数据?](https://linux22.com/image/1385304/%E5%A6%82%E4%BD%95%E6%A0%B9%E6%8D%AE%E5%88%97%E8%A1%A8%E4%B8%AD%E7%9A%84%E9%A1%B9%E7%9B%AE%E8%BF%87%E6%BB%A4%E6%95%B0%E6%8D%AE%EF%BC%9F.png)
如何在单词列表中筛选包含特定单词的条目?例如,我有一份新加坡道路名称列表。
新加坡厦门街
安祥山
安顺路
阿拉伯
街 新加坡亚美尼亚街
B巴格达街 (新加坡)
马里士他路
班达街
巴特礼
路 新加坡
美芝路明古连街
伯南街
驳船码头
文达
街 新加坡边界路 勿
拉士峇沙路 武吉士
街 武吉巴督路 武吉巴梳路 武吉知 马路 C 坎顿门路蔡厝港路 克拉码头 金文泰路 客 纳街 哥烈码头 康诺特通道 克雷格路 (新加坡) 克罗士街 等等
我的电子表格中有大量如下所示的条目,其中可能包含也可能不包含我的列表中提到的道路名称:
- 在汤姆森路看到一场事故
- 偶然发现的
- 6 辆汽车在马里士他路相撞
- 我现在想睡觉。太累了。
- 巴士在阿拉伯街与自行车相撞。
- 城市道路发生事故。
- 你稍后可以闯进我的房子。
如何过滤以返回包含名称列表中标识的任何道路名称的条目?如何将道路名称数组/列表引入 Microsoft Excel,然后将其与过滤函数关联?
答案1
首先,如果要匹配包含“厦门街”的句子,则需要从第一个条目中删除“,新加坡”(以及包含它的其他条目,“(新加坡)”也是如此)。您可能希望使用辅助列中的公式来执行此操作,因此我们假设您的最小化道路名称列表位于单元格中B1
。B42
并假设您的七个例句(或一万七千个,或者您有多少个)在列中 C
。输入
=AND(ISERROR(SEARCH(B$1:B$42, C1)))
进入单元格D1
并输入Ctrl+ Shift+ Enter。这会将公式输入为数组公式,使其出现在花括号中:
{=AND(ISERROR(SEARCH(A$1:A$3, B1)))}
。向下拖动/填充以覆盖列 C
。这将对包含字符串的每个句子(C
值)求值为 FALSE,对不包含字符串的B1:B42
每个句子(值)求值为 TRUE。您可以对此进行过滤。如果您不喜欢这些值“向后”的事实,只需将表达式包装在NOT( )
:
=NOT(AND(ISERROR(SEARCH(B$1:B$42, C1))))
这不区分大小写。如果您希望区分大小写,请将其替换SEARCH
为FIND
。
此解决方案可查找子字符串。区分大小写可降低出现“Banson Road”和“Uboat Quay”等误报的可能性。如果道路名称永远不会出现在句子开头,您可以通过在 Column 中的每个道路名称前添加一个空格来消除这些子字符串匹配误报 B
。如果道路名称能出现在句子开头,然后这样做,并将公式更改为
=AND(ISERROR(SEARCH(B$1:B$42,
" " &
C1)))
要处理“康诺特先生开奔驰”,请执行相同的操作,但附加空格。这仍然无法处理“Connaught 先生开的是奔驰吗?”,因此您可能需要采用区分大小写的路线。
我已经针对少量字符串测试了这个解决方案。如果道路列表很长,它可能会失败。
答案2
使用自动筛选功能包含...选项。这将允许您查看包含给定文本字符串的项目。不包含该字符串的行将被隐藏。
编辑#1:
正如 James Jenkins 指出的那样,使用自动筛选功能包含... 不允许同时应用一长串包含的子字符串...........这里有一种基于 VBA 的替代方法。
假设我们有一个工作簿,其中有两个选项卡“道路”和“项目”。道路列表位于“道路”选项卡中,起始于A2。要过滤的项目列表位于“项目”选项卡中,起始于A2。
此宏首先将道路列表读入数组。该数组应用于项目列表中的每个项目。每个项目行要么隐藏,要么显示。
Sub FilterByList()
Dim s1 As Worksheet, s2 As Worksheet
Set s1 = Sheets("roads")
Set s2 = Sheets("items")
Dim N1 As Long, N2 As Long, L1 As Long, L2 As Long
Dim r1 As Range, r2 As Range
N1 = s1.Cells(Rows.Count, "A").End(xlUp).Row
N2 = s2.Cells(Rows.Count, "A").End(xlUp).Row
ReDim rds(1 To N1 - 1) As String
For L = 2 To N1
rds(L - 1) = s1.Cells(L, 1)
Next L
s2.Cells.EntireRow.Hidden = False
For L2 = 2 To N2
Set r2 = s2.Cells(L2, "A")
v2 = r2.Value
r2.EntireRow.Hidden = True
For L1 = 2 To N1
If InStr(1, v2, rds(L1 - 1)) > 0 Then
r2.EntireRow.Hidden = False
End If
Next L1
Next L2
End Sub