Сравнение списков имен в Excel, учет дубликатов фамилий - PullRequest
1 голос
/ 24 марта 2010

У меня есть два списка имен в Excel '07. Два столбца в каждом файле: имя и фамилия. Я хотел бы иметь возможность сказать, какие имена в каждом списке (name = first, last) появляются в другом списке. Ни один из методов, которые я могу придумать, не учитывает более одного столбца за раз - например, я могу видеть, сколько есть «Смитов» или сколько «Альбертов», но я не могу сказать, сколько » Альберт Смит есть.

Мысли

Редактировать: Очевидно, я могу объединить, но я бы хотел, чтобы этот подход можно было распространить на более чем два столбца данных.

Ответы [ 3 ]

0 голосов
/ 25 марта 2010

К сожалению, это довольно распространенная задача в Excel, для которой стандартный ответ, как говорит Джошуа Смит, - создать комбинированный ключ путем объединения доступных столбцов. Если вас беспокоят коллизии (например, прямая конкатенация нескольких столбцов может оставить разные значения с одним и тем же выводом), например, следующее, тогда используйте разделитель (например, символ канала |).


Col A    Col B   Col C  Combined Key
 aaa      bbb     ccc    aaabbbccc
 aa       aa      aaa    aaaaaaa    -- Bad match...
 aaa      a       aaa    aaaaaaa    -- Bad match...

Конечно, вы можете написать собственную функцию макроса, которая сделает это за вас. Логика будет что-то вроде VLOOKUP:

Public Function VMatch(ByVal lookFor As Range, ByVal lookIn As Range) As String
    'Make sure column count matches (at least!)
    If lookFor.Columns.Count  lookIn.Columns.Count Then
        'Oops...
        VMatch = "ERROR: Column counts do not match"
        Exit Function
    End If
    'Start looking through the target range for
    'a match with the source range
    Dim blnFound As Boolean
    Dim blnRowOK As Boolean
    blnFound = False
    Dim iCol As Integer
    Dim iRow As Long
    Dim numCols As Integer
    numCols = lookFor.Columns.Count
    'Loop through all rows
    For iRow = 1 To lookIn.Rows.Count
        'Assume current row might be ok...
        blnRowOK = True
        'Loop through columns
        For iCol = 1 To numCols
            'Test for mis-match only
            If lookFor.Cells(1, iCol).Value  lookIn.Cells(iRow, iCol).Value Then
                blnRowOK = False
                Exit For
            End If
        Next
        'If row is still ok, we've found a match!
        If blnRowOK Then
            blnFound = True
            Exit For
        End If
    Next
    'If blnFound is true, we found a match
    If blnFound Then
        VMatch = "Match"
    Else
        VMatch = "No Match"
    End If
End Function

Примечание. Вышеприведенная функция работает и не восприимчива к «ложным срабатываниям» - она ​​также пытается быть менее неэффективной, выпрыгивая при попадании в совпадение, но я не могу гарантировать, что она будет работать во всех случаях. *

Чтобы использовать функцию, вы должны ссылаться на диапазон всех столбцов в данной строке как lookFor и весь диапазон всех возможных совпадающих строк в lookIn, например, =VMatch(A1:C1,Sheet2!A1:C29) если совпадающая вещь находилась в ячейках текущего листа A1:C1, а другой набор данных находился в Sheet2 при переходе от первой строки к строке 29.

0 голосов
/ 20 мая 2010

Обновление: разобрался! Sumproduct делает всю эту работу для меня. Вот формула:

=SUMPRODUCT(($G$8:$G$110=C28)*($F$8:$F$110=D28))

Это предполагает, что эталонные имена хранятся в G, фамилии в F, и что имена, которые я ищу, находятся в C (First) и D (Last) соответственно. Выходное значение равно 1 для совпадения, 0 для отсутствия совпадения. Соответствует только тогда, когда совпадают соседние ячейки.

0 голосов
/ 25 марта 2010

Самый простой способ - создать третий столбец для обоих списков, используя CONCATENATE, а затем выполнить vlookup, используя этот новый столбец.

...