首页 > 解决方案 > 使用 .rows(y).value = .rows(x).value 复制行时,Excel 内存不足

问题描述

基本上我想将某些行复制到另一个工作表。为此,我在循环中使用这些行:

For i = 2 To lRow
    Select Case ws.Cells(i, 1).Value
        Case "00"
        Case "01"
        Case "02"
        Case "03"
        Case Else
            wsNew.Rows(rowCounter).Value = ws.Rows(i).Value
            rowCounter = rowCounter + 1
    End Select
Next i

在此之前是一个只复制某些行的大选择语句。ws 是我原来的工作表,wsNew 是我的新工作表,rowCounter 只是帮助知道我填写了多少 wsNew lRow 是我的工作表中的行数,

我只想将落入 else 的行复制到新工作表中。

因为我只做 .Value = .Value 我根本不明白它是如何使用 ram 的,因为我认为 .Value = .Value 实际上只是对该行使用 ram 并立即被垃圾收集。

该代码适用于从 2 到 100 的 i,但我正在使用的数据有 ~23000 行。在大约 21000 行之后,我用完了 32 位 excel 的内存。

使用 64 位 excel 不是一个选项 atm。

标签: excelvba

解决方案


我几乎 100% 确定您不需要复制整个 excel 行 - 包括所有可能的列,甚至是空白列。

试一试:

For i = 2 To lRow
    Select Case ws.Cells(i, 1).Value
        Case "00"
        Case "01"
        Case "02"
        Case "03"
        Case Else
            Dim lastColumn as Long
            lastColumn = ws.Cells(i,ws.Columns.Count).End(xlToLeft).Column
            wsNew.Cells(rowCounter,1).Resize(1,lastColumn).Value = ws.Cells(i,1).Resize(1,lastColumn).Value
            rowCounter = rowCounter + 1
    End Select
Next i

推荐阅读