Excel VBA またはオートメーションで、指定した Name オブジェクトを削除できない

現象

ブックとシートそれぞれに紐付いた同じ名前の「名前の定義」が存在する場合、Microsoft Excel VBA または Excel のオートメーションで、ブックに紐付く Name オブジェクトを指定して削除を実行しても、削除できません。
代わりに、シートに紐付く Name オブジェクトが削除されます。

回避策

ブックとシートそれぞれに紐付いた同じ名前の「名前の定義」がある限り、回避することはできません。
そのため、一時的に、シートに紐付いた名前 (下記例では "NameX") を別の名前 ("tempName") に変更します。
例)
' シートに紐付いた名前 (下記例では "NameX") を別の名前 ("tempName") に一時的に変更します
ActiveWorkbook.Names("'Sheet1 (2)'!NameX").Name = "tempName"

' ブックに紐付いた名前を削除します
ActiveWorkbook.Names("NameX").Delete

' 一時的に別の名前に変更したものを元の名前へ戻します
ActiveWorkbook.Names("'Sheet1 (2)'!tempName").Name = "NameX"


状況

マイクロソフトでは、この問題をこの資料の対象製品として記載されているマイクロソフト製品の問題として認識しています。

詳細

問題の再現手順
  1. Excel 2010 で新規ブックを作成します。
  2. Sheet1 の A1 セルを選択して、[名前ボックス] に「NameX」と入力します。
    この操作によって、範囲が "ブック" の「NameX」という名前の定義が作成されます。
  3. Sheet1 を選択して右クリックし、[移動またはコピー] をクリックします。
  4. [コピーを作成する] にチェックを入れて [OK] をクリックします。
    この操作によって、範囲が "Sheet1(2)" の「NameX」という名前が作成されます。
  5. 標準モジュールに以下のコードを記述します。
    Sub Check()
    For Each objName In ActiveWorkbook.Names
    Debug.Print objName.Index
    Debug.Print objName.Name
    Next
    End Sub

    Sub DeleteName()
    ActiveWorkbook.Names(2).Delete
    End Sub
  6. Check() を実行して Index と Name を確認します。
    イミディエイト ウィンドウには以下のように出力されます。
    1 
    'Sheet1 (2)'!NameX
    2
    NameX
  7. DeleteName() を実行して、範囲が "ブック" の「NameX」という名前の定義を削除します。
結果
ActiveWorkbook.Names(2).Delete で、Index が 2 である、範囲が "ブック" の「NameX」を削除したはずが、実際には、範囲が "Sheet1(2)" の「NameX」が削除されます。
プロパティ

文書番号:2955931 - 最終更新日: 2016/09/29 - リビジョン: 1

フィードバック