VBA - 修剪功能:减少操作/冻结时间

时间:2017-08-28 08:56:37

标签: vba excel-vba trim excel

我在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

3 个答案:

答案 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.ScreenUpdatingApplication.Calculation。好又简单!

如果您仍然担心任何响应,请在循环体中放置DoEvents

答案 1 :(得分:0)

尝试这样做,以减少screenupdating。这是我一直使用的一段代码,因此对于当前的问题,一些命令可能有点过多,但它们仍然有用。

作为第二点 - 不要声明名为Cell的变量,稍后您可能会受到一些影响。声明它为rngCellmyCell或其他任何不属于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