やろまい

国立院卒の理系君がプログラム書いたり、株式投資したり、簿記を学んだり。

はじめましての人へ(サイト紹介)
ツイッター→ 招き猫ファイナンス

【VBA】図形(シェイプオブジェクト)にマクロを登録する方法

今回は、VBAを使って図形に「マクロを登録」する方法を紹介します。

ここでいう図形はエクセルの図形ボタンで出てくるもののことです。

f:id:hamahiro881477:20201112083154p:plain

 

マクロを実行させるボタンは開発タブ⇒挿入⇒フォームコントロールを使うことが多いと思います。

f:id:hamahiro881477:20201112085606p:plain

 

ただ、知らない人もいるかもしれませんが、図形に対して「マクロの登録」をすることもできます。(図形を右クリックすると選択肢に出てきます)

f:id:hamahiro881477:20201112085814p:plain

「マクロの登録」を行うと、図形をクリックすることでマクロが実行されます。
 

今回は、この「マクロの登録」自体をマクロ(VBA)で行ってみたいと思います。

  1. マクロで図形を作成して、
  2. マクロで図形に「マクロの登録」をします。

 

《どんなことに使えるか?》

⇒複数の選択肢から処理を選んでもらう場合に使える。

 

マクロの処理方法が複数ある場合、msgboxやinputboxを使って選択肢を選んでもらうことがあります。

しかし、選択肢が多数ある場合にはこれらboxで選択させることは難しくなります。

 

そこで、この選択肢たちを図形で表示させてやります。

そうすれば、複数の選択肢があっても簡単に表示とクリックができます。

クリックされたら図形に登録したマクロが実行され、残りの処理を進めていくという仕組みです。

 

では、マクロで図形に「マクロを登録」する方法を学んでいきましょう。

 

1. マクロで図形を作成

まずはマクロを使って図形を作成します。

図形を作成するコードは次のようになります。

 Sub MakeShpObj()

  '1-1.貼付け範囲の指定
  Dim ShpRng As Range
  Set ShpRng = ActiveSheet.Range("C3:F6")

  '1-2.図形の作成
  Dim ShpObj As Shape
  Set ShpObj = ActiveSheet.Shapes.AddShape(msoShapeRectangle, ShpRng.Left, ShpRng.Top, ShpRng.Width, ShpRng.Height)

End Sub

このコードではRangeオブジェクトで貼付け範囲を決めて、それから図形の作成をしています。

図形は貼付け位置の指定がしにくいため、一旦Rangeオブジェクトで貼付け範囲を決めた後に作成しましょう。

ここではC3:F6の範囲を指定しています。 

 

図形を作成する時には、Shapeオブジェクトを使用します。

AddShapeが図形を作成するためのメソッドです。Shapesコレクションに対してこのメソッドを行うことで図形が作成されます。

まぁ、Shapes.AddShapeと書けば図形が作成されると覚えておいてください。

 

そして、AddShapeメソッドには5個の引数を指定しています。

  1. msoShapeRectangle:図形の種類
  2. ShpRng.Left:図形の左位置
  3. ShpRng.Top:図形の上位置
  4. ShpRng.Width:図形の幅
  5. ShpRng.Height:図形の高さ

図形の位置や幅はすべて、1-1で作成したRangeオブジェクトの位置を渡しています。

そのため、このコードを実行するとC3:F6とぴったり同じ位置に図形が作成されます。

f:id:hamahiro881477:20201112092837p:plain

 

2. マクロで図形に「マクロの登録」

次に、先ほど作成した図形に対して「マクロの登録」を行います。

「マクロ図形」を行うコードは次のようになります。

Sub MakeShpObj()

  '1-1.貼付け範囲の指定
  Dim ShpRng As Range
  Set ShpRng = ActiveSheet.Range("C3:F6")

  '1-2.図形の作成
  Dim ShpObj As Shape
  Set ShpObj = ActiveSheet.Shapes.AddShape(msoShapeRectangle, ShpRng.Left, ShpRng.Top, ShpRng.Width, ShpRng.Height)
  '2.マクロの登録
  ShpObj.OnAction = "実行するプロシージャ名"

End Sub

先ほど作成したShapeオブジェクト(ShpObj)に対してOnActionプロパティを設定しています。

プロパティにはクリックした時に実行させるプロシージャ名を書きます。

 

Shapeオブジェクトさえ作ってしまえば、あとはOnActionプロパティを設定するだけなので簡単です。

 

複数の選択肢を表示させるためには、Rangeオブジェクトの範囲を重ならないようにずらせばOKです。

一度お試しあれ。