как сделать vlookup для динамической таблицы и автозаполнения без использования цикла - PullRequest
0 голосов
/ 22 мая 2019

У меня есть 2 таблицы в разных таблицах, и я должен сделать vlookup, чтобы получить данные из обеих этих динамических таблиц. Я сделал это с помощью цикла for, но подавать на большие данные, Excel терпит крах. Есть ли другой способ сделать это?

Столбцы в массиве поиска будут постоянными. Но ряды будут продолжать меняться.

Sheets("HRG").Activate

lastrow = ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count - 1
lastcolumn = ActiveSheet.UsedRange.Column + 
ActiveSheet.UsedRange.Columns.Count - 1
Set VLRange = ActiveSheet.Range(Cells(2, 1), Cells(lastrow, lastcolumn))

Sheets("HRA").Activate

With ActiveSheet
    lastrowHRA = .Range("A" & .Rows.Count).End(xlUp).Row
End With

For i = 2 To lastrowHRA
    ActiveSheet.Cells(i, lastColHRA + 1) = Application.VLookup(ActiveSheet.Cells(i, 1), VLRange, 11, False)
    ActiveSheet.Cells(i, lastColHRA + 2) = Application.VLookup(ActiveSheet.Cells(i, 1), VLRange, 53, False)
Next i

1 Ответ

0 голосов
/ 22 мая 2019

Для всех намерений и целей VLOOKUP просто ищет значение в одном столбце и возвращает значение в другом столбце для этой строки.

Option Explicit

Sub HRG2HRa()

    Dim i As Long, j As Long, m As Variant
    Dim hrgA As Variant, hrgK As Variant, hrgBA As Variant
    Dim hraA As Variant, hra2C As Variant

    With Worksheets("HRG")

        i = .Cells(.Rows.Count, "A").End(xlUp).Row

        hrgA = .Range(.Cells(2, "A"), .Cells(i, "A")).Value2
        hrgK = .Range(.Cells(2, "K"), .Cells(i, "K")).Value2
        hrgBA = .Range(.Cells(2, "BA"), .Cells(i, "BA")).Value2

    End With

    With Worksheets("HRA")

        i = .Cells(.Rows.Count, "A").End(xlUp).Row
        j = .Cells(1, .Columns.Count).End(xlToLeft).Column

        hraA = .Range(.Cells(2, "A"), .Cells(i, "A")).Value2
        ReDim hra2C(LBound(hraA, 1) To UBound(hraA, 1), 1 To 2)

        For i = LBound(hraA, 1) To UBound(hraA, 1)

            m = Application.Match(hraA(i, 1), hrgA, 0)

            If Not IsError(m) Then

                hra2C(i, 1) = hrgK(m, 1)
                hra2C(i, 2) = hrgBA(m, 1)

            End If

        Next i

        .Cells(2, j + 1).Resize(UBound(hra2C, 1), UBound(hra2C, 2)) = hra2C

    End With

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