VBA - Добавление уникальных значений в существующий массив - PullRequest
0 голосов
/ 21 ноября 2018

Предположим, у меня есть два отдельных столбца / массива.

В столбце A есть 100 строк, каждая из которых содержит строку длиной 20

A (1) = daskjdkjasdj

A (2) = asdsadgggggg

A (3) = dsadpoeeeeee

Столбец B представляет собой столбец с 200 строками, некоторые из строк имеют те же значения, что и упомянутые выше, я хотел бы добавить уникальный,Я хочу добавить новый идентификатор, только если он не является частью столбца А. (Я забыл упомянуть, что для каждой строки с идентификатором есть 20 других столбцов с данными, которые также должны быть добавлены. Мои извинения)

sample data

Я хочу добавить к данным A строки из данных B, где идентификатор отсутствует в данных A. В результате я получу

new data a

Я делалэто просто:

for i = 1 to lastrow_column_b
    g=0
    for j=1 to ubound(column_a)
        if column_a(j)=cells(i) then g=1
        goto skip
    next
    skip:
    if g = 0 then "do something, add to column_a"
next

Но я считаю, что есть более эффективный способ сделать это

1 Ответ

0 голосов
/ 21 ноября 2018

Код ниже должен поставить вас на правильный путь.Первый цикл добавляет все записи из столбцов A в массив.Второй цикл добавляет только новые записи из столбца C. Выходные данные вставляются в столбец E. Вы должны иметь возможность изменять ссылки в соответствии со своими потребностями.Надеюсь, что это поможет вам в вашей задаче.

Sub UpdateColumn()
    Dim objDict As Object
    Dim key As Variant,


    ' Create new collection
    Set objDict = CreateObject("System.Collections.ArrayList")

    With ThisWorkbook.ActiveSheet
        With .Range("A2", .Range("A" & .Rows.Count).End(xlUp))
            ' Read data of column A into array
            ' Does not check for duplicates
            For Each key In .Value
                objDict.Add key
            Next
        End With

        With .Range("C2", .Range("C" & .Rows.Count).End(xlUp))
            ' Read data of column B into array, add new entries only
            For Each key In .Value
                If Not objDict.Contains(key) Then objDict.Add key
            Next
        End With

        .Range("E2").Resize(objDict.Count) = Application.Transpose(objDict.toarray())

    End With

End Sub
...