- ベストアンサー
名前を一括削除するマクロ
次のようなマクロを組んで、エクセルファイル上の「名前」を一括削除しようとしています。 For Each objName In ActiveWorkbook.Names objName.Delete Next 実行すると 「実行時エラー"1004":その名前は正しくありません」 というエラーになってしまいます。 名前を一括削除する方法、またはエラーの解決方法がわかれば教えてください。 環境:WindowsXP+Excel2003
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
こんばんは。Wendy02です。 >ご迷惑でなければ、該当のファイルをgooのメールに送らせていただいて、見て頂けませんでしょうか? 確か、個人間のやり取りは、ここでは禁止されていたはずなので、申し訳ありませんが、それはできません。 「実行時エラー"1004":その名前は正しくありません」 やっと、そのエラーを確認できました。私は、勘違いをしていました。それは、マクロのコード側からではなくて、Excelのワークシート側からでした。 マクロでは、たぶん削除できないと思いますので、 Sub test3() Dim objName As Object For Each objName In Application.Names objName.Visible =True Next End Sub としてみて、挿入-名前-定義 で確認して、手動で削除してみてください。
その他の回答 (5)
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。Wendy02です。 >一括削除できないのは残念ですが、これで乗り切ります。 これは、特殊なエラーのひとつなのです。通常はありません。 今回、ある程度の確信があって、私も回答はしたのですが、さまざまなケースの中で、以下のような推測をしています。 ※ 登録: マクロ(Names.Add) 削除: マクロ(Names(i).Delete) こちらは、たぶん、問題ありません。 (ただし、マクロとしては、関心しません。理由は、Rangeオブジェクトの中に、変数が使えるからです。変数は一時的だから、そちらのほうがよいです。) ※ 登録: 手動(ワークシート) 削除: マクロ(Names(i).Delete) For Each in ....Names でも同じ。 こちらは、問題が起こる可能性があります。おそらく、登録のミスか、登録の際の時間的なロスが、トラブルを起こすか、という想像をしています。
お礼
もらった雛形ファイルに既に隠れた「名前」が既にたくさん付いてました。 雛形ファイルだったために増殖してしまって困っていました。 ありがとうございました。
- venzou
- ベストアンサー率71% (311/435)
#1です >特殊な状態になっています。 >もし、ご迷惑でなければ該当のエクセルファイルをメールで送らせて頂いてみていただく訳に行きませんでしょうか? 私は同じエラーが再現出来なかったので、そのエクセルファイルを拝見してみたいのですが、ここのルール違反になりますので、残念ながらメールでのやり取りは出来ません。 お力になれず、すいませんでした。
お礼
ルールをよく読んでいなくて、すいませんでした。 根本解決はしてませんが、何とかなりそうです。 ありがとうございました。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 私のほうの実行時エラーは、"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
お礼
ありがとうございます。 早速試してみたのですが、同じでした。 名前を消そうとしているエクセルファイルが特殊な気がしています。 ご迷惑でなければ、該当のファイルをgooのメールに送らせていただいて、見て頂けませんでしょうか?
- nobu555
- ベストアンサー率45% (158/345)
下記をThisWorkbookにコピーで問題なく削除できました。 Sub 名前を一括削除するマクロ() For Each objName In ActiveWorkbook.Names objName.Delete Next End Sub 質問者さんのマクロと相違するところが無いでしょうか?
お礼
私も以前使っていたPCでは問題なく動きました。 最近PCを取り替えて、その後エラーが出るようになってしまいました。 以前の条件はWindows2000+Excel2000です。
- venzou
- ベストアンサー率71% (311/435)
For Each ループで使用中のコレクションの内容を消すのがまずいのでは? 後から消してみてください。 Sub test() Dim i as Long For i = ActiveWorkbook.Names.Count To 1 Step -1 ActiveWorkbook.Names(i).Delete Next End Sub
お礼
試してみましたが、同じエラーでした。 名前を消そうとしているエクセルシートが、 特殊な状態になっています。 もし、ご迷惑でなければ該当のエクセルファイルをメールで送らせて頂いてみていただく訳に行きませんでしょうか?
お礼
確かに手で消せるようになりました。 ありがとうございました。 一括削除できないのは残念ですが、これで乗り切ります。