2016年5月11日水曜日

グラフ化するデータの構造

1. 測定データの例


 以下のようなデータを考えます。温度を変えながら測定した結果を想定します。適当な関数を使って、データを生成しました。測定サンプル(N=5)としていて、少し特性を変えています。また、測定方法を変えた場合を想定して、「MeasureA」, 「MeasureB」と2つの結果を配置しました。

  このデータの配置方法では、横軸を温度で表示するグラフは簡単に作成できますが、それ以外の値を横軸に取った場合は少し 手間が増えます。左下のグラフに作りましたが、例えば5つの測定サンプルはサイズを変えて試作した試料だとします。その場合は、サイズに対する依存性を確認する必要があり、横軸をサイズ、縦軸を測定値(MeasureA@80℃)を取り出しました。

 Excelで作業することで、データからグラフ作成の操作などが視覚的でわかりやすいというのは利点なのですが、繰り返し処理をすることを考えると効率が下がります。
 
 そこで、Accessデータベースにデータを格納して、必要な形でデータを抽出&グラフ作成をするプログラムを作成します。





2. Accessデータベースに入力

Access2013にデータを入力します。テーブルを設計して、そのテーブルにデータを入力します。テーブルの設計といっても、簡単なテーブルでの例となります。テーブルは、図のように定義します。
  • Name:測定名
  • Sample:サンプル名
  • Temp:温度
  • Data:測定結果 
 を作成しました。



次に、データを入力します。入力した結果が下図のようになります。そのままグラフに作りにくい形式のように見えますがデータを取り出すときのクエリを工夫することで効率的にグラフを作成します。データの保存をAcess, グラフの作成をExcelでやります。




3. データ抽出のサンプルプログラムの実行結果

 データを抽出した結果を示します。データベースのファイル名と測定名、サンプル名を入力として、その条件での測定結果を抽出するというプログラムになっています。TempとDataのペアになっているのでこのデータを使ってグラフを作成することができる形です。この例は読み出したデータをそのままセルに入力ものとなっています。

 


 4. プログラム紹介

プログラムのソースコードを示します。


Private Sub ReadDataBase_Click()


    Dim ado_con_obj     As New ADODB.Connection
    Dim ado_rs_obj      As New ADODB.Recordset
    Dim sql_string      As String
    Dim db_path      As Variant
    
    db_path = ActiveWorkbook.Path & "\" & Range("H8").Value
 
    ado_con_obj.ConnectionString = "provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & db_path
    ado_con_obj.Open
 
    
    sql_string = " SELECT T_データ.[Name], T_データ.[Sample], T_データ.[Temp], T_データ.[Data]" _
               & " FROM T_データ WHERE (((T_データ.Name)='" & Range("H9").Value & "') AND ((T_データ.[Sample])='" & Range("H10").Value & "')) ;"

    ado_rs_obj.Open sql_string, ado_con_obj, adOpenDynamic

    
    Dim i, j As Integer
    
    i = 1

    '最初の列に、Nameを入れます。
    For j = 0 To ado_rs_obj.Fields.Count - 1
        Cells(i, j + 1) = ado_rs_obj.Fields(j).Name
    Next

    i = 2

    'レコードの最後まで順番に読み出してセルに入力します。
    Do Until ado_rs_obj.EOF
    
        For j = 0 To ado_rs_obj.Fields.Count - 1
            Cells(i, j + 1) = ado_rs_obj.Fields(j).Value
        Next
        
        ado_rs_obj.MoveNext
    
        i = i + 1
    
    Loop
    
    
    
End Sub


0 件のコメント:

コメントを投稿