線を引いて動かす ⑤ なんちゃらFlip

ある理由から唐突に、Excelで線を引いて、それを動かしたくなった。
前回は、一気に作ったサブプロシージャを、幾つかに分解してみた。
infoment.hatenablog.com

今日は、既存の線の始点と終点を求めてみる。
f:id:Infoment:20200909220939p:plain

線の位置と形状を知るためには、以下4つのプロパティが必要だ。

  1. Left 左からの位置
  2. Top 上からの位置
  3. Height Topからの高さ
  4. Width Leftからの幅

この線を対角線に持つ矩形で考えると、分かり易いと思う。
f:id:Infoment:20200909222142p:plain

とここで、色々と試してみて気が付いた。上図と下図は、プロパティの
値が全く同じなのだ。
f:id:Infoment:20200909222307p:plain

両者は共に同じ矩形の対角線であるからして、プロパティが同じになる
のは仕方ない。しかしこれでは、この線がどこから始まったか判らない
ではないか。

そこで更に調べた結果、

  • HorizontalFlip
  • VerticalFlip

なるものがあることを知った。
docs.microsoft.com

正直、何を書いてあるのか良く判らない。しかし色々と試してみた結果、
恐らくこうであろうということが分かった。

対象となるShapeが線である場合、線を描画した際の始点と、その線を対角線として定まる矩形の左上の点が一致しないならば、Trueを返す。

実際4種類の線で試すと、こうなった。
f:id:Infoment:20200909223917p:plain

ここまでわかれば、後は何とかなる。
ということで、対象となる線の始点及び終点をx座標とy座標に準え、一つの配列に入れて返す関数を作成してみた。

Function GetPosisionArray(target_shape As Variant) As Variant
        If Not TypeName(target_shape) = "Shape" Then
            GetPosisionArray = Array()
            Exit Function
        End If
    
    Dim Sx As Double
    Dim Sy As Double
    Dim Ex As Double
    Dim Ey As Double
        Select Case target_shape.HorizontalFlip
            Case True
                Sx = target_shape.Left + target_shape.Width
                Ex = target_shape.Left
            Case False
                Sx = target_shape.Left
                Ex = target_shape.Left + target_shape.Width
        End Select
        
        Select Case target_shape.VerticalFlip
            Case True
                Sy = target_shape.Top + target_shape.Height
                Ey = target_shape.Top
            Case False
                Sy = target_shape.Top
                Ey = target_shape.Top + target_shape.Height
        End Select
        
        GetPosisionArray = Array(Sx, Sy, Ex, Ey)
End Function

それでは実際に、描画方向に注意しながら線で試してみよう。

Sub test()
    Dim i As Long
        For i = 1 To ActiveSheet.Shapes.Count
            MoveLine GetPosisionArray(ActiveSheet.Shapes(i)), _
                     GetPosisionArray(ActiveSheet.Shapes(i + 1))
        Next
        
        MoveLine GetPosisionArray(ActiveSheet.Shapes(i)), _
                 GetPosisionArray(ActiveSheet.Shapes(1))
End Sub

結果がこちら。
f:id:Infoment:20200909224637g:plain

これで、描画済みの線を対象として、色々と動かせるようになった。

次回に続きます。

参考まで。