[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『特定範囲の図形の削除』(りょうま)
お世話になります。A列〜E列にある図形(オートシェイプ)の削除をしたいのですが、以下で行うと「指定したコレクションに対するインデックスが境界を越えている」となります。わかりやすくご教示いただけると幸いです。
今のところ、A〜E列には5個の図形、F列には1つの図形(オートシェイプ)があります。よろしくお願いいたします。
Sub test()
Dim i As Long
Dim myIntersect As Range
With ActiveSheet
For i = 1 To .Shapes.Count Set myIntersect = Intersect(.Shapes(i).TopLeftCell, .Columns("A:E")) If myIntersect Is Nothing Then MsgBox "なにもありません" Else .Shapes(i).Delete End If Next i End With
End Sub
< 使用 Excel:Microsoft365、使用 OS:Windows11 >
For i = .Shapes.Count To 1 Step -1 のようにしないと、図形削除によって順序に不整合が生じることが原因じゃないですか?
# 範囲外のときのメッセージがこれでよいのか、とか
# Autoshapeであることの確認が必要じゃないかとか。(入力規則やメモやいろいろな変種のShapeがあります)
# 気になるところはありますが。
(abc) 2023/03/01(水) 09:53:24
シェイプの数で制御ではなくシェイプそのものを扱うのではどうだろうか? Sub test() Dim i As Integer Dim WK_Shape As Shape Dim myIntersect As Range With ActiveSheet For Each WK_Shape In .Shapes Set myIntersect = Intersect(WK_Shape.TopLeftCell, .Columns("A:E")) If Not myIntersect Is Nothing Then WK_Shape.Delete i = i + 1 End If Next End With If i = 0 Then MsgBox "なにもありません" End If
(ねむねむ) 2023/03/01(水) 10:16:21
End Sub のコピーし忘れていた。 最後に付け加えておいてくれ。 (ねむねむ) 2023/03/01(水) 10:21:51
おっしゃるとおりですね。forの書き方はもちろん、それ以外にも検討すべきことがありました。アドバイスを元に修正ができました。ありがとうございました。
ねむねむさん
いただいたコードでできました。ありがとうございます。一つだけ教えてください。このiの働きとはなんでしょうか?個数?i = i + 1以外にiが登場する場所がなく、???なのです。
(りょうま) 2023/03/01(水) 15:24:19
図形を削除した回数を数えておいて最後にその回数が0だった場合にメッセージを出すため。
最初のものだと図形を削除していてもメッセージが出るため、一回も削除をしていない場合にだけ表示させるために 使っている。
と書いていて、削除したかしないかの判断なのでBoolean型でとっておいてあらかじめ Trueを代入して起き、削除をしたらFalseを代入、最後にTrueならばメッセージ表示、 のほうが良かったかも。 (ねむねむ) 2023/03/01(水) 15:31:09
わたし、For Nextと勘違いをしておりました。本当にごめんなさい。ご説明も理解できました!!ありがとうございました。
(りょうま) 2023/03/01(水) 17:03:31
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.