『Excel VBA 表計算とプログラミング学習サイト』では、アフィリエイトプログラムを利用して商品を紹介しています。

【VBA】EndArrowheadstyleで矢印線を描きましょう

今回は VBA で Shapes コレクションの AddLine メソッドと EndArrowheadStyle プロパティを使ってワークシートに矢印を引いてみますよ。 

【VBA】AddLine.EndArrowheadStyle

VBA の AddLineメソッドは次のような構文で記述して直線を作成します。

オブジェクト.AddLine(始点X,始点Y,終点X,終点Y)

そのあと、EndArrowheadStyleプロパティで矢印に変えます。とりあえず簡単なマクロを作って実例を見てみましょう。

'[VBA] 緑色の矢印を描くマクロ
Sub Shape_Arrow()
  With ActiveSheet.Shapes.AddLine(50, 50, 200, 150).Line
    .ForeColor.RGB = vbGreen
    .Weight = 2
    .EndArrowheadStyle = msoArrowheadTriangle
  End With
End Sub

Shape_Arrow() を実行するとシートに緑色の矢印が現れます。
 
AddLineメソッドの始点と終点
 
この例では始点を (50, 50), 終点を (200, 150) に設定しています。図にあるように、始点も終点もシートの左上を基準にします。

.EndArrowheadStyle = msoArrowheadTriangle

という記述で矢印のスタイルを決めています。msoArrowheadTriangle はオーソドックスな三角形を先端にくっつけます。EndArrowheadStyle で設定できる矢印の種類は他にも
 
・msoArrowheadDiamond:ひし形(ダイヤモンド)
・msoArrowheadOval:円形
・msoArrowheadOpen:開いた矢印
・msoArrowheadStealth:鋭い矢印
 
などがあります。msoArrowheadNone とすれば「矢印なし」になるけど、そんなことするぐらいなら最初から矢印にしなければいいので、ほとんど使い道はなさそうですね。
 
今度は好きな範囲を選択して左上から右下に矢印を引いてみます。

'[VBA] 選択範囲の左上から右下に赤い矢印を引くマクロ

Sub Select_Area_Arrow()

  Dim sx As Double, sy As Double
  Dim sw As Double, sh As Double
  Dim endx As Double, endy As Double

  With Selection
    sx = .Left
    sy = .Top
    sw = .Width
    sh = .Height
  End With

  endx = sx + sw
  endy = sy + sh

  With ActiveSheet.Shapes.AddLine(sx, sy, endx, endy).Line
    .ForeColor.RGB = vbRed
    .EndArrowheadStyle = msoArrowheadTriangle
  End With

End Sub

たとえば B3:D5 を選択した状態にあるとき、Select_Area_Arrow() に記述された変数は次のような関係になっています。
 
VBAのAreaArrow関数の変数
 
sx, sy, sw, sh は選択範囲の左上隅の (X, Y) 座標と幅と高さです。sx に sw を加えればシートの左上を基準にとった選択範囲右下隅の X 座標 endx が得られます。同様に sy に sh を足せば選択範囲右下隅の Y 座標 endy が得られるのです。
 
それでは Select_Area_Arrow() を実行してみましょう。ぽちっとな。
 
EndArrowheadStyleで矢印が引かれる

赤い矢印が引かれましたね。次はセルの縦幅の真中のところに矢印を引いてみましょう。ガントチャートを作るときなどに便利な方法です。下の図のように A 列に入力されている数字を矢印に変えるマクロです。
 
Excel VBA Gant Chart
 
あ、そうそう。シートの各セルの高さと幅は全部揃えておいてね。

'[VBA] A列の数字を矢印に変えるマクロ

Sub Gant_Arrow()

  Dim i As Integer
  Dim unitwd As Double, unitht As Double
  Dim wd As Double, ht As Double

  unitwd = Cells(1, 2).Width
  unitht = Cells(1, 2).Height

  For i = 1 To 5
    wd = unitwd * (Cells(i, 1).Value + 1)
    ht = (i - 0.5) * unitht

    With ActiveSheet.Shapes.AddLine(unitwd, ht, wd, ht).Line
      .ForeColor.RGB = vbRed
      .Weight = 2
      .EndArrowheadStyle = msoArrowheadTriangle
    End With
  Next i

End Sub

unitwd と unitht はセルの幅と高さです。これを基準に矢印の終点に指定する wd を決めています。

unitwd * (Cells(i, 1).Value + 1)

たとえば、2行目であれば入力されている数値が 3 なので、
 
  unitwd × (3 + 1) = 4 unitwd
 
つまりセル4個分の幅の位置が終点 X 座標になります。+1 としてあるのは、A 列の幅だけ右にずらすからです。矢印の始点および終点の Y 座標は

ht = (i - 0.5) * unitht

となっています。たとえば 4 行目であれば、

(4 - 0.5) unitht = 3.5 unitht

という計算になります。0.5 unitht はセルの縦幅の半分です。プログラムを書くときは、このような unit(単位)を定義しておくと色々と便利だし、コードがすっきりと見やすくなりますよ。

コメント

  1. あとりえこばと より:

    【GPT解説】VBAで矢印を描画する方法

    矢印の描画にはShapeオブジェクトを使用します。以下の手順に従って、VBAコードを作成し、Excelのワークシート上に矢印を描画してみましょう。
     
    1.VBAエディタを開く:
    Excel内で、Alt + F11 キーを押してVBAエディタを開きます。
     
    2.新しいモジュールを作成:
    左側の「プロジェクトエクスプローラー」で適切なワークブックを選択し、右クリックして「挿入」から「モジュール」を選択して新しいモジュールを作成します。
     
    3.矢印を描画するVBAコードを追加:
    以下のVBAコードを新しく作成したモジュールに貼り付けます。

    Sub DrawArrow()
        Dim ws As Worksheet
        Dim arrow As Shape
        Dim startX As Single, startY As Single
        Dim endX As Single, endY As Single
        
        ' ワークシートを設定
        Set ws = ThisWorkbook.Sheets("Sheet1") ' シート名を適切に変更
        
        ' 矢印の始点と終点の座標を設定
        startX = 100 ' 始点のX座標
        startY = 100 ' 始点のY座標
        endX = 200   ' 終点のX座標
        endY = 200   ' 終点のY座標
        
        ' 矢印を描画
        Set arrow = ws.Shapes.AddLine(startX, startY, endX, endY)
        With arrow.Line
            .EndArrowheadStyle = msoArrowheadOpen
            .EndArrowheadLength = msoArrowheadLong
            .EndArrowheadWidth = msoArrowheadWidthWide
            .ForeColor.RGB = RGB(0, 0, 0) ' 矢印の色を設定(黒)
        End With
    End Sub

    4.コードを実行する:
    VBAエディタで作成したモジュール内のDrawArrow サブルーチンを選択し、実行します。矢印がワークシート上に描画されるはずです。
     
    このサンプルコードは、指定された座標を使用してワークシート上に矢印を描画します。始点と終点の座標を適切に変更することで、矢印の位置を調整できます。また、矢印の色やスタイルも変更できます。