• ベストアンサー

名前を一括削除するマクロ

次のようなマクロを組んで、エクセルファイル上の「名前」を一括削除しようとしています。 For Each objName In ActiveWorkbook.Names objName.Delete Next 実行すると 「実行時エラー"1004":その名前は正しくありません」 というエラーになってしまいます。 名前を一括削除する方法、またはエラーの解決方法がわかれば教えてください。 環境:WindowsXP+Excel2003

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

こんばんは。Wendy02です。 >ご迷惑でなければ、該当のファイルをgooのメールに送らせていただいて、見て頂けませんでしょうか? 確か、個人間のやり取りは、ここでは禁止されていたはずなので、申し訳ありませんが、それはできません。 「実行時エラー"1004":その名前は正しくありません」 やっと、そのエラーを確認できました。私は、勘違いをしていました。それは、マクロのコード側からではなくて、Excelのワークシート側からでした。 マクロでは、たぶん削除できないと思いますので、 Sub test3() Dim objName As Object For Each objName In Application.Names    objName.Visible =True Next End Sub としてみて、挿入-名前-定義 で確認して、手動で削除してみてください。

wenlazy
質問者

お礼

確かに手で消せるようになりました。 ありがとうございました。 一括削除できないのは残念ですが、これで乗り切ります。

その他の回答 (5)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.6

こんばんは。Wendy02です。 >一括削除できないのは残念ですが、これで乗り切ります。 これは、特殊なエラーのひとつなのです。通常はありません。 今回、ある程度の確信があって、私も回答はしたのですが、さまざまなケースの中で、以下のような推測をしています。 ※ 登録: マクロ(Names.Add)  削除: マクロ(Names(i).Delete) こちらは、たぶん、問題ありません。 (ただし、マクロとしては、関心しません。理由は、Rangeオブジェクトの中に、変数が使えるからです。変数は一時的だから、そちらのほうがよいです。) ※ 登録: 手動(ワークシート) 削除: マクロ(Names(i).Delete)   For Each in ....Names でも同じ。 こちらは、問題が起こる可能性があります。おそらく、登録のミスか、登録の際の時間的なロスが、トラブルを起こすか、という想像をしています。

wenlazy
質問者

お礼

もらった雛形ファイルに既に隠れた「名前」が既にたくさん付いてました。 雛形ファイルだったために増殖してしまって困っていました。 ありがとうございました。

  • venzou
  • ベストアンサー率71% (311/435)
回答No.5

#1です >特殊な状態になっています。 >もし、ご迷惑でなければ該当のエクセルファイルをメールで送らせて頂いてみていただく訳に行きませんでしょうか? 私は同じエラーが再現出来なかったので、そのエクセルファイルを拝見してみたいのですが、ここのルール違反になりますので、残念ながらメールでのやり取りは出来ません。 お力になれず、すいませんでした。

wenlazy
質問者

お礼

ルールをよく読んでいなくて、すいませんでした。 根本解決はしてませんが、何とかなりそうです。 ありがとうございました。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんにちは。 私のほうの実行時エラーは、"1004"ではなく、標準モジュールなので、"438" なのですが、論理的なエラーではなくて、たぶん、Nameオブジェクトのいくつかが、ActiveWorkbookというメンバにないためのエラーだと思います。とても、興味のある現象ですね。 Names オブジェクトは、VBAでは、あまり使われない種類のものです。それは、今回のエラーではお分かりにならなかったかもしれませんが、 Application, Workbook, Sheet と三つのメンバ(配下)にあるものなので、とても使いづらいのです。 オブジェクトブラウザを見ていただければわかります。 おっしゃるコードを、そのまま直してみました。 あまり、現実的なコードではありませんが、以下のようになります。 Sub test1() Dim objName As Object For Each objName In Application.Names  If objName.RefersToRange.Parent.Parent.Name = ActiveWorkbook.Name Then    objName.Delete  End If Next End Sub ですから、実際は、ActiveWorkbook.Names ではなくて、他のブックをクローズして、ブックを一本にすれば、以下のようにして済むはずです。 Sub test2() Dim objName As Object For Each objName In Application.Names    objName.Delete Next End Sub

wenlazy
質問者

お礼

ありがとうございます。 早速試してみたのですが、同じでした。 名前を消そうとしているエクセルファイルが特殊な気がしています。 ご迷惑でなければ、該当のファイルをgooのメールに送らせていただいて、見て頂けませんでしょうか?

  • nobu555
  • ベストアンサー率45% (158/345)
回答No.2

下記をThisWorkbookにコピーで問題なく削除できました。 Sub 名前を一括削除するマクロ() For Each objName In ActiveWorkbook.Names objName.Delete Next End Sub 質問者さんのマクロと相違するところが無いでしょうか?

wenlazy
質問者

お礼

私も以前使っていたPCでは問題なく動きました。 最近PCを取り替えて、その後エラーが出るようになってしまいました。 以前の条件はWindows2000+Excel2000です。

  • venzou
  • ベストアンサー率71% (311/435)
回答No.1

For Each ループで使用中のコレクションの内容を消すのがまずいのでは? 後から消してみてください。 Sub test() Dim i as Long For i = ActiveWorkbook.Names.Count To 1 Step -1 ActiveWorkbook.Names(i).Delete Next End Sub

wenlazy
質問者

お礼

試してみましたが、同じエラーでした。 名前を消そうとしているエクセルシートが、 特殊な状態になっています。 もし、ご迷惑でなければ該当のエクセルファイルをメールで送らせて頂いてみていただく訳に行きませんでしょうか?

関連するQ&A