日々の記録

ほどよく書いてきます。

csvファイルを読み込んでグラフまで作成するマクロ(メモ)

2019年03月24日 23時40分20秒 | プログラム

仕事ではcsvファイルに出力されたデータを同じような出力でまとめる必要がある場合がある。そのときにマクロが便利なのだが、グラフ領域を引き渡したらグラフを作ってくれるものができないかと考えていた。

調べると。Workbooks().sheets().ChartObject.Add()という方法でグラフのオブジェクトを作成してパラメータを設定していくような方法ができるらしいのでその方法で作ってみた。ChartObjectへの値設定のための引数が膨大になるので、GraphParamというものを作って、そこにいろいろな変数を放り込んでおいてグラフ作成サブルーチンを使うという方法をとった。

とりあえず仕事では使い物になっている程度のものはできているが、改造のために家でも同じようなものを作っておく。一部使わなくなったパラメータがあるがご愛嬌。

Option Explicit
Private Type GraphParam
    BookName As String 'グラフ作成対象のブック
    SheetIndex As Integer 'グラフ作成対象のワークシート番号
    SheetName As String 'グラフ作成対象のシート名
    DataStartRow As Long 'データ開始行番号
    TitleRow As Long 'データの凡例?に表示される名前のある行番号
    xPosition As Double 'グラフ左上の出力先x座標
    yPosition As Double '同y座標
    xDataCol As Long 'xy散布図を作るときのxデータの列番号
    yDataStartCol As Long '同yデータ開始列番号(複数データを許容する)
    yDataCount As Long 'yデータの個数(x, y1, y2,,, ynというように複数のデータを持つ散布図が作成できるようにしておく)
    Width As Double 'グラフの幅
    Height As Double 'グラフの高さ
    PlotAreaWidth As Double '多分使わない?
    PlotAreaLeft As Double '同上
End Type

Private Sub CommandButton1_Click()
Dim FileName As String
Dim Fn As Integer
Dim param1 As Double
Dim param2 As Double
Dim i As Long
Dim gp As GraphParam

FileName = Application.GetOpenFilename("csv file, *.csv", , "select a csv file", , False)
If FileName = "False" Then Exit Sub

Workbooks.Add
Fn = FreeFile
i = 1
With ActiveWorkbook.ActiveSheet
    .Cells(i, 2) = "param1"
    .Cells(i, 3) = "param2"
    i = i + 1
    Open FileName For Input As #Fn
        Do Until EOF(Fn)
            Input #Fn, param1, param2
            .Cells(i, 2) = param1
            .Cells(i, 3) = param2
            i = i + 1
        Loop
    Close #Fn
   
End With

gp.BookName = ActiveWorkbook.Name
gp.SheetIndex = ActiveSheet.Index

gp.TitleRow = 1
gp.xDataCol = 2
gp.yDataStartCol = 3
gp.yDataCount = 1

gp.DataStartRow = 2

gp.xPosition = 30
gp.yPosition = 30
gp.Width = 300
gp.Height = 200

Call CreatGraph(gp)
End Sub

Private Sub CreatGraph(GraphParameter As GraphParam)
Dim oGraph As ChartObject
Dim lRows As Long
Dim i As Long
Dim NameOfSheet As String
Dim DataRangeX As String
Dim DataRangeY() As String
Dim DataRangeName() As String
Dim DataRangeCol As Integer

With GraphParameter
    Set oGraph = Workbooks(.BookName).Sheets(.SheetIndex).ChartObjects.Add(.xPosition, .yPosition, .Width, .Height)
    DataRangeCol = .xDataCol
    lRows = Workbooks(.BookName).Sheets(.SheetIndex).Cells(.DataStartRow, .yDataStartCol).End(xlDown).Row
    NameOfSheet = Trim(Workbooks(.BookName).Sheets(.SheetIndex).Name)
    DataRangeX = "=" & NameOfSheet & "!R" & Trim(Str(.DataStartRow)) & "C" & Trim(Str(DataRangeCol)) & ":R" & Trim(Str(lRows)) & "C" & Trim(Str(DataRangeCol))
    
    ReDim Preserve DataRangeY(.yDataCount)
    ReDim Preserve DataRangeName(.yDataCount)
    
    For i = 1 To .yDataCount
        DataRangeCol = .yDataStartCol + i - 1
        DataRangeY(i) = "=" & NameOfSheet & "!R" & Trim(Str(.DataStartRow)) & "C" & Trim(Str(DataRangeCol)) & ":R" & Trim(Str(lRows)) & "C" & Trim(Str(DataRangeCol))
        DataRangeName(i) = "=" & NameOfSheet & "!R" & Trim(Str(.TitleRow)) & "C" & Trim(Str(DataRangeCol))
    Next i
End With

With oGraph.Chart

    For i = 1 To GraphParameter.yDataCount
        .SeriesCollection.NewSeries
        With .SeriesCollection(i)
            .ChartType = xlXYScatterLinesNoMarkers
            .XValues = DataRangeX
            .Values = DataRangeY(i)
            .Name = DataRangeName(i)
            
            
        End With
    Next i

End With
Set oGraph = Nothing

End Sub
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする