グラフの作成

表のデータからグラフを作成します。
グラフの作成にはオブジェクトを作成し、操作していきます。
グラフといっても様々ありますが、スタンダードな「折れ線グラフ」、「棒グラフ」を例として挙げています。ついでに「棒グラフ」の派生として、「行,列の入れ替え」と「3D積み上げ棒グラフ」も追加しています。

Excelマクロから、データの入ったファイルを読み出して、新しいファイルを作成します。
新しいファイルに、データとグラフをシートを別けて保存するという流れになっています。

例:Excelマクロのファイルに、設定を記載します

例:果物の出荷量を月ごとにまとめた表(果物出荷数.xlsx – 果物)

【サンプルプログラム】

Sub Graph_Create()
    Dim this_wb As Workbook
    Dim in_wb As Workbook
    Dim in_ws As Worksheet
    Dim out_wb As Workbook
    Dim out_ws As Worksheet
    Dim out_data_ws As Worksheet
    
    Dim in_filename As String
    Dim in_sheetname As String
    Dim out_filename As String
    Dim graph_title As String

    Dim graph_range As String
    Dim g_chart As Chart
    Dim x_pos As Long
    Dim y_pos As Long


    ' VBA マクロを実行しているワークブックを取得
    Set this_wb = ThisWorkbook
    
    ' Sheet1 に設定情報を定義してあるので読み出し
    With this_wb.Sheets(1)
        in_filename = .Range("B1")
        in_sheetname = .Range("B2")
        out_filename = .Range("B3")
        graph_title = .Range("B4")
    End With


    ' 出力先のワークブックを作成
    Set out_wb = Workbooks.Add
    ' グラフを出力する Sheetを取得し、名前の変更
    Set out_ws = out_wb.Sheets(1)
    out_ws.Name = "グラフ"


    ' 入力元のワークブックを開く
    If IsFileExists(in_filename) = False Then   ' ファイルの有無を確認
        MsgBox in_filename & "は存在しません", vbExclamation
        Exit Sub
    End If
        
    ' ワークブックを開く
    Set in_wb = Workbooks.Open(in_filename)

    ' Sheet を出力先のワークブックにコピーする
    in_wb.Sheets(in_sheetname).Copy Before:=out_ws
    
    ' ブックを閉じる(保存しない)
    in_wb.Close SaveChanges:=False
    
    ' データのSheetを保持しておく
    Set out_data_ws = out_wb.Sheets(in_sheetname)

    ' データ部の範囲
    graph_range = in_sheetname & "!" & "A1:" & _
                    GetLastColumnStr(out_data_ws) & GetLastRowStr(out_data_ws)
    
    ' グラフを表示するシートをアクティブにします
    out_ws.Activate


    ' ----------------------------------------------
    ' 折れ線グラフの作成
    
    ' チャートの追加
    Set g_chart = out_ws.Shapes.AddChart2(227, xlLine).Chart
    
    ' データの設定
    g_chart.SetSourceData Source:=Range(graph_range)
    ' タイトルの変更
    g_chart.ChartTitle.Text = graph_title
    ' 凡例の表示
    g_chart.SetElement (msoElementLegendBottom)
    
    ' グラフ表示位置 (B2から開始)
    x_pos = 2
    y_pos = 2
    
    With g_chart.ChartArea
        ' グラフの左端を変更
        .Left = out_ws.Range(Cells(y_pos, x_pos).Address).Areas.Item(1).Left
        ' グラフの上端を変更
        .Top = out_ws.Range(Cells(y_pos, x_pos).Address).Areas.Item(1).Top
        ' グラフの幅を変更
        .Width = 500
        ' グラフの高さを変更
        .Height = 250
    End With

    
    ' ----------------------------------------------
    ' 棒グラフの作成
    
    ' チャートの追加
    Set g_chart = out_ws.Shapes.AddChart2(201, xlColumnClustered).Chart
    ' データの設定
    g_chart.SetSourceData Source:=Range(graph_range)
    ' タイトルの変更
    g_chart.ChartTitle.Text = graph_title
    ' 凡例の表示
    g_chart.SetElement (msoElementLegendBottom)
    
    ' グラフ表示位置
    y_pos = y_pos + 15
    
    With g_chart.ChartArea
        ' グラフの左端を変更
        .Left = out_ws.Range(Cells(y_pos, x_pos).Address).Areas.Item(1).Left
        ' グラフの上端を変更
        .Top = out_ws.Range(Cells(y_pos, x_pos).Address).Areas.Item(1).Top
        ' グラフの幅を変更
        .Width = 500
        ' グラフの高さを変更
        .Height = 250
    End With
    
    
    ' ----------------------------------------------
    ' 棒グラフの作成(行列の切り替え)
    
    ' チャートの追加
    Set g_chart = out_ws.Shapes.AddChart2(201, xlColumnClustered).Chart
    ' データの設定
    g_chart.SetSourceData Source:=Range(graph_range)
    ' タイトルの変更
    g_chart.ChartTitle.Text = graph_title
    ' 凡例の表示
    g_chart.SetElement (msoElementLegendBottom)
    ' 行列の切り替え
    g_chart.PlotBy = xlColumns
    
    ' グラフ表示位置
    y_pos = y_pos + 15
    
    With g_chart.ChartArea
        ' グラフの左端を変更
        .Left = out_ws.Range(Cells(y_pos, x_pos).Address).Areas.Item(1).Left
        ' グラフの上端を変更
        .Top = out_ws.Range(Cells(y_pos, x_pos).Address).Areas.Item(1).Top
        ' グラフの幅を変更
        .Width = 500
        ' グラフの高さを変更
        .Height = 250
    End With
    
    
    ' ----------------------------------------------
    ' 3D積み上げ縦棒グラフの作成
    ' チャートの追加
    Set g_chart = out_ws.Shapes.AddChart2(286, xl3DColumnStacked).Chart
    ' データの設定
    g_chart.SetSourceData Source:=Range(graph_range)
    ' タイトルの変更
    g_chart.ChartTitle.Text = graph_title
    ' 凡例の表示
    g_chart.SetElement (msoElementLegendBottom)
    
    ' グラフ表示位置
    y_pos = y_pos + 15
    
    With g_chart.ChartArea
        ' グラフの左端を変更
        .Left = out_ws.Range(Cells(y_pos, x_pos).Address).Areas.Item(1).Left
        ' グラフの上端を変更
        .Top = out_ws.Range(Cells(y_pos, x_pos).Address).Areas.Item(1).Top
        ' グラフの幅を変更
        .Width = 500
        ' グラフの高さを変更
        .Height = 250
    End With

    ' 名前を付けて保存(既にファイルがある場合、上書き保存)
    Application.DisplayAlerts = False   ' 確認メッセージを非表示
    out_wb.SaveAs out_filename          ' ファイルを出力
    Application.DisplayAlerts = True    ' 確認メッセージを表示(元に戻す)

End Sub

【成果物】

【補足】
棒グラフ作成する際の「AddChart2(201, xlColumnClustered)」など、他のグラフを作成したい時は、「マクロの記録」で試しにグラフを作成してみてください。
その時に残るグラフの設定値に置き換えることで別のグラフになるので、試してみてください。

コメント