ガントチャートのイナズマ線をExcel VBAで引く

2007/08/12

ガントチャートのイナズマ線をExcel VBAで引く方法。

需要がありそうなわりに意外と情報が少ないイナズマ線の描画方法。
フリーのガントチャートツールはVBAコードが公開されてなかったりするので、ここに書いておきます。
※動作確認してるのは、Excel2000~2003くらいまでです。
- - -

↓こういうのを引く例
inazuma1

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

解説


  1. まず縦に1本線を引く

  2. まず上から下まで1本線を引きます。ガントチャートなら現在の日付になるでしょう。
    線を引くには、Worksheet.Shapes#AddLineメソッドに開始点のX座標とY座標、終了点のX座標とY座標を指定します。座標を得るにはLeftプロパティやTopプロパティを用います。
    AddLineメソッドからは新しい線のShapeオブジェクトが返されるので、Lineプロパティに線の種類や太さや色を指定します。
    この時点で線は以下のようになります。
    inazuma2
  3. 折り曲げその1

  4. ガントチャートで進捗が遅れている場合には、イナズマ線を左に曲げる必要があります。
    折り曲げるには、折り曲げ「開始点・中間点・終了点」の3点が必要です。
    この例では、開始点=B2の左上、中間点=A3の左上、終了点=B4の左上、としています。
    Shape.Nodes#Insertメソッドをそれぞれ3点で呼び出せば、以下のようになります。
    inazuma3
  5. 折り曲げその2

  6. 逆に進捗が進んでいる場合には、イナズマ線を右へ曲げる必要があります。
    これも同様に「開始点・中間点・終了点」の3点を指定するだけです。
    開始点=B5の左上、中間点=C6の左上、終了点=B7の左上。
    で、こうなります。
    inazuma4


参考

msoSegmentLine
msoEditingAuto

MS系 | コメント(4) | トラックバック(0)
トラックバック
トラックバックURL:
コメント
mizhiro
2007/08/13

今は改善されてるかもしれませんが、 たしかExcel2007では、 このやり方ではダメだった記憶があります。 しかし、わかりやすくてよいエントリですね。 昔、一生懸命探した記憶があります。 そのときに、このページがあれば・・・。

ryu
2007/08/14

mizhiroさん、コメントありがとうございます。 そうですか、Excel2007ではダメですか。。たぶん2003までは大丈夫だったのでその旨追記しておきます。 >昔、一生懸命探した記憶があります。 そうなんですよねー。僕も最近必要に迫られてでしたが同じですよ。。 こんな記事でもけっこうなアクセスがあったので、みんな知りたがってるけど知ってる人がOutしてないっていうことなんでしょうね。 こんなの隠す必要はないと思うんですけどね。

nanah
2009/09/03

勝手に仕様変更しないで欲しいですよね→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

ryu
2009/10/22

nanahさん すみません、コメントに気がつきませんでした。 (おかけでこのブログのサイドバーのバグが発覚しました^ ^;) ほー、FreeformBuilder・・・ なんというか、よりオブジェクト指向になってるということだとは思うんですが、ここだけ見ると余計な手間が増えただけのような気もしますね。 情報ありがとうございました。

コメントをどうぞ
名前 (入力しなければ「通りすがり」):

メールアドレス (入力しても公開されません):

URL (入力すればリンクが張られます):


コメント:

(コメントにタグなどを使ってもタグがそのままが表示されます)