Excel VBA 質問スレッド №1110 (解決済)

shape 図形処理時のエラー処理

投稿者 : ぼさろ     投稿日時 : 2022/11/13(Sun) 05:48:00     OS : 未指定     EXCEL : 未指定
セル内容を含んだ複数図形をマクロで作成して、別の作業者に選別してもらって必要な物だけ移動し、いらないものは
下記のマクロで、いらない図形が残っているエリア(Range(B3:B50))の図形を一括で除去を行っています。
図形がある場合は下記のマクロでも問題無いのですが、図形が無い状態でマクロを実行してしまった場合、右端のセルのB50に
セル移動?見たいな処理がかかる様でシート内にズレが生じる様です。
数値を扱う処理であれば 変数=0であれば 処理を止めるの記述で対処できるのですが 図形の場合(Shape)の場合、エラーで
怒られて同様な対処ができません。
図形(Shape)に対しての知識が無く、下記のマクロもネット内のHP等の内容を自分の作業当てはめて利用している為、全然理解に及んで
いません。
下記のマクロの場合で、エリアに図形がない場合にはなにもさず処理を終える方法をご教授お願いします


Sub area_del()

Dim C As Shape
For Each C In ActiveSheet.Shapes
  
  If Not Intersect(C.TopLeftCell, Range("B3:B50")) Is Nothing _
          And Not Intersect(C.BottomRightCell, Range("B3:B50")) Is Nothing Then
        C.Select False
  End If
Next C

Selection.Delete

End Sub

スポンサーリンク
[返信 1] Re : shape 図形処理時のエラー処理
投稿者 : ぼさろ     投稿日時 : 2022/11/13(Sun) 05:55:43
入力漏れました。OS windows10 Excel2016です

[返信 2] Re : shape 図形処理時のエラー処理
投稿者 : さんこう     投稿日時 : 2022/11/13(Sun) 07:14:46
>図形が無い状態

図形がないときは、コードで何も選択(Select)しないので、
元々選択されていたシート上のセルが「Selection」に
なり、それをDeleteしているのでしょう。
それを利用して判断することができるでしょう。

参考になれば。

<vba selection 種類>
https://www.google.com/search?q=vba+selection+%E7%A8%AE%E9%A1%9E

[返信 3] Re : shape 図形処理時のエラー処理
投稿者 : ぼさろ     投稿日時 : 2022/11/14(Mon) 22:07:02
■[返信 2] さんこうさん(2022-11-13 07:14:46)の記事
> >図形が無い状態

> 図形がないときは、コードで何も選択(Select)しないので、
> 元々選択されていたシート上のセルが「Selection」に
> なり、それをDeleteしているのでしょう。
> それを利用して判断することができるでしょう。

> 参考になれば。

> <vba selection 種類>
> https://www.google.com/search?q=vba+selection+%E7%A8%AE%E9%A1%9E


さんこう様 返信ありがとうございます
会社でないと試せ無いため時間が空きました。すみません。
参考のサイトを読み、図形がない場合は、typenameがrangeになっていると思い、下記の様に 先頭に判断して行うIFを追加して
無かったら抜ける様に追加してみたのですが 図形(picture)を置いた状態、無い状態 両方で試してみても Range(B1)に抜けるを
選択してうまく動きません。セレクトした範囲に、オートシェイプある場合はtypeがrangeでは無くなり、オートシェイプが無い場合はtypeが
rangeになるは理解できたのですが、picteueは適用できない様です。この場合はどの様な対処がよいのでしょうか?


Sub area_del()

Dim v As Variant
Dim sType As String

Range("B3:B50").Select

Set v = Selection

sType = TypeName(v)

If sType = "Range" Then

Range("B1").Select

Exit Sub

Else

Range("B2").Select

End If

Dim C As Shape
For Each C In ActiveSheet.Shapes
  
  If Not Intersect(C.TopLeftCell, Range("B3:B50")) Is Nothing _
          And Not Intersect(C.BottomRightCell, Range("B3:B50")) Is Nothing Then
        C.Select False
  End If
Next C

Selection.Delete

End Sub

[返信 4] Re : shape 図形処理時のエラー処理
投稿者 : さんこう     投稿日時 : 2022/11/14(Mon) 22:26:50
>図形がない場合は、typenameがrangeになっていると思い

おっしゃるとおりで、セルだけを選択している状態なので、TypeNameが"Range"となっています。

図形を選択していれば、ちがう結果になるでしょう。

[返信 5] Re : shape 図形処理時のエラー処理
投稿者 : ぼさろ     投稿日時 : 2022/11/14(Mon) 22:41:59
■[返信 4] さんこうさん(2022-11-14 22:26:50)の記事
> >図形がない場合は、typenameがrangeになっていると思い

> おっしゃるとおりで、セルだけを選択している状態なので、TypeNameが"Range"となっています。

