1

我有以下代码。我想知道是否有一种简单的方法可以重写它以减少运行时间?目前,我有大约 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
4

3 回答 3

2

我相信这将有助于使它更快。无需循环,无需复制和粘贴。

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
于 2013-01-02T18:02:06.530 回答
1

如果您对大量单元格进行操作,将它们复制到数组中并在处理后将它们写回通常是最快的。以下代码在我的机器上运行 0.04 秒(基于 Scott 的回答,但也使用数组进行编写):

将 wks 调暗为工作表
Dim varCompare As Variant, varSource As Variant, varTarget As Variant
昏暗 Lastrow 只要,我只要

Application.ScreenUpdating = False
Application.Calculation = xlManual

设置 wks = Sheets("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)
    For i = LBound(varCompare, 1) To 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
于 2013-01-02T20:38:10.060 回答
0

鉴于所有好的提示,并包括以下内容。请尝试一下,看看您可以实现多少性能提升。

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
于 2013-01-02T18:01:43.347 回答