Существует ли более быстрый способ копирования и вставки динамических диапазонов в VBA? - PullRequest
0 голосов
/ 18 февраля 2019

Я пытаюсь объединить ежедневный отчет с одним основным документом.Раньше я использовал функции Excel для этого.Но размер файла стал огромным.Так что в конце концов я подумал, что я могу использовать VBA, чтобы исключить огромное количество функций на листах, а также уменьшить размер файла и время вычислений.

В основном у меня есть номера основных строк в качестве базы данных на Листе 1 (основной документ).С Листа 2 мне нужно брать ежедневные объемы работ, выполненных для номеров строк, указанных на Листе 1.

Например, в Листе 1 ячейка «M3» представляет номер первой строки (Строка-01).В ячейке "X3" будет количество работы (10 соединений), которое поступает из диапазона листа 2 "O: O".Это будет повторяться в случайное время в зависимости от ежедневной производительности.Таким образом, у меня были бы данные от диапазона "O3" до "O1000" (даже больше).

Sub DailyProgress()
    Dim i As Long

    Sheets(1).Activate

    Range("X3:X" & Range("M" & Rows.Count).End(xlUp).row).Formula = _
    "=IFERROR(vlookup(M3,Sheet2!D:O,12,0),Text(,))"

    i = 3
    'Because my first cell is on row 3
    Do Until IsEmpty(Cells(i, 12))        
        Cells(i, 24).Copy
        Cells(i, 24).PasteSpecial xlPasteValues

        i = i + 1
    Loop
End Sub

Я написал код для создания vlookup, копирования и вставки в качестве значения.Но этот блок недостаточно гладкий.Кстати, мне нужно скопировать данные в ячейки "Y3" и "Z3" из Sheet2.Так что в следующий раз это займет гораздо больше времени.

1 Ответ

0 голосов
/ 18 февраля 2019

Обратите внимание, что вместо копирования / вставки вы можете просто использовать Cells(i, 24).Value = Cells(i, 24).Value, что должно быть быстрее.Также, если вы не сделаете это для каждой ячейки, но для полного диапазона сразу, это будет намного быстрее: Range("X3", "X" & LastRow).Value = Range("X3", "X" & LastRow).Value

Поскольку вы уже определили LastRow для написания формулы, вы можете простоиспользуйте то же самое, чтобы преобразовать его в значение (без цикла).

Sub DailyProgress()
    With Sheets(1).Range("X3:X" & .Range("M" & Rows.Count).End(xlUp).Row)
        .Formula = "=IFERROR(vlookup(M3,Sheet2!D:O,12,0),Text(,))"
        .Value = .Value
    End With
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...