アプリ版:「スタンプのみでお礼する」機能のリリースについて

次のようなマクロを組んで、エクセルファイル上の「名前」を一括削除しようとしています。

For Each objName In ActiveWorkbook.Names
objName.Delete
Next

実行すると
「実行時エラー"1004":その名前は正しくありません」
というエラーになってしまいます。
名前を一括削除する方法、またはエラーの解決方法がわかれば教えてください。

環境:WindowsXP+Excel2003

A 回答 (6件)

こんばんは。

Wendy02です。

>ご迷惑でなければ、該当のファイルをgooのメールに送らせていただいて、見て頂けませんでしょうか?

確か、個人間のやり取りは、ここでは禁止されていたはずなので、申し訳ありませんが、それはできません。

「実行時エラー"1004":その名前は正しくありません」

やっと、そのエラーを確認できました。私は、勘違いをしていました。それは、マクロのコード側からではなくて、Excelのワークシート側からでした。

マクロでは、たぶん削除できないと思いますので、

Sub test3()
Dim objName As Object
For Each objName In Application.Names
   objName.Visible =True
Next
End Sub

としてみて、挿入-名前-定義 で確認して、手動で削除してみてください。
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/12/22 19:23

こんばんは。

Wendy02です。

>一括削除できないのは残念ですが、これで乗り切ります。

これは、特殊なエラーのひとつなのです。通常はありません。

今回、ある程度の確信があって、私も回答はしたのですが、さまざまなケースの中で、以下のような推測をしています。

※ 登録: マクロ(Names.Add)  削除: マクロ(Names(i).Delete)
こちらは、たぶん、問題ありません。
(ただし、マクロとしては、関心しません。理由は、Rangeオブジェクトの中に、変数が使えるからです。変数は一時的だから、そちらのほうがよいです。)

※ 登録: 手動(ワークシート) 削除: マクロ(Names(i).Delete)
  For Each in ....Names でも同じ。

こちらは、問題が起こる可能性があります。おそらく、登録のミスか、登録の際の時間的なロスが、トラブルを起こすか、という想像をしています。
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/12/22 21:27

#1です


>特殊な状態になっています。
>もし、ご迷惑でなければ該当のエクセルファイルをメールで送らせて頂いてみていただく訳に行きませんでしょうか?

私は同じエラーが再現出来なかったので、そのエクセルファイルを拝見してみたいのですが、ここのルール違反になりますので、残念ながらメールでのやり取りは出来ません。
お力になれず、すいませんでした。
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/12/22 19:25

こんにちは。



私のほうの実行時エラーは、"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
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/12/21 23:40

下記をThisWorkbookにコピーで問題なく削除できました。



Sub 名前を一括削除するマクロ()
For Each objName In ActiveWorkbook.Names
objName.Delete
Next
End Sub

質問者さんのマクロと相違するところが無いでしょうか?
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/12/21 23:43

For Each ループで使用中のコレクションの内容を消すのがまずいのでは?



後から消してみてください。
Sub test()
Dim i as Long
For i = ActiveWorkbook.Names.Count To 1 Step -1
ActiveWorkbook.Names(i).Delete
Next
End Sub
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/12/21 23:48

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!