質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

1回答

11128閲覧

宣言の重複についてのエラー

ice930

総合スコア99

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2020/08/10 14:04

選択されているセルの範囲内にある画像を消去しようとサイトを探していたところ、以下のサイトを見つけました。
https://www.relief.jp/docs/018407.html

そこに書いてあるコードを実行すると「同じ適用範囲内で重複しています」となります(以下がそのコードです)

Sub 画像削除() If TypeName(Selection) <> "Range" Then Exit Sub Dim rng As Range Set rng = Range(shp.TopLeftCell, shp.BottomRightCell) Dim shp As Shape For Each shp In ActiveSheet.Shapes If Not (Intersect(rng, Selection) Is Nothing) Then shp.Delete End If Next End Sub

Dim shp As Shapeがエラーとして表示されるのですが、他にshpという宣言が見当たりません。

宣言より前に「 Set rng = Range(shp.TopLeftCell, shp.BottomRightCell)」
というコードがあるのですが、ここに使われている「shp」は関係あるのでしょうか。

解説いただけると非常にうれしいです・
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meg_

2020/08/10 14:18

質問のコードを実行すると、「Set rng = Range(shp.TopLeftCell, shp.BottomRightCell)」の部分で「変数が定義されてません」のコンパイルエラーが出ます。質問のコード以外にコードがあるのでしたらそちらも掲載してください。
ice930

2020/08/10 14:34

題名の「画像削除」以外は全てサイトに掲載されていたコードです。 前後にコードは作成しておらず、独立して動かしています。
guest

回答1

0

ベストアンサー

Set rng = Range(shp.TopLeftCell, shp.BottomRightCell) の位置がおかしいですね。
下記でエラーなく動作します。

vba

1Sub 選択されているセル範囲内の図形を削除する() 2 If TypeName(Selection) <> "Range" Then Exit Sub 3 4 Dim shp As Shape 5 For Each shp In ActiveSheet.Shapes 6 Dim rng As Range 7 Set rng = Range(shp.TopLeftCell, shp.BottomRightCell) 8 9 If Not (Intersect(rng, Selection) Is Nothing) Then 10 shp.Delete 11 End If 12 Next 13End Sub

以下、質問とは直接関係ない蛇足ですが、

モジュールの先頭に、
Option Explicit
を宣言して、変数宣言を強制するようにしましょう。
そのうえで、[デバッグ]-[コンパイル]をクリックすると、「変数が定義されてません。」のコンパイルエラーが出て、該当コードが選択されます。
実行する前に間違いが分かります。

Office TANAKA - 今さら聞けないVBA[Option Explicitって何?]

Option Explicit が宣言されていない場合、
変数を宣言せずに使うことができます。
実際は、変数を使用すると同時に、VBAくんが裏で自動で宣言してくれてるわけです。
で、その後で、同じ変数を Dim で宣言すると、同じものが既に宣言されていることになるので「同じ適用範囲内で重複しています」エラーになるわけです。

下記も目を通しておくといいでしょう。

Office TANAKA - 今さら聞けないVBA[変数って宣言しなくちゃいけないの?]

投稿2020/08/10 14:20

編集2020/08/10 14:38
hatena19

総合スコア34075

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ice930

2020/08/10 14:45

作動しました!ありがとうございます! 無限ループになっていたので ElseIf shp = "" Then Exit For を追加したのですが、「プロパティまたはメソッドをサポートしていません」となってしまいました。 削除対象の画像が存在しない場合は、「shp = ""」で表現不可でしょうか
ice930

2020/08/10 14:50

先にshpが使われていたので,VBAが勝手に宣言していたというわけですね! すごくわかりやすいです!ありがとうございます。 Option Explicitを宣言することで、「VBAが勝手に宣言するのを防止する」というとらえ方で間違いないでしょうか
hatena19

2020/08/10 20:25

「VBAが勝手に宣言するのを防止する」 そういうことになりますね。 無限ループですが、回答のコードで無限ループになることはないです。 For Each は Shapes内の画像や図形の数だけしか繰り替えられないので。 画像・図形の数が無限にないかりぎ無限ループにはなりません。
ice930

2020/08/11 14:04

無限ループの件、ステップインを何回も押しているのを無限ループと勘違いしていました。 申し訳ありません。 回答ありがとうございました! すごく分かり易かったです。知識が増えました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問