[VBA] EndArrowheadstyleプロパティで矢印線を描きましょう

 はい! VBA 基本技術のコーナーです! 今回は

 Shapesコレクションの AddLineメソッドと EndArrowheadStyleプロパティ

を使ってワークシートにぴゅーっと矢印を引いてみましょう!

 これを覚えたら~♪ いつでも引けるのね~♪
 好きなところに、や・じ・る・し、引けるのね~♪

 え? こばとが浮かれてる? 何か良いことでもあったのかって?
 良いことないと浮かれちゃいけませんか?
 

AddLineメソッドとEndArrowheadStyleプロパティ

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

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

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

'緑色の矢印を描きます

 Sub ShapeArrow()

 With ActiveSheet.Shapes.AddLine(50, 50, 200, 150).Line
  .ForeColor.RGB = vbGreen
  .Weight = 2
  .EndArrowheadStyle = msoArrowheadTriangle
 End With

 End Sub

 マクロを実行するとシートに緑色の矢印が現れますよ。

 AddLineメソッドの始点と終点

 この例では始点を (50, 50), 終点を (200, 150) に設定しています。
 図にあるように、始点も終点もシートの左上を基準にするのです。

.EndArrowheadStyle = msoArrowheadTriangle

という記述で矢印のスタイルを決めています。msoArrowheadTriangle はオーソドックスな三角形を先端にくっつけます。他にも

  msoArrowheadDiamond ひし形(ダイヤモンド)
  msoArrowheadOval 円形
  msoArrowheadOpen 開いた矢印
  msoArrowheadStealth 鋭い矢印

などがあります。msoArrowheadNone とすれば「矢印なし」になるけど、そんなことするぐらいなら最初から矢印にしなければいいので、ほとんど使い道はなさそうです。
 

選択した範囲の左上から右下に矢印を引いてみます

 今度は好きな範囲を選択して左上から右下に矢印を引いてみますよ。

 '選択範囲の左上から右下に赤い矢印を引きます

 Sub SelectAreaArrow()

 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 というセルを選択した状態にあるとき、マクロに記述された変数は次のような関係になっています。

 VBAのAreaArrow関数の変数

 sx, sy, sw, sh は選択範囲の左上隅の (X, Y) 座標と幅と高さです。
 sx に sw を加えればシートの左上を基準にとった選択範囲右下隅の X 座標 endx が得られます。同様に sy に sh を足せば選択範囲右下隅の Y 座標 endy が得られるのです。
 それではマクロを実行してみましょー。ぽちっとな。

 EndArrowheadStyleで矢印が引かれる

 赤い矢印が引かれましたねー。
 

セルの中央に矢印を引きます

 セルの縦幅の真中のところに矢印を引いてみましょー。
 ガントチャートを作るときなどに便利な方法ですよー。
 下の図のように A 列に入力されている数字を矢印に変えるマクロです。

Excel VBA Gant Chart

 あ、そうそう。シートの各セルの高さと幅は全部揃えておいてね。

 'A 列の数字を矢印に変えます

 Sub GantArrow()

 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(単位)を定義しておくと色々と便利だし、コードがすっきりと見やすくなりますよ。

 これで完璧ね~♪ 矢印マスターね~♪
 これから、いつでも、どこでもね~、矢印引けるのね~♪
 え? やっぱり何か良いことあったんだろうって?
 だから別に何もありませんてば。それじゃまたねー。 ≫ VBA の技術

スポンサードリンク
末尾大型広告
末尾大型広告

コメントをどうぞ

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)