Excel: сравнить два столбца (списки имен), объединить в третьем столбце - PullRequest
0 голосов
/ 31 марта 2011

Я хочу сравнить два столбца, которые содержат списки имен.Большинство имен в первом столбце также находятся во втором столбце.Я хочу создать третий столбец, который объединяет оба столбца и удаляет повторяющиеся имена.

Ответы [ 4 ]

0 голосов
/ 01 апреля 2011

Может достигнуть такого рода вещей с меньшим количеством кода, используя Коллекции. Следующая процедура litte соберет все уникальные значения из любого диапазона (например, ваши первые два столбца):

Private Function UniqueVals(rgArea As Range) As Collection
    Set UniqueVals = New Collection
    Dim rgCell As Range
    For Each rgCell In rgArea.Cells
        On Error Resume Next: Call UniqueVals.Add(rgCell.Value, CStr(rgCell.Value)): On Error GoTo 0
    Next rgCell
End Function  

Чтобы увидеть его в действии, вот небольшая процедура тестирования, которая работает с любыми ячейками, выбранными в данный момент на активном листе, и debug.prints результаты в окне immed (Ctrl-G):

Public Sub Test()
    Dim vItem As Variant
    For Each vItem In UniqueVals(Selection)
        Debug.Print vItem
    Next vItem
End Sub
0 голосов
/ 31 марта 2011

Если вы хотите избежать использования макросов, и ваш лист не содержит слишком много строк, вы можете просто скопировать значения из столбца A и вставить их в столбец C, затем скопировать значения из столбца B и вставить ихв конце столбца C. Затем вам просто нужно выбрать столбец C и использовать инструмент «Удалить дубликаты» (находится в меню «Данные»).

Примечание. Если столбцы A или B содержат формулы, выхотите вставить значения только с помощью PasteSpecial.

0 голосов
/ 31 марта 2011

Я предлагаю сканировать каждый столбец отдельно (возможно, у вас есть дубликаты в одном столбце) и добавить к 3-му столбцу, если он уникален.Возможно, это более модульно, чем вам нужно, но вы можете повторно использовать отдельные подпрограммы / функции

Предположение: в столбцах нет пустых ячеек

Sub Merge()
Dim S1 As Range, S2 As Range, T As Range

    Set S1 = ActiveSheet.[A1]   ' 1st cell of 1st Source column
    Set S2 = ActiveSheet.[B1]   ' 1st cell of 2nd Source column
    Set T = ActiveSheet.[C1]    ' 1st cell of Target range

    ScanCol S1, T
    ScanCol S2, T

End Sub

Sub ScanCol(S As Range, T As Range)
Dim Idx As Long, Jdx As Long

    Idx = 1
    Do While S(Idx, 1) <> ""
        Jdx = GetKey(S(Idx, 1), T)
        If Jdx <> 0 Then
            T(Jdx, 1) = S(Idx, 1)
        End If
        Idx = Idx + 1
    Loop
End Sub

Function GetKey(S As String, T As Range) As Long
Dim Idx As Long, IsFound As Boolean

    GetKey = 0
    IsFound = False
    Idx = 1

    Do While T(Idx, 1) <> ""
        If T(Idx, 1) = S Then
            IsFound = True
            Exit Do
        End If
        Idx = Idx + 1
    Loop

    If Not IsFound Then
        GetKey = Idx            ' return number of first blank line
    End If

End Function

Результат

A   A   A
B   C   B
C   E   C
A   F   E
E   G   F
    H   G
        H
0 голосов
/ 31 марта 2011

Это будет работать. Определите ваши диапазоны по мере необходимости.

Sub combineNames()
    Dim varCol1, varCol2, varCol3
    Dim numDuplicates As Long
    Dim i1 As Integer
    Dim i2 As Integer
    Dim booIsDuplicate As Boolean

    ' Get names from sheet, put in Variant array
    varCol1 = Range("E1:E6")
    varCol2 = Range("F1:F6")

    ReDim varCol3(1 To UBound(varCol1, 1) + UBound(varCol2, 1), 1 To 1)

    ' Insert all names from 1st column
    For i1 = 1 To UBound(varCol1, 1)
        varCol3(i1, 1) = varCol1(i1, 1)
    Next i1

    ' Insert names from 2nd column if not duplicate
    numDuplicates = 0
    For i2 = 1 To UBound(varCol2, 1)
        booIsDuplicate = False
        ' Check if already in 3rd column
        For i1 = 1 To UBound(varCol1, 1)
            If varCol2(i2, 1) = varCol3(i1, 1) Then
                ' It's a duplicate.
                booIsDuplicate = True
                numDuplicates = numDuplicates + 1
                Exit For
            End If
        Next i1
        If booIsDuplicate = False Then
            ' It's not a duplicate; add it to the list.
            varCol3(i2 + UBound(varCol1, 1) - numDuplicates, 1) _
                = varCol2(i2, 1)
        End If
    Next i2

    ' Put combined name list back in sheet.
    Range("G1").Resize( _
        UBound(varCol1, 1) + UBound(varCol2, 1) - numDuplicates, 1) = varCol3

End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...