利用Excel收集数据时,如果事先没有对数据录入作出统一的规范性限制,就可能会收集到一些不统一的数据。
以上图中C列的学校名称为例,既有简称,也有全称,而且各种简称的信息也不完全一致,面对这样的表格,如果数据量很大,要在其基础上进行数据查询、数据分析之类的工作,名称不统一的问题是一个较大的麻烦。
很多时候,可能需要通过公式或其他方法求两个名称的相似度,通过相似度的高低来判断两个名称指的是否为同一个事件。
Excel中没有现成的函数可以求两个文本的相似度,我们可以使用VBA来写一个自定义函数帮助解决类似的问题:
Function TextSame(ByVal Str1 As String, ByVal Str2 As String) As Double '----------------------------------------------------------------- '说明: '1.函数返回的结果为一个0到1之间的小数,代表参数两个数据的想似度 '2.函数有两个参数,代表用来对比的两个数据 'QQ:4597716(微信同号),公众号:Excel笔记 '----------------------------------------------------------------- Application.Volatile True Dim LenStr1 As Long, LenStr2 As Long, n As Long LenStr1 = Len(Str1) LenStr2 = Len(Str2) n = 0 If LenStr1 >= LenStr2 Then For i = 1 To LenStr2 If (InStr(1, Str1, Mid(Str2, i, 1))) > 0 Then n = n + 1 End If Next TextSame = n / LenStr1 Else For i = 1 To LenStr1 If (InStr(1, Str2, Mid(Str1, i, 1))) > 0 Then n = n + 1 End If Next TextSame = n / LenStr2 End IfEnd Function
在Excel的VBE编辑器中新建一个模板,将以上代码复制、粘贴到模块中。
再回到Excel中,就能像使用普通函数一样使用自定义函数求两个文本的相似度了。
求得文本的相似度之后,根据自定义的标准,再借助其他函数,就能判断两个文本是否同一个内容,进行进行内容的修正了。
'-----------------------------------------------------------------
'说明:
'1.函数返回的结果为一个0到1之间的小数,代表参数两个数据的想似度
'2.函数有两个参数,代表用来对比的两个数据
'-----------------------------------------------------------------
Application.Volatile True
Dim LenStr1 As Long, LenStr2 As Long, n As Long
LenStr1 = Len(Str1)
LenStr2 = Len(Str2)
n = 0
If LenStr1 ˃= LenStr2 Then
For i = 1 To LenStr2
If (InStr(1, Str1, Mid(Str2, i, 1))) ˃ 0 Then
n = n + 1
End If
Next
TextSame = n / LenStr1
Else
For i = 1 To LenStr1
If (InStr(1, Str2, Mid(Str1, i, 1))) ˃ 0 Then
n = n + 1
End If
Next
TextSame = n / LenStr2
End If
End Function