オートシェイプの直線を引いてみます。まずは、マクロ記録してみましょう。
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