概要
下記のような形式のcsvの時系列データについて、毎回グラフ化するのが面倒だったので
マクロを作りました。
数が増えてくると、設定するのが大変だったので
Time | データA列 | データB列 | データC列 |
---|---|---|---|
1 | A1 | B1 | C1 |
2 | A2 | B2 | C2 |
3 | A3 | B3 | C3 |
… | … | … | … |
使い方
Main()マクロ実行後、上記の形式のcsvファイルをライブラリで選択してください。
あとはSheet1のシートにグラフが系列の数の分作成されます。
データ列はこれより数十個に増えても動作します。
各図の表題は、データn列となりグラフが、作られます。お好みに合わせて修正して下さい。
ソースコード
' 概要: シートをクリアして、csvからグラフを作成
Sub Main()
CopyCSVContents
CreateGraphs
End Sub
' 概要: csvファイルを取り込む
Sub CopyCSVContents()
Dim csvLine As String
Dim csvValues As Variant
Dim csvFilePath As String
Dim rowIndex As Long, columnIndex As Long
' CSVファイルのパスをダイアログで指定
csvFilePath = Application.GetOpenFilename("CSVファイル (*.csv), *.csv")
' ADODBストリームオブジェクトを作成
With CreateObject("ADODB.Stream")
.Charset = "UTF-8"
.Open
.LoadFromFile csvFilePath
' ストリームの終端までループを実行
Do Until .EOS
csvLine = .ReadText(-2)
rowIndex = rowIndex + 1
csvValues = Split(csvLine, ",")
For columnIndex = 0 To UBound(csvValues)
' CSVの値をExcelシートに挿入
Cells(rowIndex, columnIndex + 1) = csvValues(columnIndex)
Next columnIndex
Loop
.Close
End With
End Sub
' 概要: グラフを作成する。
Sub CreateGraphs()
Dim ChartOne As Chart
Dim RngGraph As Range
Dim i As Integer
Dim lastRow As Long
Dim lastColumn As Long
' ワークシートを指定
Set ws = ThisWorkbook.Sheets("Sheet1")
' 最終行列の取得
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
lastColumn = ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column
' グラフを作成するためのループ処理を開始
For i = 1 To lastColumn - 1
' グラフの表示位置とサイズの設定
Set RngGraph = Cells(2 + 10 * (i - 1), 2).Resize(10, 20)
Set ChartObj = ActiveSheet.ChartObjects.Add(RngGraph.Left, RngGraph.Top, RngGraph.Width, RngGraph.Height)
Set ChartOne = ChartObj.Chart
' A列をx軸、i+1列をy軸として範囲を格納
Set chartRangeX = ws.Range(Cells(2, 1), Cells(lastRow, 1))
Set chartRangeY = ws.Range(Cells(2, i + 1), Cells(lastRow, i + 1))
' グラフの種類を散布図に設定
ChartObj.Chart.ChartType = xlXYScatterSmoothNoMarkers
' データ範囲を設定
ChartObj.Chart.SetSourceData Source:=Union(chartRangeX, chartRangeY)
' タイトルを設定
ChartObj.Chart.HasTitle = True
ChartObj.Chart.ChartTitle.Text = ws.Cells(1, i + 1).Value
' 注釈を非表示
ChartObj.Chart.HasLegend = False
Next i
MsgBox "グラフを " & lastColumn - 1 & " 個作成しました。"
End Sub