当我最初构建此代码时,我大量搜索其他解决方案,但无法找到任何有效的方法。
我有一个我每天工作的电子表格,其内容也每天都在变化(行数也是如此)。请注意,我为此代码使用命名范围(例如“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
答案 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)"