search数组中的文本string的部分匹配并返回更长的匹配
我有一个地点列表,其中大部分都包含城镇名称。 我想提取城镇名称。 但是,一些城镇名称包含在其他名称中,例如“哈德利”和“东哈德利”。 基于这篇文章 ,我发现了两个不同的解决scheme,我的问题(见下图)。 但是,根据D列中城镇名称的顺序,结果可能会返回较短或较长的名称。 我怎样才能获得更完整的比赛? 我有超过18000条logging,所以需要一个自动的解决scheme。
列B(顶部)中的数组公式和列C中的公式(底部)
所以,根据我的评论,这两个公式都没有起作用的原因与excelsearch一个方向直到find一个匹配然后停止search的事实,即使有更好的匹配。
你的第一个方程从上到下search,第二个从下到上search,这就是为什么你得到不同的答案。
为了解决这个问题,search区域必须按照某种顺序排列。 它必须沿着searchpath从最长的string到最短的string。
为此,请在E中添加一个帮助器列。将公式Len(D2)
放入E2中,然后复制下来。 然后对列E的列D和E进行sorting:
那么你只需要使用第一个等式:
如果你喜欢第二个,按照升序排列D和E:
并使用第二个等式:
第三个select是做两个,并采取最长的,但这是更简单的sortingsearch列表可以做更快的步骤。
我认为你可以比较列B和C的结果在一个新的列中最大的string: =IF(LEN(B2)>LEN(C2);B2;C2)
只是给你一个没有sorting或帮手的解决scheme:
=INDEX($D$2:$D$6,MAX((MAX(NOT(ISERROR((FIND($D$2:$D$6,A2)>0)))*LEN($D$2:$D$6))=LEN($D$2:$D$6))*NOT(ISERROR(FIND($D$2:$D$6,A2)))*ROW($1:$5)))
或者不同的(稍微快一点)的方式:
=INDEX($D$2:$D$6,MAX((MIN(LEN(SUBSTITUTE(A2,$D$2:$D$6,"")))=LEN(SUBSTITUTE(A2,$D$2:$D$6,"")))*ROW($1:$5)))
然而:我不build议使用这个…虽然小桌子可以,但计算的时间将会为每个额外的关键字提供极大的帮助。
如果找不到匹配,第一个公式将输出列表中的第一个项目,第二个公式将输出列表的最后一个项目。
更好地使用斯科特·卡纳(Scott Carner)的解决scheme,按照长度sorting(应该快得多,但是你可以自己检查一下)
至less,你也可以这样使用vba:
Public Function maxMatch(str As String, rng As Range) As String Dim cell As Variant For Each cell In rng.Value If InStr(str, cell) > 0 And Len(cell) > Len(maxMatch) Then maxMatch = cell Next End Function
然后只需放入cell =maxMatch(A2,$D$2:$D$6)
(但是,你哪里不去VBA,所以不计算);)