線を引いて動かす ① とりあえず線を引く

ある理由から唐突に、Excelで線を引いて、それを動かしたくなった。
ちゃんとゴールできるか分からないが、挑戦してみよう。
f:id:Infoment:20200901224428p:plain

手始めにオートシェイプの線を引いて、それをマクロの記録で見てみた。
f:id:Infoment:20200901224548p:plain
f:id:Infoment:20200901224619p:plain

なるほど、こんな感じか。

  • 現在編集可能なシートに、図形としてコネクタを追加する。
  • コネクタのタイプは直線(msoConnectorStraight)。
  • 後半4つの数字は、始点と終点の各縦横座標。

扱い易さのために、一旦変数にセットしてみよう。
こんな時はいつも、適当な変数にセットしたうえで、型を確認している。

Sub Macro2()
    Dim a
    Set a = ActiveSheet.Shapes.AddConnector(msoConnectorStraight, 248.25, 74.25, 525.75, _
        294)
    Debug.Print TypeName(a)
End Sub

f:id:Infoment:20200901225202p:plain

型は、Shapeだった。言われてみれば、そりゃそうだ。
ということで、こんな風に書き直してみた。

Sub test()
    ' 始点のx,y座標。
    Dim sx As Double
    Dim sy As Double
    ' 終点のx,y座標
    Dim ex As Double
    Dim ey As Double
    
    ' 初期値設定(てきとー)。
    sx = 0: sy = 0
    ex = 100: ey = 100
    
    ' 線を描画。強引にWithで、一行の長さを抑えてみた。
    Dim myLine As Shape
    With ActiveSheet.Shapes
        Set myLine = .AddConnector(msoConnectorStraight, _
                                   sx, sy, _
                                   ex, ey)
    End With
End Sub

実行した結果が、↓ こちら。
f:id:Infoment:20200901225849p:plain

よし、ここまでは順調だ。
次に、移動後の始点と終点を指定しようとして、気付いた。終点って、どうやって与えれば良いんだろう?

始点はそれらしきものがあるが、終点が見当たらない。
f:id:Infoment:20200901230049p:plain

無いものは、仕方ない。でも、始点と終点で指定したい。
ということで、最終的に線の幅と高さを求めることにした。

  • 終点のx座標=始点のx座標+幅
  • 終点のy座標=始点のy座標+高さ

f:id:Infoment:20200901230453p:plain

以上を踏まえて、このように書き直し。

Sub test()
    ' 始点のx,y座標。
    Dim sx(1) As Double
    Dim sy(1) As Double
    ' 終点のx,y座標
    Dim ex(1) As Double
    Dim ey(1) As Double
    
    ' 初期値設定(てきとー)。
    sx(0) = 0: sy(0) = 0
    ex(0) = 100: ey(0) = 100
    
    ' 線を描画。強引にWithで、一行の長さを抑えてみた。
    Dim myLine As Shape
    With ActiveSheet.Shapes
        Set myLine = .AddConnector(msoConnectorStraight, _
                                   sx(0), sy(0), _
                                   ex(0), ey(0))
    End With
    
    ' 移動後の座標設定。
        sx(1) = 10: sy(1) = 20
        ex(1) = 90: ey(1) = 70
    
    ' 移動(というより、むしろ変形か)。
        With myLine
            .Left = sx(1)
            .Top = sy(1)
            .Width = ex(1) - .Left
            .Height = ey(1) - .Top
        End With
End Sub

ステップ実行した結果がこちら。
f:id:Infoment:20200901231345g:plain

初日としては、こんなものかな。

次回に続きます。

参考まで。