LoginSignup
1
0

Excel VBAで複数項目の時系列csvファイルをグラフ化

Last updated at Posted at 2024-04-24

概要

下記のような形式の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


1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0