【问题标题】:Speed up copy/pasting across multiple sheets VBA加快跨多个工作表的复制/粘贴 VBA
【发布时间】:2021-05-22 07:09:39
【问题描述】:

我已经设法编写了运行但速度很慢的代码(大约需要 2 分钟 atm 并且块大小很快会增加 52)。我想知道是否有更好的方法来实现这一小段代码。代码同时选择 10 张,以便复制和粘贴将影响所有 10 张。如您所见,我可以开始工作的唯一复制和粘贴是绝对最差的版本,因为我尝试的所有其他选项都只将范围粘贴到一张纸上,而不是全部 10 个。很想知道是否有可能做得更好。我必须激活第一张纸并执行完整的 range.copy、range.select、activesheet.paste! varray 包含 10 个工作表名称,MaxRngLive 是 20,RngLiveRange 是包含实时公式的 156 列的一维数组,RngPasteRange 是一个 156x156 块,这些公式将被粘贴到其中。稍后在代码中,我将除第一行之外的每个块中的所有单元格赋值(再次使用 range.pastespecial xlpastevalues!),从而将文件大小总体减少约 75%。

Sheets(varray).Select

Sheets("c_DAZN.com_GF").Activate

Set ws2 = wb.Worksheets(varray(0))


For j = 1 To MaxRngLive
      
    Application.StatusBar = ws2.Name & " " & j
      
    Set RngLiveRange = ws2.Range(Range(RngLiveName).Rows(j))
    Set RngPasteRange = ws2.Range(Range(RngPasteName).Rows(j))
    RngLiveRange.Copy
    RngPasteRange.Select
    ActiveSheet.Paste
    
Next j

非常感谢大家!

【问题讨论】:

  • 你不能只复制和粘贴整个范围而不是逐行进行吗?
  • 它确实一次粘贴了所有内容,但粘贴目标块为 156 x 156 并由几行分隔,因此这就是循环所做的 - 遍历所有 20 个块。 RngPasteRange 是一个 156x156 二维数组,例如 af70、af300、af700、af1000 等。我可能需要上传更多代码,以便更容易理解问题。

标签: excel vba


【解决方案1】:

这应该做你想做的事。我假设您的目标工作表列表是一个字符串

Function copyRange(sourceRange As Variant, destRange As String, wks as String)
    arr = Split(wks, ",")
    For Each i In arr
        Worksheets(i).Range(destRange) = sourceRange.Formula
    Next i
End Function

Sub test()
wk = "Sheet1,Sheet2,Sheet3" 'Comma separated list of destination sheets
'Tested by selecting the range to be copied, you can define your source range however you want
Call copyRange(Selection, Selection.Address, wk)
End Sub

【讨论】:

  • 另外,在我的测试中,目标范围与源范围相同,但您可以输入所需的任何目标范围
  • 这将非常有用,但我不能使用“.Formula”方法,因为它会在我的偏移和索引公式中放入大量“@”,然后它们就停止工作了。我最初确实使用 range =range.formula 一次循环一张纸来编写它,但它比我当前的版本慢得多,这得益于总共只有 20 个循环而不是 200 个(20 x 10 张)。我真的只是想知道是否有可能有一个像 range =range.value 这样的复制/粘贴方法,它可以同时应用于多张纸,用于每张纸的相同范围。我认为那将是最快的选择
  • 假设源工作表中的公式引用同一工作表中的位置,您是否希望目标公式引用这些相同位置或每个目标工作表上的相应位置?例如,如果我的源中有一个引用 A1 的公式,我是否希望每个目标公式在各自的工作表上引用 A1?
  • 我想我明白你的意思,答案是肯定的,有点。复制范围将是例如 af1:ge1,然后目标范围将是 af1:ge156。源范围始终为 1 行 x 156 列,目标范围始终为 156 x 156,目标的第一行与源范围相同。
  • 您可以在转储到工作表之前使用中间数组将源重构为目标格式。这应该解决开销。关于使用.formula时的“@”我不明白?公式将存储在数组 CFR 中。您在源中拥有什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-25
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-27
相关资源
最近更新 更多