直線を引く


オートシェイプの直線を引いてみます。まずは、マクロ記録してみましょう。

Sub Macro1()
    ActiveSheet.Shapes.AddConnector(msoConnectorStraight, 79, 31, 175, 63).Select
End Sub

直線を引くには、ShapesコレクションのAddConnectorメソッドを使います。直線は"コネクタ"のひとつなんですね。AddConnectorメソッドの引数は、最初に「どんな種類のコネクタ」を引くかという、コネクタの種類を定数で指定します。指定できる定数は、次のとおりです。

定数 種類
msoConnectorStraight 1 直線コネクタ
msoConnectorElbow 2 カギ線コネクタ
msoConnectorCurve 3 曲線コネクタ

今回は「直線」ですから、定数msoConnectorStraightです。

AddConnectorメソッドでは、直線の始点終点を、4つの数値で指定します。

AddConnector(種類, BeginX, BeginY, EndX, EndY)

「BeginX」と「BeginY」は始点、「EndX」と「EndY」は終点です。「~X」はワークシートの左端からの距離を表し、「~Y」は上端からの距離を表します。

「始点」は、直線を引くとき、最初にマウスのボタンを押し下げるところです。ワークシートの画面上で"左端"になるとは限りません。直線を引くときに、右から左にドラッグすれば、"右端"が「始点」になります。

セルに合わせて引く

画像を挿入する」や「画像を揃える」のように、こうした図形やオートシェイプなどを純粋な数値で指定することは希です。一般的には、どこかのセルに合わせるか、既存の図形やオートシェイプに合わせます。ここでは、セル範囲B2:C4内に、斜めの直線を引いてみましょう。

まず始点を考えます。これは簡単ですね。セルB2の左上です。セルB2の「ワークシート内で左端からの距離」は、Leftプロパティで分かります。同様に「ワークシート内で上端からの距離」はTopプロパティです。

Sub Macro2()
    ActiveSheet.Shapes.AddConnector msoConnectorStraight, Range("B2").Left, Range("B2").Top, EndX, EndY
End Sub

さて、右下の終点はどうでしょう。普通に考えれば、終点はセルC4の"右下"です。しかし、セル(Rangeオブジェクト)には、左を表すLeftプロパティと上を表すTopプロパティしかありません。な~に、難しく考えることはありません。セルC4の右下って、セルD5の左上と同じですよね。

Sub Macro2()
    ActiveSheet.Shapes.AddConnector msoConnectorStraight, Range("B2").Left, Range("B2").Top, Range("D5").Left, Range("D5").Top
End Sub

もし、始点や終点の位置を一度変数に入れて、AddConnectorメソッドにはその変数を指定するようなときは、格納する変数を単精度浮動小数点型(Single)で宣言してください。

Sub Macro3()
    Dim BeginX As Single    ''始点(左からの距離)
    Dim BeginY As Single    ''始点(上からの距離)
    Dim EndX As Single      ''終点(左からの距離)
    Dim EndY As Single      ''終点(上からの距離)
    BeginX = Range("B2").Left
    BeginY = Range("B2").Top
    EndX = Range("D5").Left
    EndY = Range("D5").Top
    ActiveSheet.Shapes.AddConnector msoConnectorStraight, BeginX, BeginY, EndX, EndY
End Sub

セルの途中から引く

セルの四隅ではなく、セルの途中から引いてみましょう。ここでは、次のような直線を引きます。

始点の左端は、セルB2の左端です。始点の高さは、セルB2の中間にしました。終点の上端は、セルC5の上端で、終点の右端は、セルC5の中間です。まぁ、これはコードを見れば分かるでしょう。

Sub Macro4()
    Dim BeginX As Single    ''始点(左からの距離)
    Dim BeginY As Single    ''始点(上からの距離)
    Dim EndX As Single      ''終点(左からの距離)
    Dim EndY As Single      ''終点(上からの距離)
    BeginX = Range("B2").Left
    BeginY = Range("B2").Top + Range("B2").Height / 2
    EndX = Range("C5").Left + Range("C5").Width / 2
    EndY = Range("C5").Top
    ActiveSheet.Shapes.AddConnector msoConnectorStraight, BeginX, BeginY, EndX, EndY
End Sub

応用すると、こんなこともできますね。

Sub Macro5()
    Dim i As Long, FC As Range
    For i = 2 To 9
        Set FC = Range("C2:C9").Find(What:=Cells(i, 1), Lookat:=xlWhole)
        If Not FC Is Nothing Then
            ActiveSheet.Shapes.AddConnector msoConnectorStraight, _
                Cells(i, 1).Offset(0, 1).Left, _
                Cells(i, 1).Top + Cells(i, 1).Height / 2, _
                FC.Left, _
                FC.Top + FC.Height / 2
        End If
    Next i
End Sub