【问题标题】:VBA - code optimiziation for copying specific range of columns multiple timesVBA - 多次复制特定范围的列的代码优化
【发布时间】:2020-12-16 11:09:18
【问题描述】:

我有一个 excel 计算,它在 10 列中完成一次迭代(每组 11 列的空间 +1 列)。我的意图是使用 VBA 多次(最好是 350 或更多)复制这 11 列的范围。每次复制/粘贴范围时,计算的迭代都会引用前一组以实现“级联”效果。

我拼凑了一些 VBA 代码来完成这项任务,但处理起来非常慢,而且很难判断计算是否在迭代方案的较大端按预期工作。我添加了一个状态栏来跟踪进​​度,我注意到在 100 次左右的迭代后操作会停止。我目前将计数设置为 100 次迭代,因为这似乎是它挣扎的地方。

在问这个问题之前,我已经在这里寻求帮助并发现了 Application.ScreenUpdating = False 技巧,但这似乎并不能解决问题。

如何优化我目前拥有的东西?有没有更好的方法来做到这一点?

Sub CascadeCopy2()

Dim i As Integer, x As Integer
Dim count As Integer

Application.ScreenUpdating = False

count = 100

For i = 1 To count
    With Sheets("Calc").Range("V3:AF250").Offset(0, x)
        .Copy
        .Offset(0, 11).PasteSpecial
        Application.CutCopyMode = False
        x = x + 11
        
        
    End With
        Application.StatusBar = "Progress: " & i & " of " & count & ":" & Format(i / count, "0%")
    
Next i

Application.StatusBar = False

Application.ScreenUpdating = True
End Sub

【问题讨论】:

  • 既然您知道起点和终点范围的大小,请尝试不使用 Copy 和 Pastespecial,而是直接使用 Sheets("Calc").Range("V3:AF250").Offset(0,x).value = Sheets("Calc").Range("V3:AF250").Offset(0,11).value 复制数据,因为 Copy 使用剪贴板,速度非常慢
  • 如果您的工作簿中有大量数据,在代码开头禁用自动计算可能会显着加快速度。只是不要忘记在最后启用自动计算。
  • @ENIAC 禁用自动计算确实会显着加快速度,但问题会变成用实际值填充复制的单元格。当我重新打开自动计算时,需要永远更新所有以前复制的单元格。

标签: excel vba performance loops optimization


【解决方案1】:

要在工作表中重复复制范围,您需要执行 for 循环。您可以使用equals method,但您必须执行两个操作才能复制公式,请参见下文。

Dim x As Long
x = 1
    For i = 1 To 299 'the number of times you want to copy, change as needed
        With Sheets("Calc").Cells(1, x + 32).Resize(250, 32)
            .Value = Sheets("Calc").Cells(1, x).Resize(250, 32).Value
            .Formula = Sheets("Calc").Cells(1, x).Resize(250, 32).Formula
        End With
        x = x + 32
    Next i

【讨论】:

    【解决方案2】:

    关闭Application.ScreenUpdating 是一个好的开始。

    在循环中复制粘贴大量数据会变得非常缓慢,因为复制粘贴需要使用剪贴板,效率不高。
    尝试使用以下方式直接访问您的范围:

    Sheets("Calc").Range("V3:AF250").Offset(0,x).value = Sheets("Calc").Range("V3:AF250").Offset(0,11).value
    

    您也可以使用相同的原理,使用相同的模板复制格式、颜色或字体大小等。例如:

    Sheets("Calc").Range("V3:AF250").Offset(0,x).Interior.ColorIndex = Sheets("Calc").Range("V3:AF250").Offset(0,11).Interior.ColorIndex
    

    您可以根据自己的需要轻松调整它。

    【讨论】:

    • 我可能用错了,但我正试图绕开语法。 For i = 1 To count Sheets("Calc").Range("V3:AF250").Offset(0, x).Value = Sheets("Calc").Range("V3:AF250").Offset(0, 11).Value Application.CutCopyMode = False x = x + 11 Next i 代码确实运行得更好,但他的工作不如我预期。它不会随着每次迭代移动,而是将值粘贴到 V3:AF250 范围内。复制 V3:AF250 然后将该范围“粘贴”到后续列的语法是什么?也许我用错了偏移量...
    • @localvandal12 将目标范围设置为等于源范围会删除公式。
    • @localvandal12 复制粘贴公式使用相同的想法,但使用 .Formula 而不是 .Value
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-14
    • 1970-01-01
    • 1970-01-01
    • 2018-04-23
    • 1970-01-01
    • 2020-03-14
    相关资源
    最近更新 更多