LoginSignup
1
3

More than 3 years have passed since last update.

セルの枠線に合わせて図形(矢印)を描画する

Last updated at Posted at 2019-05-19

概要

セルの枠線に合わせて図形(矢印)を描画します.

Shapes.AddConnectorに渡す位置を「セルの幅と高さを基準にした値」を使ってセルの枠線に合わせています.

draw_lines.gif

ただ, 個数が少ないなら手で「ALT+マウスドラッグ」するのがいいです.

コード

コード
Option Explicit

' セルの枠線に合わせて図形(矢印)を描画する
Sub DrawHorizontalLinesOnCells()

    '矢印の個数
    Const LinesCount = 100

    ' 矢印の位置を計算する基本単位(BasicUnit).
    Dim BasicUnitX
    BasicUnitX = Cells(1, 1).Width

    Dim BasicUnitY
    BasicUnitY = Cells(1, 1).RowHeight

    ' 矢印を描画する初期位置(Offset)
    Dim OffsetX
    OffsetX = BasicUnitX * 1

    Dim OffsetY
    OffsetY = BasicUnitY * 3

    ' 矢印の長さ
    Dim LineLength
    LineLength = BasicUnitX * 3

    '''''
    ' 矢印をループで描画する
    Dim i, BeginX, BeginY, EndX, EndY
    Dim Arrow As Shape
    For i = 1 To LinesCount

        ' 描画する位置を計算
        BeginX = OffsetX
        BeginY = OffsetY + i * BasicUnitY

        EndX = OffsetX + LineLength
        EndY = BeginY

        ' 直線を描画 → 形状を矢印に変更
        Set Arrow = ActiveSheet.Shapes.AddConnector( _
                            msoConnectorStraight, _
                            BeginX, BeginY, _
                            EndX, EndY _
                        )
        Arrow.Line.EndArrowheadStyle = msoArrowheadTriangle
    Next
End Sub

解説

図形(矢印)描画について

Shapes.AddConnector メソッドは(BeginX, BeginY) と (EndX, EndY) の二点を結ぶ線を描画します.

Addconnector(Type, BeginX, BeginY, EndX, EndY)

image.png

原点 (0, 0) A1セルの左上の角(頂点)
X軸の方向 → (右に行くほど増える)
Y軸の方向 ↓ (下に行くほど増える)
単位 ポイント(pt)

なので, BeginY = EndY となる値を設定すれば水平な線を引けます.

image.png

当初, 右クリックして出てくる「行の高さ」と「列の幅」を使おうとしましたが, どうやら単位が違う(ポイントではない)ようです

image.png

セルの枠線の位置計算

image.png

セルの幅 Cells(1, 1).Width
セルの高さ Cells(1, 1).Height

・・・という感じでセルから取得します.
セルから取得できる幅と高さ基本単位として, その整数倍で計算していけばちょうど枠線の位置になります.
コードは, すべて同じセルの高さ・幅だとしてCells(1, 1)の値を使いまわしていますが, そうでない場合はもう少し工夫が必要です.

コード抜粋
    ' 矢印の位置を計算する基準単位(BasicUnit).
    Dim BasicUnitX
    BasicUnitX = Cells(1, 1).Width

    Dim BasicUnitY
    BasicUnitY = Cells(1, 1).RowHeight

OffsetX, OffsetY, LineLength は, わかりやすく整数倍になっており,

コード抜粋
    ' 矢印を描画する初期位置(Offset)
    Dim OffsetX
    OffsetX = BasicUnitX * 1

    Dim OffsetY
    OffsetY = BasicUnitY * 3

    ' 矢印の長さ
    Dim LineLength
    LineLength = BasicUnitX * 3

BeginX, BeginY, EndX, EndY も式変形すると整数倍になっていることがわかる.

コード抜粋
       ' 描画する位置を計算
        BeginX = OffsetX
        BeginY = OffsetY + i * BasicUnitY

        EndX = OffsetX + LineLength
        EndY = BeginY

BeginX = OffsetX = 1 * BasicUnitX
BeginY = OffsetY + i * BasicUnitY = BasicUnitY * 3 + i * BasicUnitY = (i + 3) * BasicUnitY
EndX = OffsetX + LineLength = BasicUnitX * 1 + BasicUnitX * 3 = 4 * BasicUnitX
EndY = BeginY = (i + 3) * BasicUnitY

拡張すればできそうなこと

  • 矩形をセルの枠線に合わせて描画する
  • セルの幅や高さが一定でない場合でもセルの枠線に合わせて描画する

参考

Shapes. AddConnector メソッド (Excel) - Microsoft Docs
図形などのオブジェクトをマウスだけで枠線に合わせて配置する方法 - Excelを制する者は人生を制す~No Excel No Life~
ポイント、ピクセル、インチ、センチ、ミリの相互変換 - Excel作業をVBAで効率化

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3