VBA和Excel:为什么我的TRIM脚本在大数据集上产生#VALUE?

以下脚本适用于较小的数据集(小于30k行左右),但当范围大于此值时,将导致所选范围内的每个单元格出现“#VALUE”错误。

Dim FirstCell As Range, LastCell As Range, MyRange As Range Set LastCell = Cells(Cells.Find(What:="*", SearchOrder:=xlRows, _ SearchDirection:=xlPrevious, LookIn:=xlValues).Row, _ Cells.Find(What:="*", SearchOrder:=xlByColumns, _ SearchDirection:=xlPrevious, LookIn:=xlValues).Column) Set FirstCell = Cells(Cells.Find(What:="*", After:=LastCell, SearchOrder:=xlRows, _ SearchDirection:=xlNext, LookIn:=xlValues).Row, _ Cells.Find(What:="*", After:=LastCell, SearchOrder:=xlByColumns, _ SearchDirection:=xlNext, LookIn:=xlValues).Column) Set MyRange = Range(FirstCell, LastCell) MyRange.Select If MyRange Is Nothing Then Exit Sub Application.ScreenUpdating = False Application.Calculation = xlCalculationManual With Selection .Value = Evaluate("if(row(" & .Address & "),clean(trim(" & .Address & ")))") End With Application.ScreenUpdating = True Application.Calculation = xlCalculationAutomatic MsgBox "Finished trimming " & vbCrLf & "excess spaces", 64 

VBA TRIM错误

我设法复制你的问题,并使用如下所示的variant数组克服了大数据集的问题

 Dim FirstCell As Range, LastCell As Range, MyRange As Range Dim DataRange() As Variant Dim lRows As Long Dim lCols As Long Dim i As Long, j As Long Dim value As String Set LastCell = Cells(Cells.Find(What:="*", SearchOrder:=xlRows, _ SearchDirection:=xlPrevious, LookIn:=xlValues).Row, _ Cells.Find(What:="*", SearchOrder:=xlByColumns, _ SearchDirection:=xlPrevious, LookIn:=xlValues).Column) Set FirstCell = Cells(Cells.Find(What:="*", After:=LastCell, SearchOrder:=xlRows, _ SearchDirection:=xlNext, LookIn:=xlValues).Row, _ Cells.Find(What:="*", After:=LastCell, SearchOrder:=xlByColumns, _ SearchDirection:=xlNext, LookIn:=xlValues).Column) Set MyRange = Range(FirstCell, LastCell) MyRange.Select If MyRange Is Nothing Then Exit Sub Application.ScreenUpdating = False Application.Calculation = xlCalculationManual lRows = MyRange.Rows.Count lCols = MyRange.Columns.Count ReDim DataRange(1 To lRows, 1 To lCols) DataRange = MyRange.value For j = 1 To lCols For i = 1 To lRows DataRange(i, j) = Trim(DataRange(i, j)) Next i Next j MyRange.value = DataRange Application.ScreenUpdating = True Application.Calculation = xlCalculationAutomatic MsgBox "Finished trimming " & vbCrLf & "excess spaces", 64 

作为参考,我用这篇文章来帮助拿出答案: https : //blogs.office.com/2008/10/03/what-is-the-fastest-way-to-scan-a-large-range -in-的Excel /