スポンサーリンク

Excel VBAで,グラフを自動で描画しよう(データ範囲を動的に変える) + ソフトウェアの品質保証について


Excel VBAのマクロで,グラフを自動的に描画する方法。


手動でグラフを描こうとすると,データ範囲の設定などがいちいち面倒くさい。

それをマクロで自動化しよう。


リアルタイムで状況が変化してゆく中で,現状を反映した「最新データのグラフ」を自動的に作りたいのだ。

(1)グラフのサンプルデータ

シート上に,こういうデータがあるとしよう。


x軸の数値(月) 系列1 系列2
3 10 20
4 20 10
5 10 10
6 30 40
7 40 20
8 20 20


ただし系列1の3月のデータは,シート上で8行3列目にあるとする。


ここで,このデータは「毎月増えてゆく」という点に注意しよう。


x軸は「月」だから,今後毎月,行は増える可能性がある。

データが書いてある範囲を自動的に見極めて,その範囲に応じたグラフを作りたい。

(2)グラフを自動的に描画するVBAのサンプルコード

下記のVBAコードを実行すればよい。

Sub グラフ描画()
        
    ' ---------- 設定 ----------
    
    
    ' 一つの系列は下方向に延びるとする。
    ' 最も左にあるデータ系列の左の列には,項目軸があるとする。
    
    
    ' シート上でのデータ記述開始位置
    y_offset = 8
    x_offset = 3
    
    ' データの系列の数 (x_offset列目から右へ何列並んでいるのか)
    series_num = 2
    
    ' 系列の名前
    series_names = Array("1個目の系列", "2個目の系列")

    ' グラフのタイトル
    chart_title = "hogeに関するグラフ"
    
    ' 軸のタイトル
    x_title = "x軸"
    y_title = "y軸"
    
    ' グラフの位置
    gpos_x = 300
    gpos_y = 50
    
    ' グラフのサイズ
    g_width = 400
    g_height = 300
    
    ' グラフ識別子
    graph_name = "my_graph"
    
    
    
    ' ---------- グラフ作成 ----------
    
    
    ' アクティブシート上に既存のグラフがあれば削除
    If ActiveSheet.ChartObjects.Count > 0 Then
        For i = 1 To ActiveSheet.ChartObjects.Count
            ' グラフ名が一致するか
            If ActiveSheet.ChartObjects(i).Name = graph_name Then
                ActiveSheet.ChartObjects(i).Delete
                Exit For
            End If
        Next i
    End If
    
    
    ' データ範囲を決定 (何行目まであるのか)
    y_temp = y_offset
    continue_flag = True
    Do While continue_flag = True
        ' この行に内容があれば次の行へ進む
        If Len(Cells(y_temp, x_offset).Value) > 0 Then
            y_temp = y_temp + 1
        Else
            continue_flag = False
        End If
    Loop
    y_end = y_temp
    x_end = x_offset + series_num - 1
    
    
    ' グラフを描画
        ' http://brain.cc.kogakuin.ac.jp/~kanamaru/lecture/vba2003/13-applications02.html
        ' http://www.officepro.jp/excelvba/chart_edit/index2.html
    Dim chartObj As ChartObject
    Set chartObj = ActiveSheet.ChartObjects.Add( _
        gpos_x, gpos_y, g_width, g_height _
    )
    chartObj.Name = graph_name
    With chartObj.Chart
        
        ' データ範囲をセット(左上と右下)
        .SetSourceData ActiveSheet.Range( _
            Cells(y_offset, x_offset), _
            Cells(y_end, x_end) _
        ), xlColumns
        
        ' x軸の項目軸範囲をセット
        .SeriesCollection(1).XValues = Range( _
            Cells(y_offset, x_offset - 1), _
            Cells(y_end, x_offset - 1) _
        )
        
        ' オプションをセット
        .ChartType = xlLine ' 折れ線
        .HasTitle = True
        .ChartTitle.Characters.Text = chart_title
        .Axes(xlCategory, xlPrimary).HasTitle = True
        .Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = x_title
        .Axes(xlValue, xlPrimary).HasTitle = True
        .Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = y_title
        
        ' 系列名をセット
        For i = 1 To series_num
            .SeriesCollection(i).Name = series_names(i - 1)
        Next i

    End With
    ' 描画終わり

