在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词。 它也将过滤通配符,不区分大小写(即显示fracture
, Fracture
, fractures
, Fractures
, fractured
, Fractured
)。
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