复制和粘贴行的不同方式

时间:2017-04-05 09:05:59

标签: excel vba excel-vba

我正在尝试加速VBA程序,该程序基本上将来自几个工作簿的数据行复制到3个主要工作簿中并刷新其中的所有图形。

我已经使用过这个,我主要在我的所有程序中都这样做。

'Speed up
With Excel.Application
    .ScreenUpdating = False
    .DisplayStatusBar = True
    .Calculation = Excel.xlCalculationManual
    .EnableEvents = False
End With

调试我的代码我意识到复制和粘贴部分比其余部分花费更多时间,我正在尝试重新编码并测试,以便我可以达到最快的解决方案。最初它是3个不同的Subs。我发布一个,因为所有其他主要是相同的。

Cellsheet.Range("2:" & f2).Copy DataCell.Range((f + 1) & ":" & (f + f2))
DataCluster.Rows((f3 + 1) & ":" & (f3 + f4 - 1)).Hidden = False
Clustersheet.Range("2:" & f4).Copy DataCluster.Range((f3 + 1) & ":" & (f3 + f4 - 1))

我试图避免使用我知道的剪贴板这将是最慢的解决方案。现在,我尝试像这样的.Value = .Value方法:

DataCell.Range((f + 1) & ":" & (f + f2)).Value = Cellsheet.Range("2:" & f2).Value
DataCluster.Range((f3 + 1) & ":" & (f3 + f4 - 1)).Value = Clustersheet.Range("2:" & f4).Value

在这个例子中,当出现错误时,我试图或多或少地复制2.000行。

问题在于这种方法,程序中或多或少地在执行过程中显示"内存不足错误"我想知道为什么会发生这种情况,如果有比.Copy目的地更快的解决方案。的事情。

1 个答案:

答案 0 :(得分:1)

你的编码是一种恐怖(@Sivaprasath更有礼貌,但我试图更有帮助:-))。看起来像这样。

DataCell.Range(Cells(R, C), Cells(R, C)).Value = Cellsheet.Range(Cells(R, C), Cells(R, C)).Value

这里R代表“行”,C代表“列”。每个都可以是数字或表示数字的变量。像Range("A1:B4")这样的范围会像Range(Cells(1, 1), Cells(4, 2))一样编写,在直接比较中看起来非常省力,但它比Range((f + 1) & ":" & (f + f2))更具可读性,一旦你得到它就很容易操作坚持下去。为了加快您的任务,您必须严格控制范围规范,并且在没有明确语法的情况下将无法实现。

我在回复你的评论时运行了这个测试。

Private Sub CopyAndPaste()

    Dim Rng As Range
    Dim f As Long, f2 As Long
    Dim C As Long

    f = 4
    f2 = 2046
    C = 185

'    Set Rng = Cellsheet.Range(Cells(2, 1), Cells(f2, C))
    Set Rng = ActiveSheet.Range(Cells(2, 1), Cells(f2, C))
    Debug.Print Rng.Address, Rng.Cells.Count

'    Set Rng = DataCell.Range(Cells((f + 1), 1), Cells(f + f2, C))
    Set Rng = ActiveSheet.Range(Cells((f + 1), 1), Cells(f + f2, C))
    Debug.Print Rng.Address, Rng.Cells.Count
End Sub

结果将打印到立即窗口,并显示两个范围中的单元格数不相同。因此,两个范围的大小和尺寸不能相同,因此您应该在过去的操作中出错。我建议你多投入一点时间来控制你的变量。但是,使用Destination复制到它就足以指定单个单元格(左上角),Excel将正确粘贴整个复制范围与指定单元格相关。