【Excel(エクセル)/マクロ/VBA】棒グラフの自動作成で効率化

スポンサーリンク

f:id:tainers:20200328233410j:plain

『グラフを自動で作成できるようになりたい』

『マクロを使ってグラフを作成したい』

 

この記事では、上記の悩みを解決するために、Excelのマクロを利用してグラフを自動で作成して、単純集計の時間を効率化する方法を図解します。

 

また、この記事で得られる知識やスキルは以下の通りです。

スキル
  • マクロで棒グラフを作成できる
  • マクロで昇順にソートできる
  • マクロでコピペができる
  • マクロで新しいシートを追加できる
  • グラフにデータラベルを表示できる

ではさっそく本題に入っていきます。例として以下のような表があるとしましょう。

f:id:tainers:20200329000316p:plain

この表を利用して、科目ごとに以下のような表を作成します。

f:id:tainers:20200329001638p:plain

マクロの実行までの手順を知りたい方は、以下を参考にしてください。

このグラフ作成のマクロの手順とコードは以下の通り。

手順
  1. 新規シートを作成
  2. グラフ作成に必要なデータをコピペ
  3. 点数を昇順にソート
  4. 棒グラフ作成
  5. データラベル表示
Sub 自動集計()
    
    '--国語--'

        '--新規シートを末尾に追加--'
        Worksheets.Add After:=Sheets(Worksheets.Count)
        ActiveSheet.Name = "国語"
        
        '--国語のデータをコピペ--'
        Worksheets("Sheet1").Range("B1:B11").Copy Destination:=Worksheets("国語").Range("A1")
        Worksheets("Sheet1").Range("D1:D11").Copy Destination:=Worksheets("国語").Range("B1")
        
        '--点数を昇順にソート--'
        Range("A2:B11").Sort Key1:=Range("B2"), Order1:=xlAscending
        
        '--棒グラフ作成--'
        With ActiveSheet.Shapes.AddChart.Chart
    
            .ChartType = xlBarClustered
            .SetSourceData Range("A1:A11, B1:B11")
    
        End With
        
        '--データラベル(値)追加--'
        With ActiveSheet.ChartObjects(1).Chart
            .SeriesCollection(1).HasDataLabels = True
        End With


    '--英語--'
    
        '--新規シートを末尾に追加--'
        Worksheets.Add After:=Sheets(Worksheets.Count)
        ActiveSheet.Name = "英語"
        
        '--英語のデータをコピペ--'
        Worksheets("Sheet1").Range("B1:B11").Copy Destination:=Worksheets("英語").Range("A1")
        Worksheets("Sheet1").Range("E1:E11").Copy Destination:=Worksheets("英語").Range("B1")
        
        '--点数を昇順にソート--'
        Range("A2:B11").Sort Key1:=Range("B2"), Order1:=xlAscending
        
        '--棒グラフ作成--'
        With ActiveSheet.Shapes.AddChart.Chart
    
            .ChartType = xlBarClustered
            .SetSourceData Range("A1:A11, B1:B11")
    
        End With
        
        '--データラベル(値)追加--'
        With ActiveSheet.ChartObjects(1).Chart
            .SeriesCollection(1).HasDataLabels = True
        End With


    '--数学--'
    
        '--新規シートを末尾に追加--'
        Worksheets.Add After:=Sheets(Worksheets.Count)
        ActiveSheet.Name = "数学"
        
        '--数学のデータをコピペ--'
        Worksheets("Sheet1").Range("B1:B11").Copy Destination:=Worksheets("数学").Range("A1")
        Worksheets("Sheet1").Range("F1:F11").Copy Destination:=Worksheets("数学").Range("B1")
        
        '--点数を昇順にソート--'
        Range("A2:B11").Sort Key1:=Range("B2"), Order1:=xlAscending
        
        '--棒グラフ作成--'
        With ActiveSheet.Shapes.AddChart.Chart
    
            .ChartType = xlBarClustered
            .SetSourceData Range("A1:A11, B1:B11")
    
        End With
        
        '--データラベル(値)追加--'
        With ActiveSheet.ChartObjects(1).Chart
            .SeriesCollection(1).HasDataLabels = True
        End With


    '--日本史--'
    
        '--新規シートを末尾に追加--'
        Worksheets.Add After:=Sheets(Worksheets.Count)
        ActiveSheet.Name = "日本史"
        
        '--日本史のデータをコピペ--'
        Worksheets("Sheet1").Range("B1:B11").Copy Destination:=Worksheets("日本史").Range("A1")
        Worksheets("Sheet1").Range("G1:G11").Copy Destination:=Worksheets("日本史").Range("B1")
        
        '--点数を昇順にソート--'
        Range("A2:B11").Sort Key1:=Range("B2"), Order1:=xlAscending
        
        '--棒グラフ作成--'
        With ActiveSheet.Shapes.AddChart.Chart
    
            .ChartType = xlBarClustered
            .SetSourceData Range("A1:A11, B1:B11")
    
        End With
        
        '--データラベル(値)追加--'
        With ActiveSheet.ChartObjects(1).Chart
            .SeriesCollection(1).HasDataLabels = True
        End With


    '--物理--'
    
        '--新規シートを末尾に追加--'
        Worksheets.Add After:=Sheets(Worksheets.Count)
        ActiveSheet.Name = "物理"
        
        '--物理のデータをコピペ--'
        Worksheets("Sheet1").Range("B1:B11").Copy Destination:=Worksheets("物理").Range("A1")
        Worksheets("Sheet1").Range("H1:H11").Copy Destination:=Worksheets("物理").Range("B1")
        
        '--点数を昇順にソート--'
        Range("A2:B11").Sort Key1:=Range("B2"), Order1:=xlAscending
        
        '--棒グラフ作成--'
        With ActiveSheet.Shapes.AddChart.Chart
    
            .ChartType = xlBarClustered
            .SetSourceData Range("A1:A11, B1:B11")
    
        End With
        
        '--データラベル(値)追加--'
        With ActiveSheet.ChartObjects(1).Chart
            .SeriesCollection(1).HasDataLabels = True
        End With

End Sub
最後に

グラフの作成は、手作業で行うとなかなか時間がかかったりします。

 

上記の点数表ようにあまりフォーマットが変わらないものであれば、マクロを組んでいた方が作業効率化ができます。もちろん多少フォーマットが違っていてもマクロを組んで対応させることは可能です。

 

行や列の数に応じて、Range()の中身を変更できるので、ぜひ参考にしてください。

また、このマクロで必要になるコピペ、シート追加についてのより詳しい知識を知りたい方は下記をご覧ください。

下記の書籍は、とても見やすく簡潔にマクロの使用方法が書かれているので、作業効率化のために勉強しようと思っている人にはとてもおすすめです。

また、マクロはショートカットキーを設定することもできます。もし、興味がある方は以下をご覧ください。