【问题标题】:What is the most effective way to copy cells from one Sheet to another将单元格从一张表复制到另一张表的最有效方法是什么
【发布时间】:2021-07-23 23:23:54
【问题描述】:

我正在编写报告报告。这意味着;我有一个主报告 (sheet 'Rm'),它将保存来自其余子报告 (sheet 'Rs_1'....'Rs_n') 的结果值。

Rm 将只写入每个Rs_i 中的 2 列,并将按顺序粘贴到找到的每个子报告的右侧。

由于有超过 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

【问题讨论】:

  • 你能发布你现有的代码吗?
  • 我正在编码其余的逻辑,准备数据,设置主要范围等。代码不需要从每个子报告中循环(我会这样做)。只是按照我的建议从一张纸复制到主要范围。非常感谢您的时间......当我开发其余部分时,我会发布它
  • 我已经发布了代码..你可以重新打开吗?

标签: excel vba copy range


【解决方案1】:

如果您不需要单元格格式,那么最快的方法是完全避免Range.Copy,而直接使用数组传递值。

当 Range 包含多个单元格时,Range.Value 会返回一组变量值,您可以通过设置不同的 Range.Value = Array 将其放回工作表中。在这种情况下,由于您实际上不需要操作或处理值,因此您可以跳过数组并直接执行Range1.Value = Range2.Value,它会传输所有值只要范围大小相同

据我所知,传输数据最快的方法是Range1.Value = Range2.Value

对于您的代码:

Worksheets(Rm).Range("E15:F501").Value = Worksheets(Rs_1).Range("B14:B500,F14:F500").Value

【讨论】:

  • 嗨 Toddleson 我会尝试这可能就是我需要的。只有一个问题,我是否得到 Rm 范围的子范围。我需要 Worksheets(Rm).Range("E15:F501") 中的 Rm.Range(501R x 2C) 平均只有两列
  • 我不确定您所说的子范围是什么意思。 Worksheets(Rm).Range("E15:F501") 是一个包含 487 行和 2 列的范围。如果要引用特定行,可以使用 .Rows(x) 其中 x 是行号。它从范围的第一个单元格开始计数,因此 x=1 将为您提供 Range("E15:F15")。你可以写成Worksheets(Rm).Range("E15:F501").Rows(1)。你问的是这个吗?
  • 我想要这样的东西。设置 i_Rs_subRng = Union(i_Rs_BigRng("B:B"), i_Rs_BigRng("F:F"))。在munites ill尝试发布代码。
  • 当您在定义的范围内使用命名列时,您应该知道“B:B”将不是工作表上的“B:B”,而是该范围的第二列。因此,如果您的范围是“B:F”,那么 MyRange.Range("B:B") 将返回第二列,即“C:C”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-31
  • 1970-01-01
  • 2018-06-24
  • 1970-01-01
  • 2017-01-21
  • 1970-01-01
相关资源
最近更新 更多