Shapeを使ってブロック図を描く

難儀しましたわ。

基本

基本的なクラスの階層構造

Application
 + WorkBook
   + Worksheet
     + Shapes ( collection of Shapes)

これを抑えておかないと後で構造がごっちゃになって非常に面倒な目に会う。

シェイプの追加

dim newShape as Shape
dim newTextBox as Shape
dim connector as Shape

Set newShape = ActiveSheet.Shapes.AddShape(msoShapeRectangle, 10, 10, 30, 100)
Set newTextBox = ActiveSheet.Shapes.AddTextShape(msoTextOrientationHorizontal, 10, 10, 30, 100)
Set connector = ActiveSheet.Shapes.AddConnector(msoConnectorElbow, 0, 0, 100, 100)

正直なんでメソッドが別れてるのかわからん('A`)

基本はどれもShapesコレクションのaddXXXメソッドを使ってシェイプを追加、戻り値の参照を変数で受けてコリコリする。

Shapeの操作は以下の逆引きから。

シェイプの色を変える、背景を変える

Shape.Fillプロパティを使う。
Shape.FillはFillFormatオブジェクトへの参照でReadOnly
操作はFillFormatクラスの各プロパティを使う。主なプロパティは

  • BackColor
    グラデーションの背景色を設定する。グラデーションを使用しないときは効果が無い
  • ForeColor
    背景色を設定する。グラデーションを使用する場合前景色となる。
  • Pattern
    塗りつぶしパターンを設定する。
  • Transparency
    透明度を設定する。設定は小数値で、1が透明、0が不透明となる。
シェイプの線を変える

Shape.Lineプロパティを使う。
Shape.LineはLineFormatオブジェクトへの参照でReadOnly
操作はLineFormatクラスの各プロパティを使う。主なプロパティは

  • BackColor
    グラデーションの背景色を設定する。グラデーションを使用しないときは効果が無い
  • ForeColor
    背景色を設定する。グラデーションを使用する場合前景色となる。
  • Transparency
    透明度を設定する。設定は小数値で、1が透明、0が不透明となる。

複数のシェイプをグループ化する

グループ化するためにはShapeRangeコレクションのGroupメソッドを使う。
該当するシェイプを選択してSelection.ShapeRangeを使うか、WorkSheet.shapes.range(Array(1,2,...))という形を使う。
前者の使用方法は

Shape1.Select()
Shape2.Seelct(False)
Shape3.Select(False)

groupShape = Selection.ShapeRange.Group

となる。

Selectメソッドの引数にFalseを指定すると、現在選択されているものの選択を解除せずに指定したシェイプを選択する。(複数選択)