将单元格从一个 Sheet 复制到另一个的最有效方法是什么
What is the most effective way to copy cells from one Sheet to another
我正在处理报告中的报告。这意味着;我有一个主报告 (sheet 'Rm')
,它将保存其余子报告 (sheet 'Rs_1'....'Rs_n')
.
的结果值
Rm
将仅写入每个 Rs_i
的 2 列,并将按顺序粘贴到找到的每个子报告 (Rs) 的右侧。
由于有超过 100,000 个单元格和更多的 100 个子报告需要复制和粘贴,我想尽可能优化时间安排。
所以我的问题是。 vba 将列 Worksheets(Rs_1).(Range("B14:B500;F14:F500")
从 worksheets(Rs_1).Range("A14:F500")
复制到主报告中的两 (2) 列的最优化方法是什么:Worksheets(Rm).Range("E15:F501")
For Each i_Rs In ActiveWorkbook.Worksheets
If i_Rs.Name = mainReportName Then
'do Nothing on Main Report
Else
'-->take report's Order Nr and Part Nr
i_Rs_Nr = GetNumeric(i_Rs.Range(Rs_NrPosRng).Value)
i_Rs_PartNr = GetNumeric(i_Rs.Range(Rs_ParNrPosRng).Value)
'-->get Rs big Range
Set i_Rs_BigRng = FindStringRng("A:H", "Characteristic", i_Rs.Name)
Set i_Rs_BigRng = Range(i_Rs_BigRng, i_Rs_BigRng.End(xlToRight).End(xlDown))
'-->set the actual range of MainReport to paste value from
For j_Rm = 1 To Rm_BigRng.row Step 2 ' loop on every two columns
Set j_RmRng = Range(Rm_BigRng(1, 1), Rm_BigRng(qtyCharacsRows, 2))
'************************************************
'*** HERE logic to take the sub from each report and copy-paste values
'************************************************
Set j_RmPartNrRng = Range(Rm_BigRng(1, 1), Rm_BigRng(1, 1))
Set j_RmPartNrRng = Cells(j_RmRng.row - 2, j_RmRng.Column + 1)
'-->write part number into j_Rm
j_RmPartNrRng.Value = i_Rs_PartNr
'**** get sub range for each Rs
Set i_Rs_BigRng = Range(i_Rs_BigRng(2, 1), i_Rs_BigRng(qtyCharacsRows + 1, i_Rs_BigRng.Columns.count)) ' Need optimization to erase first row
Set i_Rs_subRng = Union(i_Rs_BigRng.Columns(2), i_Rs_BigRng.Columns(6)) ' need columns in letters
'*** Copy Rs("B:B,F:F").values into Rm("E:F").values
j_RmRng.Value = i_Rs_subRng.Value 'Error: the first column is copying good the second is just a copy of the first
Next j_Rm
End If
Next
如果您不需要单元格格式,那么最快的方法是完全避免 Range.Copy
并直接使用数组传递值。
当范围包含多个单元格时,Range.Value returns 一组变量值,您可以通过设置不同的 Range.Value = 数组将其放回工作表中。在这种情况下,由于您实际上不需要操作或处理这些值,因此您可以跳过数组并直接执行 Range1.Value = Range2.Value
,它会传输所有值 只要范围大小相同.
据我所知,最快的数据传输方式是 Range1.Value = Range2.Value
。
对于您的代码:
Worksheets(Rm).Range("E15:F501").Value = Worksheets(Rs_1).Range("B14:B500,F14:F500").Value
我正在处理报告中的报告。这意味着;我有一个主报告 (sheet 'Rm')
,它将保存其余子报告 (sheet 'Rs_1'....'Rs_n')
.
Rm
将仅写入每个 Rs_i
的 2 列,并将按顺序粘贴到找到的每个子报告 (Rs) 的右侧。
由于有超过 100,000 个单元格和更多的 100 个子报告需要复制和粘贴,我想尽可能优化时间安排。
所以我的问题是。 vba 将列 Worksheets(Rs_1).(Range("B14:B500;F14:F500")
从 worksheets(Rs_1).Range("A14:F500")
复制到主报告中的两 (2) 列的最优化方法是什么:Worksheets(Rm).Range("E15:F501")
For Each i_Rs In ActiveWorkbook.Worksheets
If i_Rs.Name = mainReportName Then
'do Nothing on Main Report
Else
'-->take report's Order Nr and Part Nr
i_Rs_Nr = GetNumeric(i_Rs.Range(Rs_NrPosRng).Value)
i_Rs_PartNr = GetNumeric(i_Rs.Range(Rs_ParNrPosRng).Value)
'-->get Rs big Range
Set i_Rs_BigRng = FindStringRng("A:H", "Characteristic", i_Rs.Name)
Set i_Rs_BigRng = Range(i_Rs_BigRng, i_Rs_BigRng.End(xlToRight).End(xlDown))
'-->set the actual range of MainReport to paste value from
For j_Rm = 1 To Rm_BigRng.row Step 2 ' loop on every two columns
Set j_RmRng = Range(Rm_BigRng(1, 1), Rm_BigRng(qtyCharacsRows, 2))
'************************************************
'*** HERE logic to take the sub from each report and copy-paste values
'************************************************
Set j_RmPartNrRng = Range(Rm_BigRng(1, 1), Rm_BigRng(1, 1))
Set j_RmPartNrRng = Cells(j_RmRng.row - 2, j_RmRng.Column + 1)
'-->write part number into j_Rm
j_RmPartNrRng.Value = i_Rs_PartNr
'**** get sub range for each Rs
Set i_Rs_BigRng = Range(i_Rs_BigRng(2, 1), i_Rs_BigRng(qtyCharacsRows + 1, i_Rs_BigRng.Columns.count)) ' Need optimization to erase first row
Set i_Rs_subRng = Union(i_Rs_BigRng.Columns(2), i_Rs_BigRng.Columns(6)) ' need columns in letters
'*** Copy Rs("B:B,F:F").values into Rm("E:F").values
j_RmRng.Value = i_Rs_subRng.Value 'Error: the first column is copying good the second is just a copy of the first
Next j_Rm
End If
Next
如果您不需要单元格格式,那么最快的方法是完全避免 Range.Copy
并直接使用数组传递值。
当范围包含多个单元格时,Range.Value returns 一组变量值,您可以通过设置不同的 Range.Value = 数组将其放回工作表中。在这种情况下,由于您实际上不需要操作或处理这些值,因此您可以跳过数组并直接执行 Range1.Value = Range2.Value
,它会传输所有值 只要范围大小相同.
据我所知,最快的数据传输方式是 Range1.Value = Range2.Value
。
对于您的代码:
Worksheets(Rm).Range("E15:F501").Value = Worksheets(Rs_1).Range("B14:B500,F14:F500").Value