【本日のミッション】
エクセルの選択しているセル範囲の写真を削除せよ。
目次
ミッションの概要
エクセルの選択しているセル範囲の写真を削除することが、今回のミッションです。
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
s
プロシージャ
選択セル範囲の写真を削除するシートをアクティブにした状態で、Alt+F11でVsual Basic Editerを起動します。
[挿入]-[標準モジュール]で新規モジュールを作成し、下記の通りコードを記入します。
Sub 選択セル上の写真削除()
'【変数】
Dim ran As Range '写真配置セル
Dim shp As Shape 'オブジェクト
'■セルを選択しているか確認
If TypeName(Selection) <> "Range" Then
Exit Sub
End If
'■アクティブシートのオブジェクトを順に処理
For Each shp In ActiveSheet.Shapes
'■オブジェクトが画像か判定
If shp.Type = msoPicture Or shp.Type = msoLinkedPicture Then
'■画像配置セルを変数ranにセット
Set ran = Range(shp.TopLeftCell, shp.BottomRightCell)
'■画像配置セルと選択セルが重なっていたら画像を削除
If Intersect(ran, Selection) Is Nothing = False Then
shp.Delete
End If
End If
Next
End Sub
記入したプロシージャ(Sub~End Subまで)のどこかにカーソルを置いてF5キーをクリックしてください。
選択セル範囲にある写真が全て削除されます。
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
Intersectメソッド
引数に指定した、複数のセル範囲の重なっているRangeオブジェクトを返します。
重なりがない場合は「Nothing」を返します。
Intersect(セル範囲1, セル範囲2, ・・・, セル範囲30)
引数 | 説明 | 省略 |
セル範囲1 | セル範囲 (Range オブジェクト) を指定します。 | |
セル範囲2 | セル範囲 (Range オブジェクト) を指定します。 | |
セル範囲3~セル範囲30 | セル範囲 (Range オブジェクト) を指定します。 | 〇 |
引数に指定したセル範囲に重なっている部分がある場合は、Rangeオブジェクトを返します。
重なっているセル範囲のアドレスを調べるには、下記例のようにAddressプロパティを使います。
MsgBox Intersect(Range("B3:E10"), Range("E10:F12")).Address
引数に指定したセル範囲に重なっている部分がない場合は、「Nothing」を返します。
「Nothing」を返しているかを調べるには、下記例のように「Is Nothing」を後ろにつけます。「True」となったら「重なるセル範囲は無い」と判断します。
MsgBox Intersect(Range("B3:E10"), Range("F11:G13")) Is Nothing
←重なるセル範囲は無い
逆に、「False」となるときは「重なるセル範囲はある」と判断します。
MsgBox Intersect(Range("B3:E10"), Range("E10:F12")) Is Nothing
←重なるセル範囲はある
今回は、画像配置セルの変数「ran」と、選択しているセル「Selection」で、重なっているセル範囲があるかどうか判定しています。
シート内に複数のオブジェクトがあるので、For Eachを使って順に処理していきます。「If shp.Type = msoPicture Or shp.Type = msoLinkedPicture Then」で画像のみを処理するようにしています。
1つ目の画像のセル範囲「ran」と選択セル「Selection」に重なりがある場合は、画像を削除します。
2つ目以降の画像のセル範囲「ran」も順に選択セル「Selection」に重なりがあれば、画像を削除していきます。
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
セルを選択しているか確認 TypeName関数
引数に指定した値の情報を返します。
TypeName(値)
今回は選択しているものが「セル」かどうかを判定しています。
セルを選択している場合、「Range」を返します。画像オブジェクトを選択している時は「Picture」を返します。
If TypeName(Selection) <> "Range" Then
For Eachとは
For Each 変数 In コレクション ***処理*** Next 変数
とすることで、コレクションの中にあるもの1つ目から順に変数に入れて、Nextまでの処理を行い、コレクション内にあるもの全ての処理が終わったらNext以降の処理に移ります。
ActiveSheet.Shapesアクティブシート内のShapeコレクションオブジェクト全てのことです。その1つ目から順に変数「shp」として処理していきます。
全てのShapeコレクションオブジェクトの処理が済んだら、For Eachを抜けて次の処理に移ります。
Dim shp As Shape 'オブジェクト For Each shp In ActiveSheet.Shapes ***shpを使用する処理*** Next shp
Shape.Typeプロパティ
Shapeオブジェクトが、どの種類のオブジェクトか判定するのに、下記Typeプロパティを使用します。使用頻度の高いTypeのみ記載しておきます。
定数 | 値 | 説明 |
msoAutoShape | 1 | 図形・オートシェイプ |
msoCallout | 2 | 吹き出し |
msoChart | 3 | グラフ |
msoComment | 4 | コメント |
msoFreeform | 5 | フリーフォーム |
msoGroup | 6 | グループ化された図形 |
msoFormControl | 8 | フォームコントロール |
msoLine | 9 | 線 |
msoLinkedPicture | 11 | リンク画像 |
msoPicture | 13 | 画像 |
msoTextBox | 17 | テキストボックス |
msoCanvas | 20 | 描画キャンバス |
msoSmartArt | 24 | スマートアート |
今回はShapeオブジェクトのタイプが、画像「msoPicture」または、リンク画像「msoLinkedPicture」かどうか判定しています。
If shp.Type = msoPicture Or shp.Type = msoLinkedPicture Then
画像が配置されているセル範囲の取得 TopLeftCell・BottomRightCell
TopLeftCellは、Shapeオブジェクトの左上のセルを取得します。
BottomRightCellは、Shapeオブジェクトの右下のセルを取得します。
Shapeオブジェクト.TopLeftCell Shapeオブジェクト.BottomRightCell
TopLeftCellとBottomRightCellを使って、画像が配置されているセル範囲を取得することができます。
下記例は、雪だるまの写真を変数「shp」として処理しています。
MsgBox Range(shp.TopLeftCell, shp.BottomRightCell).Address
画像配置セルを変数にセット Setステートメント
今回は可読性を上げるために、画像が配置されているセル範囲を変数ranにセットしています。
Rangeオブジェクトをセットする変数は、あらかじめ「Range」のデータ型で宣言しておきます。Setステートメントで、変数にRangeオブジェクトをセットすることができます。
Dim Rangeオブジェクト変数 As Range
Set Rangeオブジェクト変数 = Rangeオブジェクト
下記は、Rnageオブジェクト変数ranに、セル範囲 Range(shp.TopLeftCell, shp.BottomRightCell)をセットしています。
Dim ran As Range Set ran = Range(shp.TopLeftCell, shp.BottomRightCell)
参照
系列が1つのグラフを自動大量連続作成(Excel VBA)
「実行時エラー 1004」を出さずに、ワークシート内のグラフを「グラフ 元」以外全て削除(Excel VBA)
グラフの参照先を変えると勝手にグラフの色が変わる現象を解決せよ
系列が複数あるグラフを自動大量連続作成(Excel VBA)
n行毎の改ページ設定 「実行時エラー1004 RangeクラスのPageBreakプロパティを設定できません」の原因(Excel VBA)
参照データ数が異なる・参照先が変動する月別グラフを自動大量連続作成(Excel VBA)
複数系列・参照データ数が異なる・参照先が変動する月別グラフを自動大量連続作成(Excel VBA)
大量の画像やグラフ等のオブジェクトで画面表示が遅いのを解決(Excel)
エクセル シートに画像が存在するかどうか(有無)を調べる方法(Excel VBA)
エクセルシート上 全てのオブジェクト(画像・図形・グラフ等)を選択し、削除する(Excel VBA)
エクセルシート上のオブジェクト(図形・画像・グラフ等)の件数を数える方法(Excel VBA)
エクセル シートにグラフが存在するかどうか(有無)を調べる方法(Excel VBA)
エクセル シートに図形が存在するかどうか(有無)を調べる方法(Excel VBA)
エクセル 選択しているセル範囲に写真が存在しているか(有無)を確認(Excel VBA)
エクセル 選択しているセル範囲にグラフが存在しているか(有無)を確認(Excel VBA)
エクセル 選択しているセル範囲に図形が存在しているか(有無)を確認(Excel VBA)
エクセル 選択セル範囲の写真を削除する(Excel VBA)
エクセル 選択セル範囲のグラフを削除する(Excel VBA)
エクセル 選択セル範囲の図形を削除する(Excel VBA)
Excel VBAでワードを起動して文字を入力操作(Excel VBA)
Excel VBAでワードを起動してエクセルの表をワードに貼付け(Excel VBA)
Excel VBAでワードを起動して エクセルのエクセルの表を図としてワードに貼付け(Excel VBA)
Word コピー貼付けした図が白い枠だけ?図が表示されない現象を解決
Excel VBAでワードを起動して グラフをワードに図として貼付け(Excel VBA)