2017-09-22 80 views
0

由于某些原因,我在此宏中替换函数不会如果我将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 

有关宏为什么不工作的任何想法?

+1

也许有人删除了你命名的范围 – jsotola

+0

你正在声明一个循环变量'Name',但它永远不会被使用。 ....你确定你的循环是正确构建的? – jsotola

+0

“名称(i)”是什么?你还没有声明'名称'。 – jsotola

回答

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 
+0

我完全按照书面形式使用它,只是将变量的值更改为以下内容 'YTG =“B $ 2,9,1”' 'YTD =“B $ 2,12,1”' 'ShiftOld =“ B $ 4,9,1“' 'ShiftNew =”B $ 4,12,1“' 这是为了改变指定范围引用的月份,以便引用上一年或当前年份在参考单元格B4或B2和一个月份(9月,= 9或12月= 12)。当这运行时,我得到以下错误。 运行时错误“1004” 您输入的公式中存在错误。 – ExcelMonkey19

+0

不知道您的命名范围对“ReferTo”值有何影响,将难以诊断问题。这是做你想做的事的一种相当脆弱的方式;我的回答只是一些代码清理,而不是我如何达到最终目的。 – Joffan