Excel 如何修复700K行范围的溢出

Excel 如何修复700K行范围的溢出,excel,vba,overflow,Excel,Vba,Overflow,作为较大宏的一部分,代码应该检查D列中的单元格是否以6开头。如果是这样,从第二个开始复制中间的5个字符(基本上跳过6个),如果不是从6开始,只需从左侧复制前5个字符并粘贴到E列的相邻单元格中 我一直得到一个溢出错误,我假设是因为文档有700K行长。关于如何解决这个问题,有什么建议吗 Sub Left_Function() Dim sourceRang As Range, destinationRange As Range, i As Integer, LastRow As Integer La

作为较大宏的一部分,代码应该检查D列中的单元格是否以6开头。如果是这样,从第二个开始复制中间的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不是很在行,所以它是基于我在谷歌上搜索到的东西进行的相当多的修补工作,所以如果你有一个替代的代码位,那么我会全神贯注。

我认为导致溢出的原因是你将
I
LastRow
指定为
Int
类型
Int
的最大值为
32767
,因此如果有700K行,则会出现溢出。要修复此问题,请将类型更改为
Long

另外,初始化
SourceRange
destinationRange
的方式看起来有点错误,原因有几点---像
“D1:LastRow”
这样的表达式只是字符串文字,在Excel中不会给出有效的范围

你需要这样的东西:

Sheet1.Range("D1:D" & CStr(LastRow))
这里有三件事微妙的变化。首先,
CStr(LastRow)
将数值
LastRow
转换为其等效字符串。其次,
&
连接字符串(也可以使用
+
)。第三,注意需要为范围的开始和结束显式指定列:D1:100无效(只有一个D);但D1:D100可以工作


希望能有所帮助。

我认为导致溢出的原因是您将
I
LastRow
指定为
Int
类型
Int
的最大值为
32767
,因此如果有700K行,则会出现溢出。要修复此问题,请将类型更改为
Long

另外,初始化
SourceRange
destinationRange
的方式看起来有点错误,原因有几点---像
“D1:LastRow”
这样的表达式只是字符串文字,在Excel中不会给出有效的范围

你需要这样的东西:

Sheet1.Range("D1:D" & CStr(LastRow))
这里有三件事微妙的变化。首先,
CStr(LastRow)
将数值
LastRow
转换为其等效字符串。其次,
&
连接字符串(也可以使用
+
)。第三,注意需要为范围的开始和结束显式指定列:D1:100无效(只有一个D);但D1:D100可以工作


希望能有所帮助。

您的代码中有很多问题

  • 数据类型使用不正确(整数而不是长)
  • 无效的范围定义
    范围(“D1:LastRow”)
  • 变量名和对象引用中的许多拼写错误
  • 不一致的
    工作表
    引用(
    活动工作表
    可能是也可能不是
    工作表1
  • 不必要的嵌套For循环(这将耗尽您的运行时间)
  • 对于如此大的数据集,直接循环范围将使代码非常慢
修复这些问题,并转换为变体阵列方法:

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

代码中有很多问题

  • 数据类型使用不正确(整数而不是长)
  • 无效的范围定义
    范围(“D1:LastRow”)
  • 变量名和对象引用中的许多拼写错误
  • 不一致的
    工作表
    引用(
    活动工作表
    可能是也可能不是
    工作表1
  • 不必要的嵌套For循环(这将耗尽您的运行时间)
  • 对于如此大的数据集,直接循环范围将使代码非常慢
修复这些问题,并转换为变体阵列方法:

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