Optimization 为每个循环进行优化

Optimization 为每个循环进行优化,optimization,excel,vba,Optimization,Excel,Vba,当我最初构建这段代码时,我大量搜索了其他解决方案,但没有找到任何有效的方法 我有一个每天使用的电子表格,它的内容每天都在变化(行数也是如此)。请注意,我在这段代码中使用了命名范围(如“Rules1”);这些范围每天都会被删除并重新命名,因此我不必一直定义代码中的行数。电子表格中大约有5000行,但它会随着时间的推移而增加 代码运行得很漂亮,但速度很慢。我正在寻找一种好的加速方法。此代码的目的是将文本“ZZZ”替换为“C1”或该行上的任何行。例如,我可能有一个字符串,如或(LEFT(ZZZ,6)=

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

我有一个每天使用的电子表格,它的内容每天都在变化(行数也是如此)。请注意,我在这段代码中使用了命名范围(如“Rules1”);这些范围每天都会被删除并重新命名,因此我不必一直定义代码中的行数。电子表格中大约有5000行,但它会随着时间的推移而增加

代码运行得很漂亮,但速度很慢。我正在寻找一种好的加速方法。此代码的目的是将文本“ZZZ”替换为“C1”或该行上的任何行。例如,我可能有一个字符串,如
或(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

不要逐个检查每个单元格,而是使用相对引用,以便可以一次对所有单元格应用
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)"

调用Cell.Replace(“ZZZ”,Cell.OffSet(0,-4).Address)
我不懂这行。另外,您是否知道可以使用MatchCase作为
False
或compare方法作为
vbTextCompare
进行替换,这样您就不必替换
ZZZ
ZZZ
?您不需要每次都使用第二行Hi Siddharth,谢谢您的评论。我必须承认,我也不理解这行代码,但它始终有效。感谢您对案例差异的了解。但是,关于如何使这更快,还有其他想法吗?我可以看看你的工作手册吗?如果是的话,那么你可以上传到wikisend.com并在这里分享这个链接。我当然非常感谢这样的帮助。不幸的是,它包含一些我无法共享的机密客户信息,我需要花很长时间来挖掘这些信息。不过,谢谢你!问题是你正在5个范围内的每个单元格中循环,并进行替换,这将是缓慢的。我想看看是否有更好的办法来解决你的问题。无论如何,另一个技巧是:在代码运行之前将计算设置为手动,然后在代码运行之后将计算设置为自动。谢谢您的建议,rdhs!不幸的是,您建议的代码不起作用。例如,在第18行中,它创建了一个字符串
ISNUMBER(VALUE(RIGHT(RIGHT)(间接的(“R[-4]C”,FALSE),7))
当它应该是
ISNUMBER(VALUE(RIGHT(C10,7)))
时,这两个公式应该给出相同的结果。抱歉,可能没有足够的信息来了解整个情况,我的错。“Rules1”是(在本例中)范围(“G2:G3952”)的命名范围,但由于它每天都会更改,因此我每天都重命名该范围,以便它包含所有新数据。这有区别吗?我的意思是,当你把它变成一个公式时,Excel会把
当作间接的(“R[-4]C,FALSE)
,就像它看到
C10
。我想这就是它的工作方式。出于某种原因,它没有将其视为
C18
(注意,我给出的单元格示例是
C18
;可能是
C2952
,这取决于我们选择的单元格)。