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

変数宣言を強制的に使用することを強くお勧めします。これにより、タイプミスや宣言が欠けています。

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

関連する問題