关于如何加快循环的build议

我有以下代码。 我想知道是否有一个简单的方法来重写它,以便需要更less的时间来运行? 目前,我有大约13,000行循环,大约需要3-5分钟。 谢谢!

Sheets("wkly").Activate Dim i As Long Lastrow = Range("A" & Rows.Count).End(xlUp).Row For i = 2 To Lastrow If Range("S" & i) > 0.005 Then Range("Z" & i, "AA" & i).Copy Range("AC" & i, "AD" & i).PasteSpecial xlPasteValues End If Application.ScreenUpdating = False Next i 

给出所有好的提示,并包括以下内容。 请尝试一下,看看你能达到多less性能提升。

 Application.Calculation = xlCalculationManual lastrow = Range("S" & Rows.Count).End(xlUp).Rows For i = 1 To lastrow If Range("S1").Offset(i) > 0.005 Then Range("AC").Offset(i).Resize(1, 2).Value = Range("Z").Offset(i).Resize(1, 2).Value End If Next i 

我相信这会让它变得更快。 没有循环,不需要复制和粘贴。

 Application.ScreenUpdating = False Application.Calculation = xlManual Dim wks As Worksheet, Lastrow As Long Set wks = Sheets("wkly") With wks Lastrow = .Range("A" & .Rows.Count).End(xlUp).Row .Range("S1:S" & Lastrow).AutoFilter 1, ">.005" 'Assumes you will always have values greater than .005, if not you need to error trap Dim rngFilter As Range Set rngFilter = .Range("S2:S" & Lastrow).SpecialCells(xlCellTypeVisible) 'assumes row 1 is header row rngFilter.Offset(, 10).Value = rngFilter.Offset(, 7).Value rngFilter.Offset(, 11).Value = rngFilter.Offset(, 8).Value End With Application.ScreenUpdating = True 

更新我知道你已经接受了答案,但万一你想知道如何做到这一点通过使用数组来循环,在这里是:

 Dim wks As Worksheet, varStore As Variant, Lastrow As Long, i As Long Application.ScreenUpdating = False Application.Calculation = xlManual Set wks = Sheets("wkly") With wks Lastrow = .Range("A" & .Rows.Count).End(xlUp).Row varStore = .Range("S2:S" & Lastrow) For i = LBound(varStore, 1) To UBound(varStore, 1) If varStore(i, 1) > 0.005 Then .Range("AC" & i + 2 & ":AD" & i + 2).Value = .Range("Z" & i + 2 & ":AA" & i + 2).Value Next End With Application.ScreenUpdating = False 

如果你在大量的单元上进行操作,把它们复制到一个数组中,并在处理后写回来通常是最快的。 下面的代码在我的机器上以0.04s运行(根据Scott的回答,但是也使用数组来写):


昏暗的星期作为工作表
 Dim varCompare As Variant,varSource As Variant,varTarget As Variant
 Dim Lastrow As Long,I As Long

 Application.ScreenUpdating = False
 Application.Calculation = xlManual

设置wks =表格(“wkly”)

用wks

     Lastrow = .Range(“A”&.Rows.Count).End(xlUp).Row

     varCompare = .Range(“S2:S”&Lastrow)
     varSource = .Range(“Z2:AD”&Lastrow)
     varTarget = .Range(“AC2:AD”&Lastrow)
    对于i = LBound(varCompare,1)到UBound(varCompare,1)

        如果varCompare(i,1)> 0.005那么
             varTarget(i,1)= varSource(i,1)
             varTarget(i,2)= varSource(i,2)
        万一
    下一个

     .Range(“AC2:AD”&Lastrow).Value = varTarget
结束

 Application.ScreenUpdating = False