Excel VBA – 慢循环执行

我创build了一个循环(昨天工作完美),它复制一个单元格的范围,然后将它们的值粘贴到右侧,相对于每个单元格。 范围由91个单元格组成,它们全部由标题分隔,所以我不能将它们全部选中并粘贴值,因为“不适用于多个select”。 这个想法是将数据从“当前date”范围复制到“前一天”范围内。

所以今天当我运行这个macros时,速度非常慢,每秒大约1个单元。 几秒钟后,Excel变得无法响应,但我仍然可以看到屏幕上正在做什么。 当“光标”导致屏幕向下滚动时,工作表的其余部分通常会出现灰色区域,您知道无响应的窗口是什么样子。 一旦光标到达灰色区域,循环开始快速完成,在一秒钟内完成。 CPU使用率最初<1%,但是一旦发生,就会上升到25%左右。

我把循环放在自己的子程序中,因为它是一个更大的macros的一部分,它改变date和其他值,但没有效果。 另一个macros(没有其他循环)运行完美,当我删除该循环。

任何帮助,将不胜感激。

这里是循环的代码:

Sub PreviousDay() Dim CDay As Range Set CDay = Range("CurrentDay") For Each Cell In CDay Cell.Copy Cell.Offset(0, 1).PasteSpecial Paste:=xlPasteValues Next Cell Application.CutCopyMode = False End Sub 

你可以这样尝试:

 Option Explicit Sub PreviousDay() Dim rngCell As Range Dim CDay As Range Set CDay = [CurrentDay] For Each rngCell In CDay rngCell.Offset(0, 1) = rngCell Next rngCell End Sub 

我改变了:

  • 你不要复制,但你引用的价值观
  • 对于variables来说, Cell实际上是个不错的名字,只要它是VBA中的一个对象即可
  • 在Excel中提到命名范围看起来更好,像这样 – [name_of_the_range]

你根本不需要循环:

 Sub PreviousDay() With Range("CurrentDay") .Offset(, 1).Value = .Value End With End Sub 

编辑:你需要循环,如果它不是一个连续的范围,但你可以循环的区域:

 Sub PreviousDay() Dim rgArea as Range For each rgArea in Range("CurrentDay").Areas rgArea.Offset(, 1).Value = rgArea.Value Next rgArea End Sub 

这将有助于:

试试这个Cell.Offset(0, 1).Value = Cell.Value而不是这个:

 Cell.Copy Cell.Offset(0, 1).PasteSpecial Paste:=xlPasteValues 

您可以直接分配值而无需复制和粘贴,这应该更快,更平滑:

 Sub PreviousDay() Dim CDay As Range Set CDay = Range("CurrentDay") For Each cell In CDay cell.Offset(0, 1).Value = cell.Value Next cell End Sub 

也许计算链接的单元格或Screenupdating也是一个刹车,所以你可以禁用:

 Sub PreviousDay2() Dim CDay As Range Set CDay = Range("CurrentDay") Application.ScreenUpdating = False Application.Calculation = xlCalculationManual For Each cell In CDay cell.Offset(0, 1).Value = cell.Value Next cell Application.Calculation = xlCalculationAutomatic Application.ScreenUpdating = True End Sub