和風スパゲティのレシピ

日本語でコーディングするExcelVBA

すべての図形(オブジェクト)を選択するマクロ

アクティブシート上にある、すべての図形オブジェクト(Shape)を選択するマクロを紹介します。


すべての図形を削除したり、一括で移動したりするときに便利なマクロですね。


この処理には専用のメソッドが用意されているため、コードはとても簡単です。

Sub すべての図形を選択する()
    On Error Resume Next
    ActiveSheet.Shapes.SelectAll
End Sub

Excel起動時に裏で開かれる「個人用マクロブック」などに搭載して、
ショートカットキーに登録したり、ツールバーに置いて使ってください。

使用上の注意点

このマクロは、何かのマクロに組み込むものではなく、
ユーザーがツールバーなどから実行する便利マクロです。
 

ActiveSheet.Shapes.SelectAll

↑このコードを普通のマクロで使用するのは、
コードによってはかなり危険なのでやめておきましょう。


一例を挙げると、

ActiveSheet.Shapes.SelectAll
Selection.Delete

こんな風に「すべての図形を削除する」マクロを作ったつもりでも、
このコードを図形のないシートで実行すると、
「今の選択セルを削除する」マクロに早変わり
します。


SelectAllメソッドは選択に失敗してもエラーを返さないため、
その次のSelection.Deleteは、何を消すかわからない恐怖のコードになります。


またSelectAllメソッドはSelect系のコードには珍しく、
違うシートに対しても実行ができます。

Worksheets("別のシート").Shapes.SelectAll
Selection.Delete

↑このコードの1行目はエラーにならず、別のシートの図形を裏で選択してくれます。

次にそのシートをアクティブにすると、
全図形が選択されている状態になっているということですね。


そういう裏方の仕事をしてくれた後、
2行目のコードでActiveSheetの選択セルを破壊します。


Select、Activateなどの「選択する」コードは、
そのあとに続く「ユーザーの手作業」を支援するためのコードです。


図形に限らず、Rangeオブジェクト.Selectにも言えることですが、

「選択⇒選択したものを処理」

は、マクロとして組むことは極力避けましょう。


シート内の図形をすべて削除するマクロについてはこちらをどうぞ

www.limecode.jp

おまけ:この操作を手作業でするには

手作業ですべての図形オブジェクトを選択するには、以下の2つの方法があります。

  1. F5ジャンプ ⇒ セル選択 ⇒ オブジェクト
  2. 図形を何かひとつ選択した状態でCtrl+A


意外と2を知らない人が多いのですが、2の方が早くて便利ですね。

「2でできるならわざわざマクロ作るほうが面倒だからいいや」
という方もいるかもしれません。


ちなみにこの二つをマクロ記録すると、2は今回紹介した、

ActiveSheet.Shapes.SelectAll

が記録されます。


一方1では、

ActiveSheet.DrawingObjects.Select

と、違うコードが記録されます。


どちらも同じ動きになるので使うのはどっちでもいいのですが、
Shapesの方が新しいオブジェクトなので一応こちらを採用しています。


DrawingObjectsは非表示のメンバなので、
少なくともMicrosoftさんは積極的には推奨していません。

なのであまり使わない方がいいのかな?とも思ったのですが、

ActiveSheet.Shapes.SelectAll
MsgBox TypeName(Selection)

と、SelectAllされたオブジェクトたちのTypeNameを聞いてみると、
「DrawingObjects」と答えます。


結局同じことをしているようなので、どちらで書いても問題ないと思います。