Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 如何找到非';不是100%重复吗?_Excel_Vba_Duplicates - Fatal编程技术网

Excel 如何找到非';不是100%重复吗?

Excel 如何找到非';不是100%重复吗?,excel,vba,duplicates,Excel,Vba,Duplicates,我有一份从我的组织获得援助的人的名单 有些人用不同的拼写或顺序登记自己的名字 这里有一个例子 **Names** **ID** Ahmed mohammed Saleh 3576158946 Personal ID Waleed Khalid Ali 5478698645 Personal ID Fatima Nader Aljalal 46

我有一份从我的组织获得援助的人的名单

有些人用不同的拼写或顺序登记自己的名字

这里有一个例子

**Names**                       **ID**
Ahmed mohammed Saleh            3576158946          Personal ID  
Waleed Khalid Ali               5478698645          Personal ID
Fatima Nader Aljalal            4684325986          Personal ID
Hussan Huessien Ahmed           778569              Family ID
*Ahmed Mohamed Salah*           698745              Family ID
*Waleed Ali Khalid*             No ID
名单上的最后两名登记了两次


我的数据有4000行,我必须找到部分重复项。

减少任务难度的一种方法是将名称散列为一个排序的小写字符字符串,删除重复字符、空格和元音。然后可以比较散列名称以确定相似性。在下面的示例中,我们很幸运,我们得到了精确的匹配,但编写进一步的函数来检查哈希名称是否有一个、两个或多个字符的差异,并且事实上原始名称是合理的匹配

Option Explicit

Private Type State

    CharArray As Variant

End Type

Private s As State


Public Sub test()

    Initialise
    Debug.Print "Ahmed mohammed Saleh", ConvertNameToHash("Ahmed mohammed Saleh")
    Debug.Print "Ahmed Mohamed Salah", ConvertNameToHash("Ahmed Mohamed Salah")
    Debug.Print "Waleed Khalid Ali", ConvertNameToHash("Waleed Khalid Ali")
    Debug.Print "Waleed Ali Khalid", ConvertNameToHash("Waleed Ali Khalid")
End Sub

Public Sub Initialise()

    s.CharArray = Split("b,c,d,f,g,h,j,k,l,m,n,p,q,r,s,t,v,w,x,y,z", ",")

End Sub

Public Function ConvertNameToHash(ByVal ipName As String) As String

    Dim myChars As String
    Dim myName As String 

    myName = LCase$(ipName)
    Dim myChar As Variant
    For Each myChar In s.CharArray

        If InStr(myName, myChar) > 0 Then

            myChars = myChars & myChar

        End If

    Next

    ConvertNameToHash = myChars

End Function
上述代码的输出为

Ahmed mohammed Saleh        dhlms
Ahmed Mohamed Salah         dhlms
Waleed Khalid Ali           dhklw
Waleed Ali Khalid           dhklw

减少任务难度的一种方法是将名称散列为排序的小写字符字符串,并删除重复字符、空格和元音。然后可以比较散列名称以确定相似性。在下面的示例中,我们很幸运,我们得到了精确的匹配,但编写进一步的函数来检查哈希名称是否有一个、两个或多个字符的差异,并且事实上原始名称是合理的匹配

Option Explicit

Private Type State

    CharArray As Variant

End Type

Private s As State


Public Sub test()

    Initialise
    Debug.Print "Ahmed mohammed Saleh", ConvertNameToHash("Ahmed mohammed Saleh")
    Debug.Print "Ahmed Mohamed Salah", ConvertNameToHash("Ahmed Mohamed Salah")
    Debug.Print "Waleed Khalid Ali", ConvertNameToHash("Waleed Khalid Ali")
    Debug.Print "Waleed Ali Khalid", ConvertNameToHash("Waleed Ali Khalid")
End Sub

Public Sub Initialise()

    s.CharArray = Split("b,c,d,f,g,h,j,k,l,m,n,p,q,r,s,t,v,w,x,y,z", ",")

End Sub

Public Function ConvertNameToHash(ByVal ipName As String) As String

    Dim myChars As String
    Dim myName As String 

    myName = LCase$(ipName)
    Dim myChar As Variant
    For Each myChar In s.CharArray

        If InStr(myName, myChar) > 0 Then

            myChars = myChars & myChar

        End If

    Next

    ConvertNameToHash = myChars

End Function
上述代码的输出为

Ahmed mohammed Saleh        dhlms
Ahmed Mohamed Salah         dhlms
Waleed Khalid Ali           dhklw
Waleed Ali Khalid           dhklw

这并不容易,你必须定义拼写检查,你必须定义哪一个拼写错误,哪一个正确。你是否尝试过使用Excel中内置的“查找重复项”选项?它会高亮显示重复项,因此任何未高亮显示的内容都不会是重复项。。。但最终,如果它们的拼写不同,那么它们在定义上就不是重复的。一种是像瓦利德·哈立德·阿里和瓦利德·阿里·哈立德一样并置。对于这些,你需要建立规则,你需要为人类做标记。例如,突出显示“如果第一个相同,第二个和第三个相同”。另一个是拼写。“Mhmd”可以使用Regix识别*穆罕默德或穆罕默德或穆罕默德。这两个系统需要相互并行应用。通过将名称视为字符集合,您可能会取得一些进展。这并不容易,您必须定义拼写检查,必须定义哪个拼写错误,哪个拼写正确。您是否尝试过使用Excel中的内置“查找重复项”选项?它会高亮显示重复项,因此任何未高亮显示的内容都不会是重复项。。。但最终,如果它们的拼写不同,那么它们在定义上就不是重复的。一种是像瓦利德·哈立德·阿里和瓦利德·阿里·哈立德一样并置。对于这些,你需要建立规则,你需要为人类做标记。例如,突出显示“如果第一个相同,第二个和第三个相同”。另一个是拼写。“Mhmd”可以使用Regix识别*穆罕默德或穆罕默德或穆罕默德。这两个系统需要相互并行应用。通过将名称视为字符集合,您可能会取得一些进展。?