Нужна помощь в поиске совпадений в двух не похожих списках в Excel - PullRequest
0 голосов
/ 15 января 2019

Мне нужно определить совпадения в двух списках Excel, но имена структурированы по-разному для каждого списка. Я использую Excel прямо сейчас, но я открыт для других программ баз данных, если это необходимо. Я больше всего знаком с Excel, Access и SQL соответственно.

Вот примеры каждого списка.

Список А:

John E Smith
Jim A Brown
ABC Capital LLC
Johnny’s Apples LLC

Список Б:

John Eugene Smith
Jim Brown and Sarah Brown
ABC Capital Co, LLC
JA Enterprises d/b/a Johnny’s Apples LLC

В списке A содержится около 20 000 имен, а в списке B - около 500, и большинство имен не будут совпадать в обоих списках. Есть ли формула, серия формул или сценарий VBA, которые могли бы определить, что все 4 моих примера совпадают? Опять же, я открыт для других программ баз данных, если это необходимо. Цель состоит в том, чтобы повторять этот процесс ежемесячно.

1 Ответ

0 голосов
/ 15 января 2019

Попробуйте функцию Soundex :

enter image description here

Public Function SOUNDEX(Surname As String) As String
' Developed by Richard J. Yanco
' This function follows the Soundex rules given at
' http://home.utah-inter.net/kinsearch/Soundex.html

    Dim Result As String, c As String * 1
    Dim Location As Integer

    Surname = UCase(Surname)

'   First character must be a letter
    If Asc(Left(Surname, 1)) < 65 Or Asc(Left(Surname, 1)) > 90 Then
        SOUNDEX = ""
        Exit Function
    Else
'       St. is converted to Saint
        If Left(Surname, 3) = "ST." Then
            Surname = "SAINT" & Mid(Surname, 4)
        End If

'       Convert to Soundex: letters to their appropriate digit,
'                     A,E,I,O,U,Y ("slash letters") to slashes
'                     H,W, and everything else to zero-length string

        Result = Left(Surname, 1)
        For Location = 2 To Len(Surname)
            Result = Result & Category(Mid(Surname, Location, 1))
        Next Location

'       Remove double letters
        Location = 2
        Do While Location < Len(Result)
            If Mid(Result, Location, 1) = Mid(Result, Location + 1, 1) Then
                Result = Left(Result, Location) & Mid(Result, Location + 2)
            Else
                Location = Location + 1
            End If
        Loop

'       If category of 1st letter equals 2nd character, remove 2nd character
        If Category(Left(Result, 1)) = Mid(Result, 2, 1) Then
            Result = Left(Result, 1) & Mid(Result, 3)
        End If

'       Remove slashes
        For Location = 2 To Len(Result)
            If Mid(Result, Location, 1) = "/" Then
                Result = Left(Result, Location - 1) & Mid(Result, Location + 1)
            End If
        Next

'       Trim or pad with zeroes as necessary
        Select Case Len(Result)
            Case 4
                SOUNDEX = Result
            Case Is < 4
                SOUNDEX = Result & String(4 - Len(Result), "0")
            Case Is > 4
                SOUNDEX = Left(Result, 4)
        End Select
    End If
End Function

Private Function Category(c) As String
'   Returns a Soundex code for a letter
    Select Case True
        Case c Like "[AEIOUY]"
            Category = "/"
        Case c Like "[BPFV]"
            Category = "1"
        Case c Like "[CSKGJQXZ]"
            Category = "2"
        Case c Like "[DT]"
            Category = "3"
        Case c = "L"
            Category = "4"
        Case c Like "[MN]"
            Category = "5"
        Case c = "R"
            Category = "6"
        Case Else 'This includes H and W, spaces, punctuation, etc.
            Category = ""
    End Select
End Function
...