如何根据列表中的项目过滤数据?

如何根据列表中的项目过滤数据?

如何在单词列表中筛选包含特定单词的条目?例如,我有一份新加坡道路名称列表。

新加坡厦门街
安祥山
安顺路
阿拉伯
街 新加坡亚美尼亚街
B巴格达街 (新加坡)
马里士他路
班达街
巴特礼
路 新加坡
美芝路明古连街
伯南街
驳船码头
文达
街 新加坡边界路 勿
拉士峇沙路 武吉士
街 武吉巴督路 武吉巴梳路 武吉知 马路 C 坎顿门路蔡厝港路 克拉码头 金文泰路 客 纳街 哥烈码头 康诺特通道 克雷格路 (新加坡) 克罗士街 等等












我的电子表格中有大量如下所示的条目,其中可能包含也可能不包含我的列表中提到的道路名称:

  1. 在汤姆森路看到一场事故
  2. 偶然发现的
  3. 6 辆汽车在马里士他路相撞
  4. 我现在想睡觉。太累了。
  5. 巴士在阿拉伯街与自行车相撞。
  6. 城市道路发生事故。
  7. 你稍后可以闯进我的房子。

如何过滤以返回包含名称列表中标识的任何道路名称的条目?如何将道路名称数组/列表引入 Microsoft Excel,然后将其与过滤函数关联?

答案1

首先,如果要匹配包含“厦门街”的句子,则需要从第一个条目中删除“,新加坡”(以及包含它的其他条目,“(新加坡)”也是如此)。您可能希望使用辅助列中的公式来执行此操作,因此我们假设您的最小化道路名称列表位于单元格中B1B42并假设您的七个例句(或一万七千个,或者您有多少个)在列中 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))))

这不区分大小写。如果您希望区分大小写,请将其替换SEARCHFIND

此解决方案可查找子字符串。区分大小写可降低出现“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

答案3

您可以使用高级筛选。请查看以下帖子:

https://wmfexcel.com/2017/08/02/filter-a-lists-of-items-from-a-long-long-list/

相关内容