出于某种原因,如果我将YTD和YTG的值更改为“,9”和“,12”,则此宏中的替换功能不会出现,宏将无效。这就是我所拥有的。
Sub Rename()
Dim YTG As String
Dim YTD As String
Dim Shiftold As String
Dim Shitnew As String
i = 1
YTG = "<>YTG"
YTD = "YTD"
Shiftold = "0,0,1"
ShiftNew = "0,12,1"
For Each Name In ActiveWorkbook.Names
If InStr(1, Names(i).RefersTo, YTG) > 0 Then
Names(i).RefersTo = Replace(Names(i).RefersTo, YTG, YTD)
End If
If InStr(1, Names(i).RefersTo, Shiftold) > 0 Then
Names(i).RefersTo = Replace(Names(i).RefersTo, Shiftold, ShiftNew)
End If
i = i + 1
Next Name
End Sub
关于为什么宏不再起作用的任何想法?
答案 0 :(得分:0)
我强烈建议使用Option Explicit
强制执行变量声明,这将捕获拼写错误和(大多数)遗漏声明。
Rename
是一个可怕的宏名称选择(如Name
是变量名称的错误选择),因为它与常用方法等重叠,在这种情况下几乎不知道实际发生了什么受到影响。
正如评论中所观察到的,您实际上并未使用For Each
循环变量。这使得它毫无意义,但实际上是访问集合元素的更好方法。
以下是我建议的改进;请注意,评论是在讨论我是如何改变它的,所以你应该添加一些描述真实目的的评论而不是使用这些评论。
Sub UpdateNamedRanges() ' specific macro title
Dim YTG As String
Dim YTD As String
Dim ShiftOld As String
Dim ShiftNew As String ' corrected
Dim AName As Name 'declared
YTG = "<>YTG"
YTD = "YTD"
ShiftOld = "0,0,1"
ShiftNew = "0,12,1"
For Each AName In ActiveWorkbook.Names
' use loop variable
If InStr(1, AName.RefersTo, YTG) > 0 Then
AName.RefersTo = Replace(AName.RefersTo, YTG, YTD)
End If
If InStr(1, AName.RefersTo, ShiftOld) > 0 Then
AName.RefersTo = Replace(AName.RefersTo, ShiftOld, ShiftNew)
End If
Next AName
End Sub