excel - 如何修复 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,所以它是基于我在谷歌上搜索的东西的相当拼凑的工作,所以如果你有其他代码,那么我会全神贯注。
解决方案
你的代码有很多问题
- 数据类型使用不正确(整数而不是长整数)
- 无效的范围定义
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
推荐阅读
- python - 在 Keras/Tensorflow 中实现可训练的广义 Bump 函数层
- r - 从具有不同大小元素 R 的列表中提取
- angular - 当我的项目根据您击中的路线同时使用 angular 和 razor 时,如何处理基本 href?
- c# - .NET 保存屏幕截图导致异常“GDI+ 中发生一般错误”
- python - 如何在函数中使用 for 循环返回元素?
- python - 如何在 html 页面中上传文件,在使用 python 的 azure 函数中使用 http 触发器?
- python - 如何在匿名函数中分配值?
- typescript - 量角器 - 如何断言表中没有值?
- installation - 导入 tensorflow_datasets
- json - 如果另一个属性为空,如何在 JSON 模式中创建一个必需的属性,反之亦然