XY座標から図形を作成

中級VBA

オートシェイプにない図形を作るには

 オートシェイプで図形を作る場合、決まった形と高さと幅で表現されるために作図には制限がかかります。
 例えば、長方形や台形、ひし形、平行四辺形などの四角形を作りたい場合には、オートシェイプが用意されていますが、各頂点に規則性のないような規格外の四角形は、フリーフォームで作成します。
 フリーフォームは、ShapesコレクションのBuildFreeformメソッドで作ります。

ワークシート上での操作

 VBAのプログラムの前にシート上で手動でオートシェイプの変形の仕方をおさらいしましょう。
 まず何でも良いのでオートシェイプで四角形を表示させます。
 続いて図形を右クリックして、メニューから「頂点の編集」を選択すれば各頂点が自由に変更できるようになります。

 これまで、マクロの記録を変更してコードを見る方法を使ってきましたが、「頂点の編集」に関しては記録されませんでした。
 今回、VBAのプログラムに関しては直接調べて記述するしかありません。

フリーフォームの作り方

 フリーフォームに関しては、たくさんのプロパティやメソッドが存在します。
 ここでは、最小限の知識で四角形の頂点を編集する方法を示します。

Sub macro()
    With ActiveSheet.Shapes.BuildFreeform(msoEditingAuto, 160, 110)
        .AddNodes msoSegmentLine, msoEditingAuto, 200, 60
        .AddNodes msoSegmentLine, msoEditingAuto, 250, 70
        .AddNodes msoSegmentLine, msoEditingAuto, 280, 100
        .AddNodes msoSegmentLine, msoEditingAuto, 160, 110
        .ConvertToShape
    End With
End Sub

 フリーフォームは、Shapesコレクションの BuildFreeformメソッドで最初の点をワークシート上に指定します。
 すると、これから作業に入るべき FreeformBuilderオブジェクトが返されます。
 
 この生成された FreeformBuilderオブジェクトに対して、次に接続していく点の位置をAddNodesメソッドで指定します。

 AddNodesメソッドは点の数だけ繰り返し実行します。

 全ての点を指定したら、最後に ConvertToShapeメソッドを実行する事でフリーフォームが完成となります。
 
 最後の節点が最初と同じ位置である時、その図形は閉じた図形となります。

実行結果は上のようになります。

AddNodes メソッド

 AddNodes メソッドの式は以下のようになります。
 X2、 Y2、 X3、 Y3 に関しては省略可能です。
 第2引数の EditingType に msoEditingAuto を指定した場合は、X2、 Y2、 X3、 Y3 を設定してはいけません。
 X1、 Y1に関しては点の座標になります。シート左上がX=0、Y=0となります。
 X2、 Y2、 X3、 Y3 に関しては、曲線を制御するためのコントロールポイント座標を指定します。

  AddNodes (SegmentType、 EditingType、 X1、 Y1、 X2、 Y2、 X3、 Y3)

SegmentType

 追加するセグメントの種類を指定します。

名前説明
msoSegmentCurve曲線
msoSegmentLineLine

EditingType

 ノード(節点)の編集の種類を指定します。

名前説明
msoEditingAuto0節点は、接続されているセグメントに適したタイプに変更
msoEditingCorner1節点は角の節点に変更
msoEditingSmooth2ノードを滑らかな曲線ノードに変更
msoEditingSymmetric3節点は左右対称の曲線の節点に変更
タイトルとURLをコピーしました