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

Office 2003 のサポートは終了しました

マイクロソフトでは、2014 年 4 月 8 日に Office 2003 のサポートを終了しました。この変更は、ソフトウェアの更新プログラムおよびセキュリティ オプションに影響しています。 この変更の意味および保護された状態を維持する方法について説明します。

現象
ブックとシートそれぞれに紐付いた同じ名前の「名前の定義」が存在する場合、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    NextEnd Sub Sub DeleteName()    ActiveWorkbook.Names(2).DeleteEnd Sub
  6. Check() を実行して Index と Name を確認します。
    イミディエイト ウィンドウには以下のように出力されます。
    1 'Sheet1 (2)'!NameX2 NameX
  7. DeleteName() を実行して、範囲が "ブック" の「NameX」という名前の定義を削除します。
結果
ActiveWorkbook.Names(2).Delete で、Index が 2 である、範囲が "ブック" の「NameX」を削除したはずが、実際には、範囲が "Sheet1(2)" の「NameX」が削除されます。
関連情報
注意 : これは、マイクロソフトのサポート組織内で直接作成された "緊急公開" の資料です。 この資料には、確認中の問題に関する現状ベースの情報が記載されています。 情報提供のスピードを優先するため、資料には誤植が含まれる可能性があり、予告なしに随時改定される場合があります。 その他の考慮事項については、使用条件を参照してください。
プロパティ

文書番号:2955931 - 最終更新日: 09/20/2016 13:23:00 - リビジョン: 2.0

Microsoft Excel 2013, Microsoft Excel 2010, Microsoft Office Excel 2007, Microsoft Office Excel 2003

  • kbtshoot kbexpertiseinter kbexpertiseadvanced KB2955931
フィードバック