我目前有一个完整的代码,用于将一个电子表格的输出复制到另一个电子表格的某些列中。这是一个项目的一部分,在工作中,但VBA代码留给我从辞职的员工,不适用。这在理论上很简单。
我想做的是将BB183中的值从737-10_1b28_routes.csv文件中的标签737-10_1b28_routes中拉出来,粘贴到文件Aero Sales Support Modified at .1 Performance Data Attachment的标签737-10 Scenario 1中,并在L30框中填写Form_20220402.xlsx。
然后,我希望代码采用BB184,并将其放在L32中。我需要代码跳过一行,因为我想在另一行粘贴不同的数据(BB697进入L31与BB(+1)和L(+2)相同的重复模式。我想一旦我有了一个更有效的代码,我可以找出最终的解决方案,但需要一些帮助。我现在遇到的程序太大了。
我感觉L列的j=j+2来自j=30:688, BB就像I = I +1来自I =183:512。
那么代码的第二部分是j=j+2,来自j=31:689,对于L列,BB就像i=i+1,来自i=697:1026。
请参阅代码2,看看它是如何改变的。
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
从VBA检查单元格值很慢。从VBA向单元格写入或复制值的速度更慢。在循环中反复做这些事情会很快破坏VBA的执行速度。
在执行速度上要快数百到数千倍,以便一次抓取大范围并将值分配给VBA数组,然后直接在VBA数组上进行处理,而在处理过程中不触及任何单元格,然后完成后,将整个数组一次性写入工作表。涉及的范围越大,通过处理VBA数组而不是直接处理单元,执行速度的提高就越大。
数组处理在VBA中非常快。从VBA访问工作表单元格非常慢。将一个值写入一个单元格所花费的时间与将数万个值写入VBA数组的范围所花费的时间大致相同。永远不要在循环中编写单个单元格值!
使用.Offset
也很慢,重复这样做是不明智的。使用数组方法可以完全避免这个问题。
如果我充分理解了您的范围描述,下面的例程应该可以达到目的。vSrc
和vDst
为二维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
考虑到我对你想要的有多确定,请确保你的文件在尝试这个之前是备份的:
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