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,所以不计算);)