Excel VBA - 慢循环执行

时间:2017-07-20 12:36:10

标签: excel vba excel-vba

我创建了一个循环(昨天工作得很好),复制了一系列单元格,然后将它们的值相对于每个单元格向右粘贴一个单元格。该范围由91个单元格组成,它们全部由标题分隔,因此我无法全部选择它们并粘贴这些值,因为#34;不适用于多个选项。"我们的想法是复制"当前日期"进入"前一天"范围。

所以今天当我运行宏时,它非常慢,每秒大约1个单元。几秒钟后Excel变得没有响应,但我仍然可以看到它在屏幕上做了什么。当&#34;光标&#34;导致屏幕向下滚动,有一个灰色区域通常是工作表的其余部分,你知道什么是非响应窗口的样子。一旦光标击中那个灰色区域,循环开始快速进入并在一秒钟内完成。最初的CPU使用率<1%,但一旦发生这种情况就会上升到25%左右。

我将循环放在它自己的子程序中,因为它是更大日期和其他值的更大宏的一部分,但没有效果。当我删除那个循环时,另一个宏(没有其他循环)运行得很好。

任何帮助都将不胜感激。

这是循环的代码:

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

4 个答案:

答案 0 :(得分:2)

你根本不需要循环:

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

答案 1 :(得分:1)

您可以尝试这样:

export class AppPreview {
   @Input() childTmpl: string;

   ngOnInit() {
     console.log(this.childTmpl);
   }
}

我改变了什么:

  • 你没有复制,但你引用了值
  • 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 对于变量来说真是个坏名字,只要它是VBA中的对象
  • 在Excel中引用命名区域对我来说看起来更好 - Cell

答案 2 :(得分:0)

这会有所帮助:

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

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

答案 3 :(得分:0)

您可以直接指定值而无需复制和粘贴,这应该更快,更“流畅”:

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