我在VBA中编写代码,删除了字符之间的一些潜在空格。代码工作得很好,但是当文件包含数千行时变得非常慢。我想知道是否可以改进它,以减少操作时间,但也主要是为了阻止文件冻结。这是代码:
Sub Test()
Dim cell as Range
Dim sht As Worksheet
Dim LastRow As Long
Dim StartCell As Range
Dim areaToTrim As Range
Set sht = ThisWorkbook.Worksheets("SS upload")
Set StartCell = sht.Range("A14")
LastRow = sht.Cells(sht.Rows.Count, StartCell.Column).End(xlUp).Row
Set areaToTrim = sht.Range("B14:B" & LastRow)
For Each cell In areaToTrim
cell.Value = Trim(cell.Value)
Next cell
End Sub
答案 0 :(得分:1)
最快的方法是将范围读入数组,在那里修剪然后将其写回范围:
Sub Test()
Dim sht As Worksheet
Dim LastRow As Long
Dim StartCell As Range
Dim areaToTrim As Range
Dim varArray() As Variant
Dim i As Long
Set sht = ThisWorkbook.Worksheets("SS upload")
Set StartCell = sht.Range("A14")
LastRow = sht.Cells(sht.Rows.Count, StartCell.Column).End(xlUp).Row
Set areaToTrim = sht.Range("B14:B" & LastRow)
varArray = areaToTrim ' Read range into array
For i = LBound(varArray, 1) To UBound(varArray, 1)
varArray(i, 1) = Trim(varArray(i, 1))
Next i
areaToTrim.Value = varArray ' Write array back to range
End Sub
无需担心Application.ScreenUpdating
或Application.Calculation
。好又简单!
如果您仍然担心任何响应,请在循环体中放置DoEvents
。
答案 1 :(得分:0)
尝试这样做,以减少screenupdating。这是我一直使用的一段代码,因此对于当前的问题,一些命令可能有点过多,但它们仍然有用。
作为第二点 - 不要声明名为Cell
的变量,稍后您可能会受到一些影响。声明它为rngCell
或myCell
或其他任何不属于VBE变量的内容。
Public Sub TestMe()
Call OnStart
'YourCode
Call OnEnd
End Sub
Public Sub OnEnd()
Application.ScreenUpdating = True
Application.EnableEvents = True
Application.AskToUpdateLinks = True
Application.DisplayAlerts = True
Application.Calculation = xlAutomatic
ThisWorkbook.Date1904 = False
Application.StatusBar = False
End Sub
Public Sub OnStart()
Application.ScreenUpdating = False
Application.EnableEvents = False
Application.AskToUpdateLinks = False
Application.DisplayAlerts = False
Application.Calculation = xlAutomatic
ThisWorkbook.Date1904 = False
ActiveWindow.View = xlNormalView
End Sub
如果您愿意,可以将范围保存为数组并在那里进行修剪操作。但是,如果您不习惯使用数组 - Trim Cells using VBA in Excel
,则可能会使代码过于复杂答案 2 :(得分:0)
在循环中插入DoEvents
时,可以防止冻结。
然后执行它,每百次说一次。
这将使循环运行速度稍慢,但允许用户同时使用GUI。
...
Dim cnt As Integer
For Each cell In areaToTrim
cell.Value = Trim(cell.Value)
cnt=cnt + 1
If cnt Mod 100 = 0 Then
DoEvents
End If
Next cell
...
您可以使用该数字来优化它以满足您的需求。
DoEvents也带来了一些问题。可以找到关于DoEvents的一个很好的解释here。