2017-09-22 127 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