2015-10-16 145 views
1

我目前有一个VB宏,可以将值从一个表单复制到另一个表单。但是,目前VB的编写方式是逐行执行,而且运行速度很慢,因为它经历了几千行。我想知道如何才能最好地改变我的VB做一个批量复制粘贴,以减少等待时间。代码是:将复制粘贴的VBA宏从逐行更改为批复制粘贴

Sub copypaste_settlement_rows() 

Dim LastRow As Long 

Application.ScreenUpdating = False 

Sheets("Settlement Template").Select 
'find last row in column A 
LastRow = Cells(Rows.Count, "A").End(xlUp).Row 

For x = 2 To LastRow 
    Cells(x, 1).Resize(1, 42).Copy 
    Sheets("PIVOT DATA").Select 
    NextRow = Cells(Rows.Count, 1).End(xlUp).Row + 1 
    Cells(NextRow, 1).Select 
    Selection.PasteSpecial Paste:=xlPasteValues 
    Sheets("Settlement Template").Select 
Next x 

Sheets(">> START HERE <<").Select 

Application.CutCopyMode = False 

Application.ScreenUpdating = True 

End Sub 
+0

您是否想要批量选择表格中的行? –

回答

6

这应该是瞬时的,它不使用剪贴板:

Sub copypaste_settlement_rows() 
    Dim v 
    With Sheets("Settlement Template") 
     v = .Cells(2, 1).Resize(.Cells(.Rows.Count, "A").End(xlUp).Row, 42) 
    End With 
    With Sheets("PIVOT DATA") 
     .Cells(.Rows.Count, "A").End(xlUp).Resize(UBound(v), UBound(v, 2)) = v 
    End With 
End Sub 
+0

@Ian Schneider为您做了这项工作? –

+0

对于迟到的回复感到抱歉,我今天才开始测试。尽管它确实能够立即运行,但我遇到了一些问题 - 即大约40%的时间会导致运行时错误7内存不足。它似乎也跳过了它从“结算模板”表中“复制”的最后一行。我会多花一点时间,但是如果我能够抓住所有东西并且不再发生错误,这绝对是我正在寻找的东西! –

1

一个非常简单的方法(和我在我自己的代码中看到最快的)是:

ThisWorkbook.Worksheets("PIVOT DATA").Range("A2:A" & lastRow) = ThisWorkbook.Worksheets("Settlement Template").Range("A2:A" & lastRow).Value 
+0

今天我会测试这个,并与上面的答案进行比较,谢谢! –