查找和替换命名范围

时间:2017-09-22 19:55:29

标签: excel vba excel-vba

出于某种原因,如果我将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 个答案:

答案 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