如何重写这个 VBA 宏以提高效率? (复制粘贴范围)

How Can I Re-Write this VBA Macro to be More Efficient? (Copy-Paste Range)

我目前编写了完整的代码,用于将一个电子表格的输出复制到另一个电子表格的某些列中。这是工作项目的一部分,但是 VBA 一位辞职员工留给我的代码并不适用。理论上很简单。

我想要它做的是从文件 737-10_1b28_routes.csv 中的选项卡 737-10_1b28_routes 中提取 BB183 中的值,并将其粘贴到文件 Aero Sales Support Modified Att.1 Performance Data Attachment 的选项卡 737-10 Scenario 1 并填写 Form_20220402.xlsx 框 L30.

然后我希望代码采用 BB184,并将其放在 L32 中。我需要代码来跳过一行,因为我想在另一行中粘贴不同的数据(BB697 进入 L31,BB(+1)和 L(+2)具有相同的重复模式。我想一旦我有更多高效的代码,我可以找出最终的解决方案,但需要一些帮助。我目前 运行 过程太大了。

我觉得 L 列的 j=30:688 是 j=j+2,而 BB 就像是 i=183:512 的 i=i+1。

然后代码的第二部分是 j=j+2 来自 j=31:689 对于 L 列和 BB 就像 i=i+1 来自 i=697:1026。

请看代码二,看看它是如何改变的。

Sub vba_copy_data_GCD() 

Workbooks("737-10_1b28_routes.csv").Worksheets("737-10_1b28_routes").Range("BB183").Copy _
Workbooks("Aero Sales Support Modified Att.1 Performance Data Attachment and Fill in Form_20220402.xlsx").Worksheets("737-10 Scenario 1").Range("L30")

Workbooks("737-10_1b28_routes.csv").Worksheets("737-10_1b28_routes").Range("BB184").Copy _
Workbooks("Aero Sales Support Modified Att.1 Performance Data Attachment and Fill in Form_20220402.xlsx").Worksheets("737-10 Scenario 1").Range("L32")

Workbooks("737-10_1b28_routes.csv").Worksheets("737-10_1b28_routes").Range("BB185").Copy _
Workbooks("Aero Sales Support Modified Att.1 Performance Data Attachment and Fill in Form_20220402.xlsx").Worksheets("737-10 Scenario 1").Range("L34")

Workbooks("737-10_1b28_routes.csv").Worksheets("737-10_1b28_routes").Range("BB186").Copy _
Workbooks("Aero Sales Support Modified Att.1 Performance Data Attachment and Fill in Form_20220402.xlsx").Worksheets("737-10 Scenario 1").Range("L36")

Workbooks("737-10_1b28_routes.csv").Worksheets("737-10_1b28_routes").Range("BB697").Copy _
Workbooks("Aero Sales Support Modified Att.1 Performance Data Attachment and Fill in Form_20220402.xlsx").Worksheets("737-10 Scenario 1").Range("L31")

Workbooks("737-10_1b28_routes.csv").Worksheets("737-10_1b28_routes").Range("BB698").Copy _
Workbooks("Aero Sales Support Modified Att.1 Performance Data Attachment and Fill in Form_20220402.xlsx").Worksheets("737-10 Scenario 1").Range("L33")

Workbooks("737-10_1b28_routes.csv").Worksheets("737-10_1b28_routes").Range("BB699").Copy _Workbooks("Aero Sales Support Modified Att.1 Performance Data Attachment and Fill in Form_20220402.xlsx").Worksheets("737-10 Scenario 1").Range("L35")

End Sub

考虑到我对你想要的东西有多确定,请确保你的文件是 backed-up,然后再尝试:

Sub vba_copy_data_GCD()
    Dim srcWS as Worksheet
    Dim destWS as Worksheet
    Dim i as Long, j as Long

    Set srcWS = Workbooks("737-10_1b28_routes.csv").Worksheets("737-10_1b28_routes")
    Set destWS = Workbooks("Aero Sales Support Modified Att.1 Performance Data Attachment and Fill in Form_20220402.xlsx").Worksheets("737-10 Scenario 1")

    For i = 0 to 329 Step 2
        With destWS
            .Range("L30").Offset(i,0).Value2 = srcWS.Range("BB183").Offset(j,0).Value2
            .Range("L31").Offset(i,0).Value2 = srcWS.Range("BB697").Offset(j,0).Value2
        End With
        j = j + 1
    Next i
End Sub

检查 VBA 中的单元格值很慢。从 VBA 向单元格写入或复制值的速度仍然较慢。在循环中一遍又一遍地做这些事情是破坏 VBA 执行速度的快速方法。

一次性抓取大范围赋值给VBA数组,然后直接在VBA上处理,执行速度快成百上千倍在处理过程中不接触任何单元格的情况下创建数组,然后在完成后,一次性将整个数组写入工作表。涉及的范围越大,通过处理 VBA 数组而不是直接处理单元格来提高执行速度。

数组处理在 VBA 中非常快。从 VBA 起,工作表单元格访问速度极慢。将一个值写入一个单元格所花费的时间与将数万个值写入一个 VBA 数组的范围所花费的时间大致相同。切勿在循环中写入单个单元格值!

使用 .Offset 也很慢,反复这样做是不明智的。使用数组方法完全避免了这个问题。

如果我充分理解您的范围描述,以下例程应该可以解决问题。 vSrcvDst 是二维 VBA 数组。所有值都在数组中处理(而不是在工作表上),然后在完成后将数组值一次性写入目标工作表...

Sub vba_copy_data_GCD()

    Dim c&, i&, vSrc, vDst

    Const SRC_GAP& = 514
    Const SRC_RANGE$ = "bb183:bb1026"
    Const SRC_SHEET$ = "737-10_1b28_routes"
    Const SRC_WORKB$ = "737-10_1b28_routes.csv"
    
    Const DST_RANGE$ = "l30:l688"
    Const DST_SHEET$ = "737-10 Scenario 1"
    Const DST_WORKB$ = "Aero Sales Support Modified Att.1 Performance Data Attachment and Fill in Form_20220402.xlsx"


    vSrc = Workbooks(SRC_WORKB).Worksheets(SRC_SHEET).Range(SRC_RANGE).Value2
    
    With Workbooks(DST_WORKB).Worksheets(DST_SHEET).Range(DST_RANGE)
        vDst = .Value2

        For i = 1 To UBound(vDst) \ 2 Step 2
            c = c + 1
            vDst(i + 0, 1) = vSrc(c, 1)
            vDst(i + 1, 1) = vSrc(c + SRC_GAP, 1)
        Next
    
        .Value2 = vDst
    End With
        
End Sub