End Sub


設定の部分はお好みで。

実行すると,シート上にグラフが現れる。



なお,数値を配列形式で与えてグラフを描く事もできる。

数値を直接コードからに指定してグラフを作成するには?
http://park11.wakwak.com/~miko/Excel_...

(3)どういう場合に必要か?

開発の現場では,

  • 残バグ数
  • 消化済みテストケース数
  • 実装済み機能数

などの進捗をグラフにしたい場合があるが,そういう時に使えるだろう。


補足:ソフトウェア開発における品質保証

残バグ数についての話が出たので,品質保証について少し。


ソフトウェアの品質について勉強したい!と思って調査してみると,見つかる資料は大抵プロマネ語で書いてある。つまり

迅速かつ適切に対処すること

といった,中身のない冗長な文章で埋め尽くされているということだ。


一応下記で概要を見てみよう。

Wikipedia:品質保証
http://ja.wikipedia.org/wiki/%E5%93%8...


ソフトウェアの品質保証
http://www.rsch.tuis.ac.jp/~tamaki/so...


ソフトウェア品質保証は継続的なプロセス
http://techtarget.itmedia.co.jp/tt/ne...


およそを要約すると,ソフトウェアの品質を確保するためには・・・

  • 適切にテスト工程を行うこと
  • 各タスク前に適切な規約を定めること
  • 各タスク後(またはその途中)に適切なレビューを実施すること
  • インシデントの処理フローを適切に定めて遵守すること(BTS利用やITIL風の体制導入)

が求められる。

結局,テストやレビュー等の「各論」を総合して扱ったのが品質保証なのだ。


個々のエンジニアが具体的な対策を取っている物としては,一番目のテスト工程が挙げられるだろう。

しかし,テスト実行のためのツールやコーディング作法には詳しくても,テスト結果の妥当性を数値的・統計的に検証できるという人は少ないのではなかろうか。

(※もちろんそういった検証結果を出したところで,信頼性はまた微妙なのだが…)


テスト結果を見て

このソフトウェアは一定の品質基準を満たしたから,もうテストの必要はない

と主張できる根拠が何かあれば便利かもしれない。

そのための道具の一つがバグ収束曲線

  • 時刻と共に,発見済みバグの個数がどう変化するか?

をグラフにして,何らかの関数をフィットさせたもの。

プログラムバグの成長曲線について(数式による解説付き)
http://www.ne.jp/asahi/jul/1632/Ochib...

回帰させる関数としてはゴンペルツ曲線,シグモイド関数などがある。


テスト工程のあとのほうになって,新規バグ発見件数が減ってくると,グラフの形状が平らになってくる。

その平ら加減の度合いによって,テストの「やめ時」がわかるというわけだ。
(ただし,常に時間と共にバグが一定の割合で見つかるという前提の下でだが・・・)

信頼度成長曲線
http://ja.wikipedia.org/wiki/%E4%BF%A...

収束を見る場合に、横軸に日付を使った場合、テストをしていないからバグが出ないのか、テストをしてもバグが出ないのかの区別がつかないという問題がある。

一つの目安にはなるだろう。

補足2

このページを他の方に紹介する際には,

「『Excel VBA グラフ描画』でググって一番上に来るページを参照してください。」

と言う。

関連する記事:

ドキュメント作成を楽にするための,Excel VBA 頻出8パターン
http://language-and-engineering.hatenablog.jp/entry/20090401/p1


Excel VBAのマクロで,IEを自動操作しよう (DOMセレクタ関数をVBAで自作)
http://language-and-engineering.hatenablog.jp/entry/20090710/p1


Excel VBAのマクロを,複数のブックから利用する方法 (標準モジュールをブックの外部で管理して,共通ライブラリとして読み込み)
http://language-and-engineering.hatenablog.jp/entry/20090731/p1


Word VBA の入門用リンク集 (ワードマクロの,サンプルコードやリファレンス)
http://language-and-engineering.hatenablog.jp/entry/20100314/p1


バッチ職人になろう (WindowsとLinux上での開発業務を自動化するノウハウ集) - 主に言語とシステム開発に関して

http://language-and-engineering.hatenablog.jp/entry/20110904/p1