首页 > 解决方案 > 如何修复 700K 行范围的溢出

问题描述

作为更大宏的一部分,该代码应该检查 D 列中的单元格是否以 6 开头。如果是,则复制从第 2 个开始的 Mid 5 个字符(基本上,跳过 6),如果不是从 6 开始,只需从左侧复制前 5 个字符并粘贴到 E 列的相邻单元格中。

我不断收到溢出错误,我假设是因为文档有 700K 行长。关于我如何解决这个问题的任何建议?

Sub Left_Function()

Dim sourceRang As Range, destinationRange As Range, i As Integer, LastRow As Integer
LastRow = ActiveSheet.UsedRange.Rows.Count
Set SourceRange = Sheet1.Range("D1:LastRow")
Set desinationRange = Sheet1.Range("E1:LastRow")
For i = 1 To SourceRange.Count
    For Each cell In SourceRange
        If Left(cell.Value, 1) = "6" Then
            destinationRange(i, 1).Value = Mid(SourceRange(i, 1).Value, 2, 5)
        Else: destinationRange(i, 1).Value = Left(SourceRange(i, 1).Value, 5)
        End If
    Next cell
Next i

End Sub

我不擅长 VBA,所以它是基于我在谷歌上搜索的东西的相当拼凑的工作,所以如果你有其他代码,那么我会全神贯注。

标签: excelvbaoverflow

解决方案


你的代码有很多问题

  • 数据类型使用不正确(整数而不是长整数)
  • 无效的范围定义Range("D1:LastRow")
  • 变量名和对象引用中有许多拼写错误
  • 不一致的Worksheet引用(ActiveSheet可能是也可能不是Sheet1
  • 不必要的嵌套 For 循环(这会耗尽你的运行时间)
  • 对于这么大的数据集,直接循环范围会导致代码

修复这些问题,并转换为 Variant Array 方法:

Option Explicit

Sub Left_Function()
    Dim ws As Worksheet
    Dim sourceRange As Range, destinationRange As Range
    Dim i As Long
    Dim src As Variant, dst As Variant

    Set ws = ActiveSheet
    With ws
        Set sourceRange = .Range(.Cells(1, 4), .Cells(.Rows.Count, 4).End(xlUp))
        Set destinationRange = sourceRange.Offset(0, 1)
        src = sourceRange.Value
        ReDim dst(1 To UBound(src, 1), 1 To 1)

        For i = 1 To UBound(src, 1)
            dst(i, 1) = Mid$(src(i, 1), IIf(Left$(src(i, 1), 1) = "6", 2, 1), 5)
        Next

        destinationRange = dst
    End With
End Sub

推荐阅读