【问题标题】:Slow copy paste in Excel vbaExcel vba中的慢速复制粘贴
【发布时间】:2021-04-22 17:30:34
【问题描述】:

我有下面的代码,发现复制粘贴很慢,内部颜色也很慢。

我正在尝试使用 700,000 行 + 120 列数据处理此代码。

任何提高速度的建议。

目前,我可能需要 20 多分钟才能完成这行代码。

Application.ScreenUpdating = False
Application.DisplayAlerts = False
Application.Calculation = xlCalculationManual
Application.EnableEvents = False
Application.DisplayStatusBar = False

For i = keycolumns + 2 To ILcol + 1
    
    'Result.Cells(1, resultcolumn).EntireColumn.Insert
    rColumnLetter = Split(Cells(1, resultcolumn - 1).Address, "$")(1)
    iColumnLetter = Split(Cells(1, i - 1).Address, "$")(1)
    IL.Range(iColumnLetter & "1:" & iColumnLetter & ILrow).Copy Result.Range(rColumnLetter & "1:" & rColumnLetter & ILrow)
    colNum = Application.WorksheetFunction.Match(Result.Cells(1, resultcolumn - 1).Value, PL.Range("1:1"), 0)
    
    Result.Cells(1, resultcolumn) = Result.Cells(1, resultcolumn - 1) & " Postload - " & colNum
    
    'Result.Cells(1, resultcolumn + 1).EntireColumn.Insert
    Result.Cells(1, resultcolumn + 1) = Result.Cells(1, resultcolumn - 1) & " Comparison"
    ColumnLetter = Split(Cells(1, resultcolumn + 1).Address, "$")(1)
    Result.Range(ColumnLetter & "1:" & ColumnLetter & ILrow).Interior.Color = RGB(146, 208, 80)
    
    resultcolumn = resultcolumn + (2 * (i - i + 1)) + 1
    
    
Next i

【问题讨论】:

  • 您能否描述一下代码应该做什么?
  • @VBasic2008 ,我的代码假设将数据复制到另一个工作表并为每列插入 2 个空白列
  • 你的意思是把A复制到AB复制到DC复制到G...等等?
  • @VBasic2008 是的,我这样做了,但它非常慢并且需要很长时间,因为我的数据有 710k 行和 110 列数据
  • 您是否尝试过使用For 直接从一个单元格转移到另一个单元格,而不是使用范围的复制/粘贴。一个用于列,另一个用于行?你的数据有可能吗?看看这个网站xylos.com/en/learning/blog/…

标签: arrays excel vba performance copy-paste


【解决方案1】:

根据我的经验,最好避免直接在工作表上进行操作。我会做的是:

  1. 创建数组变量
  2. 调整数组大小,使其可以容纳所有数据
  3. 使用当前包含在“for”循环中的操作填充数组
  4. 将数组打印到工作表中

最终的结果会接近这个:

public sub populateArray()
    dim arr_data() as Variant
    dim numberOfRows,numberOfColumns,currentRow,currentCollumn   as integer
    currentRow = 0
    currentCollumn = 0
    numberOfRows = 10
    numberOfColumns = 10
    redim arr_data(numberOfRows,numberOfColumns) 
    
    for currentRow to numberOfRows
        for currentCollumn to numberOfColumns
            arr_data (currentRow,currentCollumn) = "TEXT"
        next currentCollumn
    next currentRow
    
    with activesheet
        .range("A1") = arr_data
    next with
    
end sub

请注意,我没有测试上面的代码,请随意调整以适应您的需求。

【讨论】:

  • 我对数组不是很熟悉,可以举个例子在数组中插入列吗?
  • 我的行数 = 798000 和列数 = 318 内存不足
  • 将类型声明从 'as integer' 更改为 'as Long' - long 类型可以容纳从 -2,147,483,648 到 2,147,483,647 的数字。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多