在MS Excel中创build一个“search”function

我有一个.XLS文件中> 100,000个诊断代码的列表,并且需要从这个代码中提取与许多特定疾病相关的代码。

我希望能够做到的是在列A中包括所有100,000个诊断代码,在列B中包括诊断标签,然后有一个“search术语”单元格(例如C1),在这个单元格中我可以写出诸如“骨折” 。

然后,我想所有的诊断代码,包括string“骨折”出现在D列。

有没有在Excel中做这个简单的方法? 我在网上查找没有太大的成功,但这可能是因为我不知道从哪里开始。 条件格式没有帮助,因为滚动100,000个代码仍然难以pipe理,即使它们很好地突出显示。

任何最初的想法或提示,我可以尝试寻找将是非常受欢迎的。

示例数据集:

238 Fracture of proximal humerus 202 Aortic stenosis 990 Chronic obstructive pulmonary disease 302 Hip fracture 182 Recurrent fractures 094 Marfan syndrome 298 Diabetic retinopathy 

我意识到你没有要求filter,但如果你打开一个稍微不同的解决scheme,这似乎运作良好。 列标题和值应该从单元格A2开始。 然后在单元格B1键入您的search词。 它也将过滤通配符,不区分大小写(即显示fractureFracturefracturesFracturesfracturedFractured )。

 Option Explicit Sub Filter() Dim MyArray() As Variant Dim MyNewArray() As Variant Dim i As Long Dim item As Variant Dim FilterRange As Range With ActiveSheet Set FilterRange = .Range(.Cells(2, 1), .Cells(.Rows.Count, 1).End(xlUp)) MyArray = Application.Transpose(FilterRange) i = 0 For Each item In MyArray If UCase(item) Like "*" & UCase(Range("B1")) & "*" Then ReDim Preserve MyNewArray(i) MyNewArray(i) = item i = i + 1 End If Next item .Range(FilterRange.Address).AutoFilter Field:=1, Criteria1:=MyNewArray(), Operator:=xlFilterValues End With End Sub 

此外,您可以在Worksheet对象中添加以下内容,以便您不必单击button即可运行该macros:

 Option Explicit Private Sub Worksheet_Change(ByVal Target As Range) If Not Application.Intersect(Target, Range("B1")) Is Nothing Then Call Filter End If End Sub 

老实说,你可以使用Filter > Text Filters > Custom Filter实现同样的function。 你也可以使用通配符。 🙂

我们可以使用帮助列来查找匹配的行。 在E1中input:

 =MATCH("*" & $C$1 & "*",B:B,0) 

E2中input:

 =IFERROR(MATCH("*" & $C$1 & "*",INDEX(B:B,E1+1):INDEX(B:B,999999),0)+E1,"") 

并抄下来。 E栏告诉我们在哪里匹配。然后在D1中input:

 =IFERROR(INDEX(A:A,E1),"") 

并抄下来:

在这里输入图像说明

这是执行关键字search的相当标准的方法。

假设你想在B列中searchC1中包含的术语,你可以尝试在A中使用它

 =IF(C1<>"",IFERROR(FIND(C1,B1,1),0),0) 

如果C1中的文本存在,这将返回一个数字,否则为0。

然后你可以设置D

 =IF(A1>0,B1,"") 

你会得到这个

在这里输入图像描述

我正在把stringsearch在第一行。

在第2行中,我进行了一个string匹配,以获得列A中C1的匹配的第一个实例。

 C2 =INDEX($A:$A,MATCH("*"&C1&"*",$A2:$A$100,0)+1) 

然后find下一个匹配从与第一行匹配C2行的数组开始。 我正在修改最后一行为A100,您可以更改。

 C3 =INDEX($A:$A,MATCH("*"&$C$1&"*",INDIRECT("A"&MATCH(C2,$A:$A,0)+1&":A100"),0)+MATCH(C2,$A:$A,0)) 

根据需要复制公式。 然后根据需要复制列。

您可以使用IFERROR来包装公式以抑制N / A。

在这里输入图像说明

您也可以在Excel中使用高级filter,方法是转到Data | Advanced: –

在这里输入图像说明

请注意,C1和D1中的列标题必须与A1和B1中的列标题匹配。

你也可以采用DIY方法:

 =IFERROR(INDEX(B:B,SMALL(IF(ISNUMBER(SEARCH($H$2,$B$1:$B$100000)),ROW($B$1:$B$100000)),ROW(1:1))),"") 

假设search词是在H2中,从J2开始,并根据需要拉下来。 这可能是有点慢,100K条款,但可用。 必须使用Ctrl Shift Enter作为数组公式input