Excel VBA 質問スレッド №1110 (解決済)
shape 図形処理時のエラー処理
投稿者 : ぼさろ 投稿日時 : 2022/11/13(Sun) 05:48:00 OS : 未指定 EXCEL : 未指定
セル内容を含んだ複数図形をマクロで作成して、別の作業者に選別してもらって必要な物だけ移動し、いらないものは
下記のマクロで、いらない図形が残っているエリア(Range(B3:B50))の図形を一括で除去を行っています。
図形がある場合は下記のマクロでも問題無いのですが、図形が無い状態でマクロを実行してしまった場合、右端のセルのB50に
セル移動?見たいな処理がかかる様でシート内にズレが生じる様です。
数値を扱う処理であれば 変数=0であれば 処理を止めるの記述で対処できるのですが 図形の場合(Shape)の場合、エラーで
怒られて同様な対処ができません。
図形(Shape)に対しての知識が無く、下記のマクロもネット内のHP等の内容を自分の作業当てはめて利用している為、全然理解に及んで
いません。
下記のマクロの場合で、エリアに図形がない場合にはなにもさず処理を終える方法をご教授お願いします
セル内容を含んだ複数図形をマクロで作成して、別の作業者に選別してもらって必要な物だけ移動し、いらないものは
下記のマクロで、いらない図形が残っているエリア(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です
入力漏れました。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
>図形が無い状態
図形がないときは、コードで何も選択(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は適用できない様です。この場合はどの様な対処がよいのでしょうか?
■[返信 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"となっています。
図形を選択していれば、ちがう結果になるでしょう。
>図形がない場合は、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が何になっていると良いので
でしょうか?
■[返信 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"となっています。
>このエリア指定方法で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が有無判定をする場合、どのように式を書くのでしょうか?
■[返信 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」がセルなのか図形なのか判断して、処理を変えればいいでしょう。
>最小に投稿したマクロで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」ではなく、式でもありませんが、こんな感じにします。
ちなみに、最初のご質問が「エリアに図形がない場合にはなにもさず処理を終える方法」とのことでしたのでそれに沿った回答をしましたが、
「いらない図形が残っているエリア(Range(B3:B50))の図形を一括で除去」であれば図形を選択する必要はなく、
見つけた(範囲内にあると判定された)ときに削除してしまえばいいです。
>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 )