Excel VBAで複数の図形のみ一括選択して削除したいときはないでしょうか。
例えば、あるExcelシートに画像など図形以外のオブジェクトが含まれていて、その中から図形のみ選択の上、削除をしたいときなどです。
けど、そんな中で悩むことは、
・基本操作やVBAで効率的に行いたいがやり方がわからない。
ですよね。
今回はそんなお悩みを解決する
Excel VBAで図形のみ一括選択して削除する方法について
まとめます!
もくじ
Excel で図形を削除する基本操作
Excel で図形を削除する基本操作について説明をします。
以下のように図形以外にもチェックボックスや画像など他のオブジェクトが混在しているシートがあり、図形のみ削除をしていきます。
[ホーム]タブから「オブジェクトの選択」を選択する
[ホーム]タブから「オブジェクトの選択」を選択します。
図形のみであれば、「条件を指定してジャンプ」を選択し、選択オプションウインドウの「オブジェクト」を選択し「OK」を押します。
図形の選択ができました。
図形を削除する
削除したい図形を選択したらキーボードのDeleteキーを押します。
削除できましたね。
Excel VBAで複数の図形を選択し、削除する
次はこれまで手動で行ってきた図形の選択と削除をVBAで一度に処理していきます。
処理対象は手動で行ったものと同様です。
シートにあるすべてのオブジェクトから図形のみを選択するVBA
削除を行う上で、シートにあるすべてのオブジェクトから図形のみを選択する処理をおこないます。
VBAは以下の通りです。
Sub 図形のみ一括選択する()
Dim chkBox As Excel.CheckBox
Dim objShape As Object
Dim arr() As String
ReDim Preserve arr(0)
'選択シートに存在するオブジェクトを取得します。
For Each objShape In ActiveSheet.Shapes
arr(UBound(arr)) = objShape.Name
'オブジェクトのタイプが図形であるか判定します。
If objShape.Type = msoAutoShape Then
'図形オブジェクトの名前を配列に追加します。
arr(UBound(arr)) = objShape.Name
'値を保持したまま配列を最大インデックスを追加します。
ReDim Preserve arr(UBound(arr) + 1)
End If
Next
'空の値を削除します。
ReDim Preserve arr(UBound(arr) - 1)
'図形オブジェクトを選択します。
ActiveSheet.Shapes.Range(arr).Select
End Sub
マクロメニューの「図形のみ一括選択する」を選択し、VBAを実行します。
はい、図形のみが選択されましたね。
VBAの説明
For Eachで選択シートに存在するオブジェクトを取得します。
オブジェクトのタイプが図形であるか判定します。
図形オブジェクトの名前を配列に追加します。
定数 | 説明 | 値 |
msoShapeTypeMixed | -2 | |
msoAutoShape | 図形/オートシェイプ | 1 |
msoCallout | 吹き出し | 2 |
msoChart | グラフ | 3 |
msoComment | コメント | 4 |
msoGroup | グループ化された図形 | 6 |
msoLinkedPicture | リンク画像 | 11 |
msoPicture | 画像 | 13 |
msoTextBox | テキストボックス | 17 |
msoTable | 表 | 19 |
値を保持したまま配列を最大インデックスを追加します。
空の値を削除します。
最後に配列にある値の名前委の図形オブジェクトを選択します。
選択した図形のみを選択し削除するVBA
次は選択した図形を削除していきます。
Sub 図形のみ一括選択して削除する()
Dim chkBox As Excel.CheckBox
Dim objShape As Object
Dim arr() As String
ReDim Preserve arr(0)
'選択シートに存在するオブジェクトを取得します。
For Each objShape In ActiveSheet.Shapes
arr(UBound(arr)) = objShape.Name
'オブジェクトのタイプが図形であるか判定します。
If objShape.Type = msoAutoShape Then
'図形オブジェクトの名前を配列に追加します。
arr(UBound(arr)) = objShape.Name
'値を保持したまま配列を最大インデックスを追加します。
ReDim Preserve arr(UBound(arr) + 1)
End If
Next
'空の値を削除します。
ReDim Preserve arr(UBound(arr) - 1)
'図形オブジェクトを選択します。
ActiveSheet.Shapes.Range(arr).Select
'選択オブジェクトを削除します。
Selection.Delete
End Sub
マクロメニューの「図形のみ一括選択して削除する」を選択し、VBAを実行します。
選択した図形が削除されましたね。
VBAの説明
選択までの処理は上記VBAと同様で、
最後に選択オブジェクトを削除する処理を加えています。
赤色の図形のみを選択し削除するVBA
次は図形の塗の色を指定して削除していきます。
RGBカラーコードで指定します。
図形の色は書式設定から確認することができます。
対象の色は赤ですので、RGBは「255.0.0」となります。
赤はRの一番濃い数字ですので255となります。
以下VBAです。
Sub 赤色の図形のみ一括選択して削除する()
Dim chkBox As Excel.CheckBox
Dim objShape As Object
Dim arr() As String
ReDim Preserve arr(0)
'選択シートに存在するオブジェクトを取得します。
For Each objShape In ActiveSheet.Shapes
arr(UBound(arr)) = objShape.Name
'オブジェクトのタイプが図形であるか判定します。
If objShape.Type = msoAutoShape And objShape.Fill.ForeColor.RGB = RGB(255, 0, 0) Then
'図形オブジェクトの名前を配列に追加します。
arr(UBound(arr)) = objShape.Name
'値を保持したまま配列を最大インデックスを追加します。
ReDim Preserve arr(UBound(arr) + 1)
End If
Next
'空の値を削除します。
ReDim Preserve arr(UBound(arr) - 1)
'図形オブジェクトを選択します。
ActiveSheet.Shapes.Range(arr).Select
'選択オブジェクトを削除します。
Selection.Delete
End Sub
Selection.Delete
手前でブレイクして選択されているか確認します。
はい、赤色の図形のみ選択されていますね。
ブレイクをスキップして削除まで実行しましょう。
はい、削除できましたね。
VBAの説明
選択までの処理は上記VBAと同様です。
色の指定を追加しています。
ForeColor.RGBプロパティが赤色の255.0.0であれば選択対象となる条件にしています。
図形の高さを指定して選択した図形を削除するVBA
続いて図形の高さであるサイズを指定して一定サイズ以下であれば削除していきます。
図形の高さはVBAではピクセル単位で指定する必要があります。
右クリックのメニューからサイズは確認することはできますが、
センチメートルの単位となりますので、変換が必要となり少々面倒です。
ですので、以下のVBAでピクセル単位のサイズを調べてみます。
Sub 選択オブジェクトのサイズを調べる()
MsgBox "幅" & Selection.Width & "ピクセル" & vbCrLf & "高さ" & Selection.Height & "ピクセル"
End Sub
今回は一番小さい高さである図形を対象としたいので、その図形を選択して、VBAを実行します。
サイズが表示されましたね。
高さは30.75ピクセルでしたので、31ピクセル以下を条件にサイズを指定し、
図形を削除していきましょう。
以下VBAです。
Sub 高さ指定サイズの図形のみ一括選択して削除する()
Dim chkBox As Excel.CheckBox
Dim objShape As Object
Dim arr() As String
ReDim Preserve arr(0)
'選択シートに存在するオブジェクトを取得します。
For Each objShape In ActiveSheet.Shapes
arr(UBound(arr)) = objShape.Name
'オブジェクトのタイプが図形であるか判定します。
If objShape.Type = msoAutoShape And objShape.Height <= 31 Then
'図形オブジェクトの名前を配列に追加します。
arr(UBound(arr)) = objShape.Name
'値を保持したまま配列を最大インデックスを追加します。
ReDim Preserve arr(UBound(arr) + 1)
End If
Next
'空の値を削除します。
ReDim Preserve arr(UBound(arr) - 1)
'図形オブジェクトを選択します。
ActiveSheet.Shapes.Range(arr).Select
'選択オブジェクトを削除します。
Selection.Delete
End Sub
Selection.Delete
手前でブレイクして選択されているか確認します。
はい、指定サイズの図形のみ選択されていますね。
ブレイクをスキップして削除まで実行しましょう。
はい、削除できました。
VBAの説明
選択までの処理は上記VBAと同様です。
サイズの指定を追加しています。
Heightプロパティで高さを取得し、31ピクセル以下であれば選択対象となる条件にしています。
高さのほかに幅「.width」の指定もできます。
VBAの実装手順
実装手順は以下の通りです。
今回はExcel側にこのVBAを実装します。
①Excelを新規に開き、「開発」タブをクリックし、「VisualBasic」をクリックします。
もしくはショートカットキー「Alt」+「F11」でもOKです。
②標準モジュールを追加します。
左ペインのVBAProjectを右クリックし、「挿入」、「標準モジュール」を選択します。
③右ペインのウインドウに上記のVBAを入力します。
こちらで完了です。
VBAを実行する
では早速VBAの実行をしてみましょう。
①「開発」タブの「VBA」をクリックし実行したいマクロを選択し、「実行」をクリックします。
②処理がされたことが確認できれば完了です。
※完了メッセージやステータス管理など必要に応じて実装してもらえばと思います。
さいごに
いかがでしょうか。
今回は、
Excel VBAで図形のみ一括選択して削除する方法について
まとめました。
また、他にも便利な方法がありますので、よろしければご参照頂ければと思います。
コメントを残す