線を引いて動かす ⑤ なんちゃらFlip
ある理由から唐突に、Excelで線を引いて、それを動かしたくなった。
前回は、一気に作ったサブプロシージャを、幾つかに分解してみた。
infoment.hatenablog.com
今日は、既存の線の始点と終点を求めてみる。
線の位置と形状を知るためには、以下4つのプロパティが必要だ。
- Left 左からの位置
- Top 上からの位置
- Height Topからの高さ
- Width Leftからの幅
この線を対角線に持つ矩形で考えると、分かり易いと思う。
とここで、色々と試してみて気が付いた。上図と下図は、プロパティの
値が全く同じなのだ。
両者は共に同じ矩形の対角線であるからして、プロパティが同じになる
のは仕方ない。しかしこれでは、この線がどこから始まったか判らない
ではないか。
そこで更に調べた結果、
- HorizontalFlip
- VerticalFlip
なるものがあることを知った。
docs.microsoft.com
正直、何を書いてあるのか良く判らない。しかし色々と試してみた結果、
恐らくこうであろうということが分かった。
対象となるShapeが線である場合、線を描画した際の始点と、その線を対角線として定まる矩形の左上の点が一致しないならば、Trueを返す。
実際4種類の線で試すと、こうなった。
ここまでわかれば、後は何とかなる。
ということで、対象となる線の始点及び終点を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
結果がこちら。
これで、描画済みの線を対象として、色々と動かせるようになった。
次回に続きます。
参考まで。