2016年5月9日月曜日

グラフ自動作成プログラムの動作確認

1. 目標となるグラフ

  プログラムの動作を確認するために図のようなグラフを目標に動作確認してみます。下の図は手作業で作成した散布図になります。データは、適当に関数を使って作ったものになります。
  図の左側のセルに打ち込んである情報がグラフを作成するために必要な情報です。これを使ってグラフを作ります。繰り返しになりますが、これは手作業で作ったグラフです。グラフのこのテイストは、完全に私の好みです。いつもこういったグラフを作っています。


 

2. プログラムで自動作成したグラフ

今回作ったクラスモジュールで作ったグラフです。フォントのサイズやマーカーの形が若干異なりますが、悪くない出来だと思います。ここではシートに打ち込んだデータからグラフを作成していますが、最終目標は、Accessから読み込んだデータをグラフにして、pptへ貼り付けてレポートの雛型を作ることで、最後にすこしコメントを足して、そのまま完成というのが目標です。



 


 プログラム は、以下のような感じです。最初に「chart_obj」オブジェクトを作成して、そこにプロパティを設定していきます。「series_obj」オブジェクトはデータを追加する部分になっていますが、ベタ書きっぽくなっているのは、最終目標がAccessデータベースからの入力なので、Rangeで一括指定するといった方法は想定していないことが理由です。むしろセルからうまく指定するというプログラムを作るつもりはありません。
 ポイントとしては、プロパティを設定していく操作を、手作業でチャートを作るときの操作に対応させて、処理の粒度もそれくらいにしていることです。プログラムの中身を忘れてしまっても、このコードを見れば、何をする処理なのかがすぐわかることと、中身を知らなくても再利用できるような表現にひとまず、できてるかぁなと思っています。 ということで、ひとまずグラフ作成の部分はこんな感じです。

Private Sub Chart_Create_Button_Click()

    Dim chart_obj As Chart_Class
    Dim series_obj As Series_Class
    
    Set chart_obj = New Chart_Class

    
    'チャートの位置とサイズを決定
    chart_obj.chartLeft = 300
    chart_obj.chartTop = 100
    chart_obj.chartWidth = 400
    chart_obj.chartHeight = 300
    
    '軸の情報を決められたセルから取ってきて、設定
    chart_obj.xTitle = Range("C3").Value
    chart_obj.xMinScale = Range("C4").Value
    chart_obj.xMaxScale = Range("C5").Value
    
    chart_obj.yTitle = Range("D3").Value
    chart_obj.yMinScale = Range("D4").Value
    chart_obj.yMaxScale = Range("D5").Value
    
    
    'データの設定 data1 セルを指定
    Set series_obj = New Series_Class
    series_obj.Name = Range("C7")
    Call series_obj.SetxDataByRange(Range("B8:B28"))
    Call series_obj.SetyDataByRange(Range("C8:C28"))
    chart_obj.seriseData = series_obj
    
    
    'データの設定 data2 セルを指定
    Set series_obj = New Series_Class
    series_obj.Name = Range("D7")
    Call series_obj.SetxDataByRange(Range("B8:B28"))
    Call series_obj.SetyDataByRange(Range("D8:D28"))
    chart_obj.seriseData = series_obj
    
    
    'データの設定 data3 セルを指定
    Set series_obj = New Series_Class
    series_obj.Name = Range("E7")
    Call series_obj.SetxDataByRange(Range("B8:B28"))
    Call series_obj.SetyDataByRange(Range("E8:E28"))
    chart_obj.seriseData = series_obj

End Sub


0 件のコメント:

コメントを投稿