[[20100528140459]] 『図形の消去』(ひっぽ) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『図形の消去』(ひっぽ)
 マクロで図形を消そうと思い、マクロ作りました。
 今のところ2つの図形があるのですが、
 後々のことを考え、For Nextステートメントで構成させようと思っています。

 Sub DeleteShape()
   Dim ShapeCount As Long, i As Long
   ShapeCount = ActiveSheet.Shapes.Count
   For i = 1 To ShapeCount 
     ActiveSheet.Shapes(i).Delete
   Next
 End Sub

 これを実行すると1つ目は消去されるのですが、
 2つ目が残ったままです。(エラーで止まります)
 調べると、どうやら、Shapes(1)とShapes(3)が
 存在しているらしく、ForではShapes(2)となり
 ひっかかるようです。

 Shapes.Delete とすれば一括消去でもできるのかなと思ったのですが、
 甘かったようです…
 Shape番号がランダムの場合、どのようにすれば全てを消去できるのでしょうか?

 よろしくお願いします。

[[20060613111253]] 9414
『オブジェクトの削除』(はり)

(ブラックバード)


 自己解決…と思い、消そうと思ったら書き込みが…
 ブラックバードさん、ありがとうございます。

 一応、解決内容を載せておきます。

 Sub DeleteShape()
   Dim ShapeCount As Long, i As Long
   ShapeCount = ActiveSheet.Shapes.Count
   For i = 1 To ShapeCount
     ActiveSheet.Shapes(1).Delete
   Next
 End Sub

 ActiveSheet.Shapes(i).Delete 「i」ではなく
 ActiveSheet.Shapes(1).Delete 「1」にしたら順番に消していってくれました。

 ひっぽ より

ActiveSheet.Shapes.SelectAll

Selection.Delete


 削除や図形全選択は、
 ブラックバードさんがご紹介のスレッドにある川野鮎太郎さんの回答のように

 Activesheet.DrawingObjects.Delete

 とした方が要らぬ問題が起こらないので参考にしてください。

 因みに

 ActiveSheet.Shapes.SelectAll 

 これもコメントや入力規則のリストが同じシートにあると、エラーになります。

 図形を扱う場合は、ShapeとDrawingObjectsをうまく使い分けるのがよいですよ!!

 ichinose


 こちらの掲示板を見て、勉強させて頂いております者です。
 私も図形の一括消去について興味があったので大変勉強になりました。
 ありがとうございます。
 ところで、少し横ですが、疑問点があるので教えて頂けますか?
 別スレを立てるべき所(ひっぽ)さん横からすいません。少しお借りします。

 >ActiveSheet.Shapes(i).Delete 「i」ではなく
 >ActiveSheet.Shapes(1).Delete 「1」にしたら順番に消していってくれました。

 これだと、カウンタ変数の意味がないというか
 常に、Shapes(1)を削除することを繰り返す?だけですよね?

 そもそも、
 >どうやら、Shapes(1)とShapes(3)が
 >存在しているらしく、ForではShapes(2)となり
 >ひっかかるようです。

 とあるように、存在しない場合はエラーが出るのですよね?
 常に、Shapes(1)を削除するという事は
 2回目に実行するときは、既にShapes(1)は存在しないので
 エラーになるような気がするのですが

 なにか、間違っている部分がありますか?
 というか、違ってるから解決したわけで(汗)

 今後の勉強のため
 解説をしていただける方がいらしたらお願いします。

 (dayan)

 


 ShapeCountを繰り返しているのでShapes(1)が削除されたら
 最初のカウントではShapes(2)だったものがShapes(1)になっているだけでは
 

 >2回目に実行するときは、既にShapes(1)は存在しないので
 >エラーになるような気がするのですが
 既に投稿があるとおりですが、だるま落としを想像するとわかりやすいかなあ・・・。


 一番下という位置には、紫の円柱を木槌で飛ばしても、次は、白い円柱が一番下という位置に来ますからね!!

 Shapesのインデックスも同じなんです。

 もっともあまりこのようなコードは私は見かけませんけどね!!

 Sub test()
    Dim shp As Shape
    For Each shp In ActiveSheet.Shapes
       shp.Delete
    Next
 End Sub
 よく見かけるのは、こっちかなあ・・・。

 但し、前投稿でも書きましたが、削除の場合、Shapeオブジェクトを使うのは要注意ですよ!!
 入力規則のリストの下矢印やコメント(オートフィルタの項目名の箇所に表示される下矢印も)もShapesに含まれてしまいます。

 Excel2002では、オートフィルタは復活できますが、入力規則のリストのそれは、復活できません。
 又、コメントに至っては、削除後、そのセルを選択すると異常終了する場合もありました。Excel2002で確認。

 For文でループさせて削除する場合も

 Sub test2()
    Dim drw As Object
    For Each drw In ActiveSheet.DrawingObjects
       drw.Delete
    Next
 End Sub

 これが良いと思いますよ!!
 どうしてもShapeオブジェクトで行いたいなら、

 Sub test3()
    Dim shp As Shape
    Dim drw As Object
    On Error Resume Next
    For Each shp In ActiveSheet.Shapes
       shp.DrawingObject.Delete
    Next
    On Error GoTo 0
 End Sub

 こんな方法も考えられますが、test2とtest3では、ちょっと仕様が違いますから、注意してください。

 ichinose


 ichinose さん
 丁寧な解説ありがとうございます。

 >図形を扱う場合は、ShapeとDrawingObjectsをうまく使い分けるのがよいですよ!!
 今後、使い分けを心がけるようにします。

 ひっぽ より

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.