2017-04-07 113 views
1

我在寻找有关公式的帮助。用于比较部分匹配单元格的Excel公式

我需要比较两个单元格(不是列)中的文本。

其中一个单元格具有姓氏,另一个单元格可能具有部分姓氏以及附加数字和字母(不以任何特定顺序)。这些是我们想要找到的对。

不是所有的单元格都会匹配,但是对于部分文本匹配的单元格而言,它会像"MATCH"那样。

例如细胞E2= 000034568MILL WALLI和细胞J2=WALLINGER应带MATCH,因为细胞的WALLIE2匹配的文本的一部分。

又如:

E2= Benjamin P RouambaJ2=Roumbamoore应该带回比赛。

我希望这是有道理的,并有一个可能的公式。

+0

所以'WALLI'与'WALLINGER'匹配,好吧,前缀是一样的......但RouAmba与Roumba不一样,这是正确的吗?它应该带来一个“匹配”? –

回答

1

Excel中没有内置函数可以满足您的需求。您需要在VBA项目模块中自定义您自己的公式。所以我设法编写了一个计算匹配数量的函数。 Adter将其设置为模块后,可以在工作表中将其用作普通公式。

如果您不熟悉VBA编程,不要担心。按照说明将以下代码复制到VBA模块中。

Press 'Alt+F11' and, in the menu, select Insert > Module

Function CountPartialMatch(R1 As String, R2 As String, M As Long) As Long 

    Dim n As Long, L1 As Integer, L2 As Integer, Min As Integer, C As Integer, S1 As Integer, S2 As Integer 
    n = 0 
    L1 = Len(R1) 
    L2 = Len(R2) 
    Min = Application.WorksheetFunction.Min(L1, L2) 

    For C = M To Min 
     For S1 = 1 To (L1 - (C - 1)) 
      For S2 = 1 To (L2 - (C - 1)) 
       If Mid(R1, S1, C) = Mid(R2, S2, C) Then n = n + 1 
       Next S2 
      Next S1 
     Next C 

    CountPartialMatch = n 

End Function 

该公式需要3个参数:

=CountPartialMatch(First_Cell, Second_Cell, Min_Chrt) 

的参数Min_Chrt是字符的最小数目的匹配必须具备的。因此,如果您指定2,则会计算所有匹配的2个字符,3个字符,4,5,6 ......这会减少巧合的数量。如果它是1,公式会计算每个“a”=“a”,letter =字母。

请让我知道它是否适合您!

+3

只是一个提示:你不能在'VBA'中像这样在一行中声明多个变量..我的意思是,你可以,但在'VBA'中,只有最后一个变量被声明为'As Long',其他变量隐含地声明为“变体”。 –

+3

Dude ...你完全正确!我总是声明这样的变量,我认为我很好地减少了线扩展。我GOOGLE了那个,答案是在MSDN。因此,对于那些寻找源代码的人,请阅读以下完整指南:https://msdn.microsoft.com/en-us/library/office/gg264241.aspx –

0

如果你愿意使用VBA用户定义函数,你可以试试这个:

Cells_fMatch

它返回!Err如果与输入任何不一致的误差值(参数),如果找到匹配,则返回Match,否则返回NO Match(返回值可根据需要更改)

语法:Cells_fMatch(sCll_1, sCll_2[, iLenMin])

参数&描述:

sCll_1:字符串1要比较

sCll_2:字符串2要比较

iLenMin:可选匹配比较字符串的最小长度。缺省值为1. 数据类型字节接受最大值255,如果需要更高长度,则相应更改

该功能结合了For...Next语句和Instr函数来执行提供快速和准确结果的比较。

Public Function Cells_fMatch(sCll_1 As String, sCll_2 As String, Optional iLenMin As Byte = 1) As String 
Dim blCllMatch As Boolean 
Dim sCllVal As String 
Dim i As Integer 

    Rem Set Default Result 
    Cells_fMatch = "!Err" 

    Rem Validate Input 
    If Len(sCll_1) < iLenMin Then Exit Function 
    If Len(sCll_2) < iLenMin Then Exit Function 

    Rem Compare Cell Values 
    For i = 1 To (1 + Len(sCll_1) - iLenMin) 
     sCllVal = Mid(sCll_1, i, iLenMin) 
     If InStr(sCll_2, sCllVal) > 0 Then 
      blCllMatch = True 
      Exit For 
    End If: Next 

    Rem Set Results 
    Cells_fMatch = IIf(blCllMatch, "Match", "NO MATCH") 

End Function 

示例: 为了比较在细胞E2J2串的至少连续5个字符(值000034568MILL WALLIWALLINGER respectivelly)使用这个公式匹配:

=Cells_fMatch(E2,J2,5) 

这些页面将进一步解释关于该功能中使用的资源:

Function StatementDim Statement

If...Then...Else StatementFor...Next StatementInStr Function

+0

这很好用!感谢您的帮助! – Krebswood