![]() | tech note |
| 自分をリファクタリング中。 |
ガントチャートのイナズマ線をExcel VBAで引く方法。
需要がありそうなわりに意外と情報が少ないイナズマ線の描画方法。
フリーのガントチャートツールはVBAコードが公開されてなかったりするので、ここに書いておきます。
※動作確認してるのは、Excel2000~2003くらいまでです。
- - -
↓こういうのを引く例
Public Sub DrawInazuma()
Dim sx As Single, sy As Single '開始点
Dim mx As Single, my As Single '中間点
Dim ex As Single, ey As Single '終了点
Dim nl As Shape
With Sheet1
'縦に1本引く・・・(下記 解説1)
sx = .Range("B1").Left
sy = .Range("B1").Top
ex = .Range("B9").Left
ey = .Range("B9").Top
Set nl = .Shapes.AddLine(sx, sy, ex, ey)
With nl.Line
.DashStyle = msoLineSolid 'スタイル
.Weight = 2 '太さ
.ForeColor.RGB = RGB(255, 0, 0) '色
End With
'折り曲げる節点を指定していく
'折り曲げその1・・・(下記 解説2)
sx = .Range("B2").Left
sy = .Range("B2").Top
mx = .Range("A3").Left
my = .Range("A3").Top
ex = .Range("B4").Left
ey = .Range("B4").Top
With nl
.Nodes.Insert .Nodes.Count - 1, _
msoSegmentLine, msoEditingAuto, sx, sy
.Nodes.Insert .Nodes.Count - 1, _
msoSegmentLine, msoEditingAuto, mx, my
.Nodes.Insert .Nodes.Count - 1, _
msoSegmentLine, msoEditingAuto, ex, ey
End With
'折り曲げその2・・・(下記 解説3)
sx = .Range("B5").Left
sy = .Range("B5").Top
mx = .Range("C6").Left
my = .Range("C6").Top
ex = .Range("B7").Left
ey = .Range("B7").Top
With nl
.Nodes.Insert .Nodes.Count - 1, _
msoSegmentLine, msoEditingAuto, sx, sy
.Nodes.Insert .Nodes.Count - 1, _
msoSegmentLine, msoEditingAuto, mx, my
.Nodes.Insert .Nodes.Count - 1, _
msoSegmentLine, msoEditingAuto, ex, ey
End With
End With
End Sub



今は改善されてるかもしれませんが、 たしかExcel2007では、 このやり方ではダメだった記憶があります。 しかし、わかりやすくてよいエントリですね。 昔、一生懸命探した記憶があります。 そのときに、このページがあれば・・・。
mizhiroさん、コメントありがとうございます。 そうですか、Excel2007ではダメですか。。たぶん2003までは大丈夫だったのでその旨追記しておきます。 >昔、一生懸命探した記憶があります。 そうなんですよねー。僕も最近必要に迫られてでしたが同じですよ。。 こんな記事でもけっこうなアクセスがあったので、みんな知りたがってるけど知ってる人がOutしてないっていうことなんでしょうね。 こんなの隠す必要はないと思うんですけどね。
勝手に仕様変更しないで欲しいですよね→Microsoft Excel2007で動かすことができたので書いておきます。 'Set nl = .Shapes.AddLine(sx, sy, ex, ey) Dim fb As FreeformBuilder Set fb = .Shapes.BuildFreeform(msoEditingCorner, sx, sy) fb.AddNodes msoSegmentLine, msoEditingCorner, ex, ey Set nl = fb.ConvertToShape
nanahさん すみません、コメントに気がつきませんでした。 (おかけでこのブログのサイドバーのバグが発覚しました^ ^;) ほー、FreeformBuilder・・・ なんというか、よりオブジェクト指向になってるということだとは思うんですが、ここだけ見ると余計な手間が増えただけのような気もしますね。 情報ありがとうございました。