Сравнение списков имен в Excel, учет повторяющихся фамилий

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

Мысли?

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


person toothsome    schedule 24.03.2010    source источник


Ответы (3)


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

person Joshua Smith    schedule 24.03.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

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

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

person AJ.    schedule 24.03.2010

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

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

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

person toothsome    schedule 20.05.2010