> 図形を選択していれば、ちがう結果になるでしょう。


このエリア指定方法でpicteureが有る事を判断基準にした場合は、typenameが何になっていると良いので
でしょうか?

[返信 6] Re : shape 図形処理時のエラー処理
投稿者 : さんこう     投稿日時 : 2022/11/14(Mon) 23:20:48
>このエリア指定方法でpicteureが有る事を判断基準にした場合

意味がわかりません。

繰り返しになりますが、セルを選択した範囲に図形があったとしても、セルを選択しただけなのでTypeNameが"Range"となっています。

[返信 7] Re : shape 図形処理時のエラー処理
投稿者 : ぼさろ     投稿日時 : 2022/11/15(Tue) 00:06:21
■[返信 6] さんこうさん(2022-11-14 23:20:48)の記事
> >このエリア指定方法でpicteureが有る事を判断基準にした場合

> 意味がわかりません。

> 繰り返しになりますが、セルを選択した範囲に図形があったとしても、セルを選択しただけなのでTypeNameが"Range"となっています。


最小に投稿したマクロでB3:B50のセル範囲の図形を消せているのでセルの選択(範囲)の方法には問題無いと思うのですが。

さんこうさんの場合は B3:B50にセル範囲内(指定)してpictureが有無判定をする場合、どのように式を書くのでしょうか?

[返信 8] Re : shape 図形処理時のエラー処理
投稿者 : さんこう     投稿日時 : 2022/11/15(Tue) 06:05:58
>最小に投稿したマクロでB3:B50のセル範囲の図形を消せているのでセルの選択(範囲)の方法には問題無いと思うのですが。

図形が消えるのは、セル範囲内の図形を選択しているからであって、セル範囲を選択しても図形を消せません。


>B3:B50にセル範囲内(指定)してpictureが有無判定をする場合

PCが手元にないので、コードは後ほど。

その前に、最初に回答した↓ですが、補足しておきます。
>図形がないときは、コードで何も選択(Select)しないので、
>元々選択されていたシート上のセルが「Selection」になり、それをDeleteしているのでしょう。
>それを利用して判断することができるでしょう

最初のコードの6~10行で、指定のセル範囲内にある図形を選択しています。
そして、コードの12行にある「Selection.Delete」が図形を消しています。

このときにセル範囲内に図形があれば「Selection」は図形になりますが、図形がないときはセルのまま(コードを
実行する前に選択されていたセル)なので、「Selection.Delete」でセルが削除されます。

なので、「Selection」がセルなのか図形なのか判断して、処理を変えればいいでしょう。

[返信 9] Re : shape 図形処理時のエラー処理
投稿者 : さんこう     投稿日時 : 2022/11/15(Tue) 08:21:56
>B3:B50にセル範囲内(指定)してpictureが有無判定をする場合、どのように式を書くのでしょうか?

「picture」ではなく、式でもありませんが、こんな感じにします。

Sub 図形有無判定()
    Dim C As Shape
    Dim f As Boolean
    Dim r As Range
    
    Set r = Range("B3:B50")
    f = False
    For Each C In ActiveSheet.Shapes
        If Not Intersect(C.TopLeftCell, r) Is Nothing And Not Intersect(C.BottomRightCell, r) Is Nothing Then
            f = True
            Exit For
        End If
    Next C
    
    If f Then
        MsgBox "図形があります"
    Else
        MsgBox "図形がありません"
    End If
End Sub


ちなみに、最初のご質問が「エリアに図形がない場合にはなにもさず処理を終える方法」とのことでしたのでそれに沿った回答をしましたが、
「いらない図形が残っているエリア(Range(B3:B50))の図形を一括で除去」であれば図形を選択する必要はなく、
見つけた(範囲内にあると判定された)ときに削除してしまえばいいです。

[返信 10] Re : shape 図形処理時のエラー処理
投稿者 : ぼさろ     投稿日時 : 2022/11/15(Tue) 21:39:23
さんこう様 返信ありがとうございます。
判定を行って進めていく形で組んだ事がなかったので今回は大変勉強になりました。ありがとうございました。

当掲示板について
  • Excel VBA に関する掲示板です。Excel VBA に関する質問や疑問、それに対する解決方法など気軽に投稿してください。
  • 記事内ではHTMLのタグは使用できません。
  • 記事は一度投稿すると修正できません。内容を訂正したい場合は返信で対応してください。
  • Sub〜End Sub、Function〜End Function は自動的にプログラムコードとみなし、枠で囲って見やすくします。
  • Excel VBA とは関係ないことや、他人が不快に思うようなことなど、管理人が適当でないと判断した記事は削除する場合があります。
スポンサーリンク
返信入力フォーム
お 名 前  :
内  容   :

ステータス  :

認証コード  : キャプチャ画像 




( 処理日時 : 2025-09-22 03:54:37 )
タイトルとURLをコピーしました