优化每个循环

时间:2013-11-21 16:38:19

标签: optimization excel-vba vba excel

当我最初构建此代码时,我大量搜索其他解决方案,但无法找到任何有效的方法。

我有一个我每天工作的电子表格,其内容也每天都在变化(行数也是如此)。请注意,我为此代码使用命名范围(例如“Rules1”);范围每天都被删除并重新命名,因此我不必继续定义代码中的行数。大约有5,000行电子表格,虽然它会随着时间的推移而增长。

代码工作得很漂亮 - 但很慢。我正在寻找一种加快速度的好方法。此代码的目的是将文本“ZZZ”替换为“C1”或该行恰好打开的任何行。例如,我可能有一个字符串,例如OR(LEFT(ZZZ,6)="SAMPLE",LEFT(ZZZ,12)="SALES SAMPLE"),我需要将“ZZZ”替换为“C2420”,因为这就是今天该行所在的行。请注意,上面的代码不是公式 - 在代码的这个阶段,它缺少“=”,我稍后会插入。

Sub Replace_ZZZ()

Application.ScreenUpdating = False
Application.CutCopyMode = False

    Dim Rules1 As Range
    Set Rules1 = Range("Rules1")
    Dim Rules2 As Range
    Set Rules2 = Range("Rules2")
    Dim Rules3 As Range
    Set Rules3 = Range("Rules3")
    Dim Rules4 As Range
    Set Rules4 = Range("Rules4")
    Dim Rules5 As Range
    Set Rules5 = Range("Rules5")
    Dim RulesAll As Range
    Set RulesAll = Range("RulesAll")

    Workbooks("POVA Daily Reporter.xlsm").Worksheets("Paste Daily Data").Select
    ActiveSheet.AutoFilterMode = False
    Cells.Copy
    Cells.PasteSpecial xlPasteValues
    Range("G2").Select

    Application.EnableEvents = False
    Dim Cell As Variant
    On Error Resume Next

    For Each Cell In Rules1
        Call Cell.Replace("ZZZ", Cell.OffSet(0, -4).Address)
        Call Cell.Replace("zzz", Cell.OffSet(0, -4).Address)
    Next Cell

    For Each Cell In Rules2
        Call Cell.Replace("ZZZ", Cell.OffSet(0, -5).Address)
        Call Cell.Replace("zzz", Cell.OffSet(0, -5).Address)
    Next Cell

    For Each Cell In Rules3
        Call Cell.Replace("ZZZ", Cell.OffSet(0, -6).Address)
        Call Cell.Replace("zzz", Cell.OffSet(0, -6).Address)
    Next Cell

    For Each Cell In Rules4
        Call Cell.Replace("ZZZ", Cell.OffSet(0, -7).Address)
        Call Cell.Replace("zzz", Cell.OffSet(0, -7).Address)
    Next Cell

    For Each Cell In Rules5
        Call Cell.Replace("ZZZ", Cell.OffSet(0, -8).Address)
        Call Cell.Replace("zzz", Cell.OffSet(0, -8).Address)
    Next Cell

    Application.ScreenUpdating = True
    Sheet.Calculate

End Sub

1 个答案:

答案 0 :(得分:0)

不要单独浏览每个单元格,而是使用相对引用,这样您就可以同时将Replace应用于所有单元格:

Range("Rules1").Replace "ZZZ", "INDIRECT(""R[-4]C"", FALSE)"
Range("Rules2").Replace "ZZZ", "INDIRECT(""R[-5]C"", FALSE)"
Range("Rules3").Replace "ZZZ", "INDIRECT(""R[-6]C"", FALSE)"
Range("Rules4").Replace "ZZZ", "INDIRECT(""R[-7]C"", FALSE)"
Range("Rules5").Replace "ZZZ", "INDIRECT(""R[-8]C"", FALSE)"