初心者のためのExcelマクロ超入門(絶対できるVBA開発)

マクロがまったくわからない人のためにエクセルマクロやVBAについてできるだけわかりやすく書いています。Twitter:@shuhhohhey

初心者のためのExcel エクセルマクロVBA入門:図形書いてみる?(オートシェイプ)

図形もマクロで操作できるよ!当たり前だけど。

今回はオートシェイプです。そんなに難しいお話ではありません。ちょっと前回前々回とエクセルの操作の基本をマクロでやってみる。というような感じなので、オートシェイプも結構ポピュラーに使われますよね?そういう意味で、ちょっとやってみましょう。

でもオートシェイプってどうするんでしょう?マクロで図形?( ゚д゚)?ハテ?

オートシェイプを管理するShapesオブジェクト


いつでもどこでも何度でも、このブログでは言ってますが、エクセルマクロは「オブジェクトを正しく指定することができれば、マクロなんて超簡単!」ということです。今回のオートシェイプもやっぱり図形を色々と操作するオブジェクトが存在するわけです。まだロボじゃないとわからない人はオートシェイプロボでも良いです。


以前も言いましたが、エクセルは本当にたくさんのロボ(オブジェクト)で構成されている1つの大きなロボ(オブジェクト)なのです。その大枠、つまり大元の親はApplicationオブジェクトというものになります。このApplicationオブジェクトの中にたくさんの小さな子ロボ(オブジェクト)が存在して1つのエクセルというものを構成しているのです。


ですので、オートシェイプで図形を書くときも当然図形に関する「機能(メソッド)」と「状態(プロパティ)」を持ったオブジェクトが存在しています。それが

Shapesオブジェクト


というわけです。ではShapesオブジェクトを見てましょう。


f:id:drumer2sh:20140821113543p:plain


これはVBEのヘルプからShapesオブジェクトを検索して、出したものです。これだけで、Shapesがまず「コレクション」オブジェクトであることがわかりますよね。コレクションオブジェクトとは、同じオブジェクトを複数持っているオブジェクトのことで、まぁオブジェクトを配列管理しているといえばわかりやすいでしょうか?

つまり、ShapesオブジェクトはたくさんのShapeオブジェクトが集まって出来ているわけです。


じゃあShapeオブジェクトってなによ?( ゚д゚)?



これよ。


f:id:drumer2sh:20140821113554p:plain


ちょっと、Shapeオブジェクトの方はメソッド、プロパティともにたくさんあるので、自分で見て見てください。


まぁ要するにですね。エクセルで図形を操作できること全般がメソッドとプロパティになっていると思ってくれてほぼ間違いないです。この2つのオブジェクトShapesとShapeのメソッドとプロパティを見るとわかりますが・・・

  • 図形を追加するのはShapesオブジェクト
  • 図形単体を操作するのはShapeオブジェクト


ということがわかると思います。そして、もっとわかるのが、ShapesオブジェクトはSheetオブジェクトの子どもオブジェクトってことです。つまりどういうこと?( ゚д゚)?大枠から構成を説明すると・・・


大元:Applicationオブジェクト

があって・・・

その下にWorkBookオブジェクト(ブック)

があって・・・

さらにその下にSheetオブジェクト(シート)

があって・・・

さらさらにその下にShapesオブジェクト

があって・・・

さらにさらにさらにその中にShapeオブジェクト

がある。

という関係なのです。

ここまでわかれば、後は瞬殺です。じゃ、コード書くね。やることは至極単純です。

  1. Shapesオブジェクトを使って図形を追加して
  2. 追加した図形のプロパティを色々といじってみる

これだけ。じゃあやってみましょう。

Sub Smaple()
    
    ' 追加した図形オブジェクトを格納する変数
    Dim shp As Shape
    
    ' 図形を追加する(吹き出し。)
    Set shp = shtScore.Shapes.AddShape(msoShapeBalloon, 50, 50, 120, 200)
    
    ' 追加した図形の塗りつぶしの色とか色々と変えてみる
    With shp
        .Name = "Shape1"
        With .Fill
            .ForeColor.RGB = RGB(128, 0, 0)
            .BackColor.RGB = RGB(170, 170, 170)
            .TwoColorGradient msoGradientHorizontal, 1
        End With
        .Rotation = 45
    End With

End Sub

はい、これで終わりです。実行すると、ちょっと毒々しい赤と黒のグラデーションの吹き出しが傾いた形で表示されます。
Withステートメント使って書いますので混乱しないように、またWithステートメントは入れ子構造にもできるので、こんな感じになっています。「Fill」というのはShapeのさらに中にあるFillオブジェクトでまたそのさらに中にあるForeColorオブジェクトのRGBプロパティとBackColorオブジェクトのRGBプロパティ、さらにFillオブジェクトのTwoColorGradientメソッドを使ってグラデーションを設定しています。


( ゚д゚)?


ってならないようにしてくださいね。やっていることは、オブジェクトを正しく指定して、書いているだけ。です。
確かに少し構成は複雑ですが、オブジェクトの基本は階層構造です。そこだけ意識して見て見るとちょっとわかってくると思います。

そんなわけで、今日はここまで!


かしこ