有没有一种更快的方法可以在VBA中复制粘贴动态范围?

时间:2019-02-18 14:50:16

标签: excel vba loops

我正在尝试将每日报告合并到一个主文档中。以前,我使用Excel函数来执行此操作。但是文件大小变得巨大。所以我想,我可能会使用VBA消除工作表上的大量功能,并减少文件大小和计算时间。

基本上,我在Sheet1(主文档)上有主行号作为数据库。从Sheet2中,我需要每天为Sheet1上列出的行号完成工作量。

例如,在Sheet1中,单元格“ M3”代表第一行号(Line-01)。在“ X3”单元格中,将存在来自Sheet2范围“ O:O”的工作量(10个关节)。 这将根据日常效果在随机时间重复。因此,我将获得从“ 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,将其复制并粘贴为值的代码。但是这个方块不够平滑。顺便说一下,我需要将数据从Sheet2复制到单元格“ Y3”和“ Z3”。因此,下一次将需要更多时间。

1 个答案:

答案 0 :(得分:0)

请注意,代替复制/粘贴,您可以使用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