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