はい! VBA 基本技術のコーナーです!
今回は Shapes コレクションの AddLine メソッドと EndArrowheadStyle プロパティを使ってワークシートにぴゅーっと矢印を引いてみましょう!
え? こばとがハイテンション? 何か良いことでもあったのかって?
良いことないと浮かれちゃいけませんか?
AddLineメソッドとEndArrowheadStyleプロパティ
AddLineメソッドは次のような構文で記述して直線を作成します。
そのあと 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() を実行するとシートに緑色の矢印が現れます。
この例では始点を (50, 50), 終点を (200, 150) に設定しています。
図にあるように、始点も終点もシートの左上を基準にするのです。
という記述で矢印のスタイルを決めています。msoArrowheadTriangle はオーソドックスな三角形を先端にくっつけます。他にも
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 というセルを選択した状態にあるとき、マクロに記述された変数は次のような関係になっています。
sx, sy, sw, sh は選択範囲の左上隅の (X, Y) 座標と幅と高さです。
sx に sw を加えればシートの左上を基準にとった選択範囲右下隅の X 座標 endx が得られます。同様に sy に sh を足せば選択範囲右下隅の Y 座標 endy が得られるのです。
それではマクロを実行してみましょう。ぽちっとな。
赤い矢印が引かれましたね。
次はセルの縦幅の真中のところに矢印を引いてみましょう。
ガントチャートを作るときなどに便利な方法です。
下の図のように A 列に入力されている数字を矢印に変えるマクロです。
あ、そうそう。シートの各セルの高さと幅は全部揃えておいてね。
'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 を決めています。
たとえば2行目であれば入力されている数値が 3 なので、
つまりセル4個分の幅の位置が終点 X 座標になります。
+ 1 としてあるのは、A 列の幅だけ右にずらすからです。
矢印の始点および終点の Y 座標は
となっています。たとえば 4 行目であれば、
という計算になります。0.5 unitht はセルの縦幅の半分です。プログラムを書くときは、このような unit(単位)を定義しておくと色々と便利だし、コードがすっきりと見やすくなりますよ。