動画でExcel タイトル
動画版「マクロ講座」です。
今回は、Shapes(オートシェイプや図)を削除するの後編です。
内容は、
1.図形をタイプで削除する
2.名前では判定して削除する
3.ユーザーに聞いて削除するか決めるマグロ
4.シート上のすべての図形の名前を取得するマクロ
となります。削除対象をセル範囲で限定できない場合には、タイプや名前や個別に判断して削除するというマクロを使うと便利です。
(サンプルファイルは、こちらです。 図を名前やタイプで削除、サンプル81回)
VBAでShapeを扱う時には、そのタイプが何かを知らないといけません。下記図で確認してください。
吹き出しならmsocallout、コメントならmsocomment、直線ならmsoLineというように指定します。

MsoShapeTypeについて
| 名前 | 値 | 説明 |
|---|---|---|
| msoShapeTypeMixed | -2 | 図形の種類の組み合わせ |
| msoautoshape | 1 | オートシェイプ |
| msocallout | 2 | 吹き出し |
| msochart | 3 | グラフ |
| msocomment | 4 | コメント |
| msoFreeform | 5 | フリーフォーム |
| msogroup | 6 | グループ化された図形 |
| msoEmbeddedOLEObject | 7 | 埋め込み OLE オブジェクト |
| msoformcontrol 返さ | 8 | フォームコントロール |
| msoLine | 9 | 直線 |
| msoLinkedOLEObject | 10 | リンク OLE オブジェクト |
| msoLinkedPicture | 11 | リンク画像 |
| msoOLEControlObject | 12 | ActiveXコントロール |
| msoPicture | 13 | 画像 |
| msoplaceholder | 14 | プレースホルダー |
| msoTextEffect | 15 | テキスト効果 |
| msoMedia | 16 | メディア |
| msotextbox | 17 | テキスト ボックス |
| msoscriptanchor | 18 | スクリプト アンカー |
| msotable | 19 | 表 |
| msocanvas | 20 | トリミング |
| msodiagram | 21 | 図表 |
| msoink | 22 | インク |
| msoinkcomment | 23 | インク コメント |
| msoSmartArt | 24 | SmartArt グラフィック |
| msowebvideo | 26 | Web ビデオ |
| msocontentapp | 27 | コンテンツ Office アドイン |
| msographic | 28 | グラフィック |
| msoLinkedGraphic | 29 | リンクされたグラフィックス |
| mso3DModel | 30 | 3d モデル |
| msoLinked3DModel | 31 | リンクされた3d モデル |
msoPictureを削除するというマクロを実行してみます。

Sub delType_picture() 'シート内の画像のみ削除する
Dim sh As Shape
For Each sh In ActiveSheet.Shapes
If sh.Type = msoPicture Then
sh.Delete
End If
Next
End Sub
msoPictureの画像だけを消すことができました。

つづいて、テキストボックスだけ削除するコードです。

Sub delType_TextBox() 'シート内のmsoTextBoxのみ削除する
Dim sh As Shape
For Each sh In ActiveSheet.Shapes
If sh.Type = msoTextBox Then
sh.Delete
End If
Next
End Sub
次のコードは、シート内のフォームコントロールボタンを削除する場合のコードです。

Sub delType_Form() 'シート内のFormのみ削除する
Dim sh As Shape
For Each sh In ActiveSheet.Shapes
If sh.Type = msoFormControl Then
sh.Delete
End If
Next sh
End Sub
隣のActiveXcontrolボタンを削除するなら、次のように指定します。

Sub delType_Activex() 'シート内のmsoOLEControlObjectのみ削除する
Dim sh As Shape
For Each sh In ActiveSheet.Shapes
If sh.Type = msoOLEControlObject Then
sh.Delete
End If
Next sh
End Sub
オートシェイプの〇だけ削除するには、選択すると楕円9のように名前がついています。VBAで書く時は、"Oval*"のように指定することができます。

'名前で削除
Sub eachshapedel_name()
Dim sh As Shape
For Each sh In ActiveSheet.Shapes
If sh.Name Like "Oval*" Then
sh.Delete
End If
Next sh
End Sub
簡単にオートシェイプの名前を知るには、マクロコードを次のように書くことで、イミディエイトウィンドウに表示できます。

' シート上のすべての図形の名前を取得する
Sub shapename()
Dim sh As Shape
For Each sh In ActiveSheet.Shapes
Debug.Print sh.Name
Next sh
End Sub
一番おすすめがこちらのコードです。図形をひとつずつマクロが指定し削除するか聞いてくれるコードにしました。
このマクロだと、ひとつずつのShapeに対して、削除するかをMsgBoxが聞いてくるので、確実に削除したいShapeだけを削除し、残したいShapeを除外することができます。

Sub askDeleteShapes()
Dim sh As Shape, res As Integer
For Each sh In ActiveSheet.Shapes
Range(sh.TopLeftCell, sh.BottomRightCell).Select
res = MsgBox(sh.Name & vbLf & vbLf & _
"この図形を削除してもいいですか?削除ならYES。", vbYesNo, "削除ならYES")
If res = vbYes Then
sh.Delete
End If
Next sh
End Sub