Excel VBA グラフ操作

Excel VBA のトップに戻る
Excel VBA 目次

シートの位置を指定して、複数の領域を含む、複数のグラフを表示
2軸グラフを作成する
散布図(多重)を作成する
ヒストグラム(度数分布縦棒グラフ)を作成する
二重のドーナツグラフを作成する

索引


VBA便利帳
http://www2s.biglobe.ne.jp/iryo/index.html
の、「グラフ作成資料」が役に立ちます。
http://www2s.biglobe.ne.jp/iryo/2vba/chart/chart00.html

Office TANAKA
http://officetanaka.net/index.stm
の、「Excel 2007以降のグラフ」や、
http://officetanaka.net/excel/vba/graph/index.htm
「棒グラフにデータラベルを設定する」も参考になります。
http://officetanaka.net/excel/vba/graph/14.htm


シートの位置を指定して、複数の領域を含む、複数のグラフを表示

 上の、同上の補完のデータを使って、男女比の円グラフを、クラス毎に描いてみましょう。各クラスのデータをグラフにして、ワークシート上に、それぞれの位置を指定して、追加します。

 事例のシートのように、一般に、グラフ項目に使う横方向の項目名は、最上行にしか書かれていません。このため、グラフを書くための「データ範囲」は、項目部分と数値部分の、複数(飛び石)のセル範囲を指定することになります。
 ここでは、For 〜 Next で場所をずらせながら、UnionRangeCellsResize の4つを組み合わせて、複数のセル範囲を取得します。
 Resize を使うには、ワークシートのウインドウがアクティブになっている必要があります。このため、アクティブなウインドウがグラフシートに移る前に (ChartObjects を追加する前に)、変数に Range を格納します。

 グラフを、ワークシートの指定位置に配置するには、ChartObjects の Add メソッドを使います。
 そして、ChartObjects(index) メソッドを使って、単体の ChartObject オブジェクトを取得して、グラフを描画します。

 注:ChartObjects の Add メソッド を使うと、自動で順に index が付けられます。index だと、後から指定するときに不便です。そのため、名前を付けると良いでしょう。

 このマクロの事例をダウンロードできます。→MultipleGraphsVBA01.xls



Sub グラフ作成()
Const 表示シート As String = "生徒数"
Dim クラス行 As Integer
Dim 学年 As String
Dim クラス As String
Dim グラフデータ As Range
Dim グラフ描画エリア As Range

   Worksheets(表示シート).Activate
   If ActiveSheet.ChartObjects.Count > 0 Then    '既存のグラフがあれば
      ActiveSheet.ChartObjects.Delete            '全て削除する
   End If

    'B列(2列目)を基準に最後の行まで処理。
    'クラスは2行で一組なので、行数を2で整数割り算してクラス数を求めている。
    For クラス行 = 1 To Cells(ActiveSheet.Rows.Count, 2).End(xlUp).Row \ 2
        
        'アクティブなシートが、グラフシートに移る前に、
        'ワークシートのセルデータを変数に格納しておく。
        Worksheets(表示シート).Activate
        '新しい「学年」データが出現したら、変数「学年」に収納し直す。
        If Range("A1").Cells(クラス行 * 2, 1).Value <> "" Then
            学年 = Range("A1").Cells(クラス行 * 2, 1).Value
        End If
        クラス = Range("B1").Cells(クラス行 * 2, 1).Value
        
        Set グラフデータ _
        = Union(Range("C1").Resize(1, 2), Range("C1").Cells(クラス行 * 2, 1).Resize(2, 2))
        'Resizeは、ワークシートを参照するため、グラフに移る前に、セルのレンジを変数に格納しておく。

        'グラフを、10行の高さ、5列の大きさで、1行置きに描く。
        Set グラフ描画エリア = Range("H1").Cells(クラス行 * 11 - 10, 1).Resize(10, 5)

        ActiveSheet.ChartObjects.Add _
            Left:=グラフ描画エリア.Left, Top:=グラフ描画エリア.Top, _
            Width:=グラフ描画エリア.Width, Height:=グラフ描画エリア.Height
        
        With ActiveSheet.ChartObjects(クラス行).Chart
            .ChartType = xlPie
            .SetSourceData _
                Source:=グラフデータ _
                , PlotBy:=xlColumns
'            .HasTitle = True 'Excel97で動かないので、コメントアウト
            .ChartTitle.Characters.Text = 学年 & クラス
        End With
        
        '***********************************
        '以下は、グラフの体裁を修正しているだけです。
        ActiveSheet.ChartObjects(クラス行).Activate

        ActiveChart.ChartArea.Select
'       Excel97〜用
        ActiveChart.ApplyDataLabels _
            Type:=xlDataLabelsShowLabelAndPercent _
            , LegendKey:=False _
            , HasLeaderLines:=True

'       Excel2003専用
'        ActiveChart.ApplyDataLabels _
'            AutoText:=True _
'            , LegendKey:=False _
'            , HasLeaderLines:=True
'            , ShowSeriesName:=True _
'            , ShowCategoryName:=True _
'            , ShowValue:=True _
'            , ShowPercentage:=True _
'            , ShowBubbleSize:=False


        ActiveChart.Legend.Select
        ActiveChart.Legend.LegendEntries(1).LegendKey.Select
        With Selection.Border
            .Weight = xlThin
            .LineStyle = xlAutomatic
        End With
        Selection.Shadow = False
        With Selection.Interior
            .ColorIndex = 3
            .Pattern = xlSolid
        End With
        ActiveChart.Legend.LegendEntries(2).LegendKey.Select
        With Selection.Border
            .Weight = xlThin
            .LineStyle = xlAutomatic
        End With
        Selection.Shadow = False
        With Selection.Interior
            .ColorIndex = 5
            .Pattern = xlSolid
        End With

        ActiveChart.PlotArea.Select
            Selection.Width = 70
            Selection.Height = 70
            Selection.Left = 70
            Selection.Top = 30
        '***********************************

        ActiveChart.ChartArea.Select
        ActiveWindow.Visible = False
        Worksheets(表示シート).Activate
        Range("A1").Select
    Next クラス行
End Sub

 解説:
 Union メソッドは、2 つ以上のセル範囲の集合を返します。
 ここでは、グラフに使う、項目の軸ラベル部分と、グラフ・データ部分の、2つのデータ範囲を指定するために、Union を使っています。
 また、For Nextで、クラス行を下(行)方向に移動させながら、Resize を使って、それぞれのグラフ・データの範囲を、取得しています。

 expression.Union(Arg1, Arg2, ...)

 expression 省略可能です。Application オブジェクトを返すオブジェクト式を指定します。
 Arg1, Arg2, ... 必ず指定します。集合させるセル範囲 (Range オブジェクト) を指定します。複数の Range オブジェクトを指定する必要があります。

 ChartObjects コレクション オブジェクトは、指定されたグラフ シート、ダイアログ シート、またはワークシートにある、すべての ChartObject オブジェクトのコレクションです。
 各 ChartObject オブジェクトは埋め込みグラフを表します。ChartObject オブジェクトは、Chart オブジェクトのコンテナとして機能します。
 ChartObject オブジェクトのプロパティとメソッドは、シートにある埋め込みグラフの、外観と大きさを制御します。

 ChartObjects コレクションには、1 つのシートにあるすべての埋め込みグラフが含まれています。
 空の埋め込みグラフを新しく作成して、コレクションに追加するには、Add メソッドを使います。
 新しい埋め込みグラフにデータをプロットし、書式を設定するには、ChartWizard メソッドを使います。
 次の例は、埋め込みグラフを新しく作成し、セル範囲 A1:A20 のデータを折れ線グラフとして追加します。


Dim ch As ChartObject
Set ch = Worksheets("sheet1").ChartObjects.Add(100, 30, 400, 250)
ch.Chart.ChartWizard source:=Worksheets("sheet1").Range("a1:a20"), _
    gallery:=xlLine, title:="New Chart"

 単体の ChartObject オブジェクトを取得するには、ChartObjects(index) メソッドを使用します。
 引数 index には、埋め込みグラフのインデックス番号または名前を指定します。
 次の使用例は、シート 1 の埋め込みグラフ 1 のグラフ エリアにパターンを設定します。


Worksheets("Sheet1").ChartObjects(1).Chart. _
    ChartArea.Interior.Pattern = xlLightDown


 ChartObjects オブジェクトの Add メソッドは、新しい埋め込みグラフを作成します。ChartObject オブジェクトを返します。

expression.Add(Left, Top, Width, Height)

 expression 必ず指定します。対象となる ChartObjects コレクションを返すオブジェクト式を指定します。

 Left , Top 必ず指定します。倍精度浮動小数点型 (Double) の値を使用します。ワークシートのセル A1 の左上端またはグラフの左上端を基準に、新しいオブジェクトを配置する最初の位置をポイント単位で指定します。

 Width , Height 必ず指定します。倍精度浮動小数点型 (Double) の値を使用します。新しいオブジェクトの幅と高さのサイズをポイント単位で指定します。
 ChartObjects の Add メソッド を使うと、自動で順に index が付けられます。index だと、後から指定するときに不便です。そのため、名前を付けると良いでしょう。


 ChartObjects メソッドは、単一の埋め込みグラフ (ChartObject オブジェクト)、またはシートにあるすべての埋め込みグラフのコレクション (ChartObjects コレクション) を返します。

 expression.ChartObjects(Index)
 expression 必ず指定します。対象となるオブジェクトへの参照を返すオブジェクト式を指定します。対象が Chart オブジェクトの場合、そのオブジェクトはグラフ シートでなければなりません。埋め込みグラフを表す Chart オブジェクトは指定できません。

 Index グラフの名前またはインデックス番号を指定します。配列を使うと、複数のグラフを指定できます。

 グラフを数えて、自動で追い番を付けることもできます。


Dim グラフ数 As Integer

        グラフ数 = ActiveSheet.ChartObjects.Count + 1

        ActiveSheet.ChartObjects.Add _
            Left:=グラフ描画エリア.Left, Top:=グラフ描画エリア.Top, _
            Width:=グラフ描画エリア.Width, Height:=グラフ描画エリア.Height
        
        With ActiveSheet.ChartObjects(グラフ数).Chart
         〜
        End With

 ChartObjects メソッドは、Charts プロパティとは異なった動作をします。
 ChartObjects メソッドが埋め込みグラフを返すのに対して、Charts プロパティはグラフ シートを返します。埋め込みグラフ (Chart オブジェクト) を取得するには、Chart プロパティを使います。

 次の例は、シート 1 の埋め込みグラフ 1 にタイトルを追加します。


With Worksheets("Sheet1").ChartObjects(1).Chart
    .HasTitle = True
    .ChartTitle.Text = "1995 年月間降水量"
End With

 次の例は、シート 1 の埋め込みグラフ 1 に新しいデータ系列を追加します。新しいデータ系列の基になるデータとしてシート 1 のセル範囲 B1:B10 を指定しています。


Worksheets("Sheet1").ChartObjects(1).Activate
ActiveChart.SeriesCollection.Add _
    source:=Worksheets("Sheet1").Range("B1:B10")

 次の例は、シート 1 の埋め込みグラフ 1 の書式を削除します。


Worksheets("Sheet1").ChartObjects(1).Chart.ChartArea.ClearFormats

 解説:
 Clear メソッド
 Clear メソッドを ChartArea オブジェクト、Legend オブジェクト、Range オブジェクトに指定した場合、オブジェクト全体をクリアします。

 ClearContents メソッド
 Range オブジェクトに指定した場合、情報選択範囲から数式と文字を削除します。
 ChartArea オブジェクトに指定した場合、グラフからグラフの書式を残したままデータ (系列) を削除します。

 ClearFormats メソッド
 オブジェクトの書式設定を削除します。


 グラフの体裁の修正は、Excelの「マクロの記録」機能を使って、VBAコードを生成します。
注:Excel 2007はグラフやオートシェイプなど、新グラフィックエンジン「SmartArt」関係は、マクロ記録をしても何も記録されません。Excel 2003 以前か、Excel 2010 を使いましょう。

 ApplyDataLabels メソッドは、データ要素、1 つのデータ系列、またはすべてのデータ系列にデータ ラベルを付けます。

 expression.ApplyDataLabels(Type, LegendKey, AutoText, HasLeaderLines, ShowSeriesName, ShowCategoryName, ShowValue, ShowPercentage, ShowBubbleSize, Separator)

 expression 必ず指定します。対象となるオブジェクトへの参照を返すオブジェクト式を指定します。

 Type 省略可能です。XlDataLabelsType クラスの定数を使用します。データ ラベルの種類を指定します。
 使用できる定数は、次に示す XlDataLabelsType クラスのいずれかです。
xlDataLabelsShowBubbleSizes
xlDataLabelsShowLabelAndPercent全体のパーセンテージと要素の項目名。円グラフとドーナツ グラフだけに指定できます。
xlDataLabelsShowPercent全体のパーセンテージ。円グラフとドーナツ グラフだけに指定できます。
xlDataLabelsShowLabelデータ要素の属する項目名。
xlDataLabelsShowNoneデータ ラベルなし。
xlDataLabelsShowValue (既定値)データ要素の値 (引数を省略すると仮定した場合)。

 LegendKey True を指定すると、要素の隣に凡例マーカーが表示されます。既定値は False です。
注:以下は、Excel2003専用です。
 AutoText オブジェクトにより、内容を基にした適切な文字列を自動作成させる場合は True を指定します。
 HasLeaderLines Chart、または Series オブジェクトにおいて、引き出し線のあるデータ系列の場合は True を指定します。
 ShowSeriesName データ ラベルに系列名を表示するかどうかを指定します。
 ShowCategoryName データ ラベルに分類名を表示するかどうかを指定します。
 ShowValue データ ラベルに値を表示するかどうかを指定します。
 ShowPercentage データ ラベルにパーセンテージを表示するかどうかを指定します。
 ShowBubbleSize データ ラベルにバブル サイズを表示するかどうかを指定します。
 Separator データ ラベルの区切り文字を指定します。


 LegendEntries メソッドは、単一の凡例文字列 (LegendEntry オブジェクト)、または凡例文字列のコレクション (LegendEntries コレクション) を返します。いずれの場合も、対象となるのは凡例です。

 expression.LegendEntries(Index)

 expression 必ず指定します。対象となる Legend オブジェクトを返すオブジェクト式を指定します。
 Index 凡例文字列のインデックス番号を指定します。

 次の例は、グラフ 1 の凡例文字列 1 のフォントを設定します。

Charts("Chart1").Legend.LegendEntries(1).Font.Name = "MS Pゴシック"


 PlotArea プロパティは、グラフのプロット エリア (PlotArea オブジェクト) を返します。値の取得のみ可能です。

この種類の目次に戻る↑ 索引へ↓ トップページに戻る


2軸グラフを作成する

 Excel で、2軸グラフを書く方法は、こちらに書きました。
 ここでは、マクロで2軸グラフを書くためのコードを紹介します。

 このコードは、アプリケーションとしてのVBA の、
 2軸のグラフをデータ系列毎に分けてグラフを作成する
http://www.k1simplify.com/vba/tipsleaf/graph05.html
を参考にさせていただきました。
ABCD
1品目価格数量金額
2Aランチ 1,200 50 60,000
3Bランチ 1,000 60 60,000
4Cランチ 800 120 96,000
5お子様 600 40 24,000
2軸グラフ

Option Explicit
Option Base 1

Sub ニ軸グラフ()

Dim グラフデータ(2) As Range
Dim グラフ描画エリア As Range

   '「Sheet1」シートに移動して、グラフ用のデータを取得
   ThisWorkbook.Worksheets("Sheet1").Activate
   Set グラフデータ(1) = Range("A1:A5,D1:D5") '棒グラフ用
   Set グラフデータ(2) = Range("C2:C5")       '折れ線グラフ用

   '「Sheet2」シートに移動して、グラフを作成
   ThisWorkbook.Worksheets("Sheet2").Activate
   Set グラフ描画エリア = Range("B2:G15")
   
   ActiveSheet.ChartObjects.Add _
   Left:=グラフ描画エリア.Left, Top:=グラフ描画エリア.Top, _
   Width:=グラフ描画エリア.Width, Height:=グラフ描画エリア.Height
        
   With ActiveSheet.ChartObjects(1).Chart
      .ChartType = xlColumnClustered       '棒グラフ★★★
       .SetSourceData Source:=グラフデータ(1) _
           , PlotBy:=xlColumns             '列をデータ系列として使用
      .HasTitle = False                    'グラフ名を表示しない
      .HasLegend = True                    '凡例付き
      .HasDataTable = False
      .SeriesCollection(1).HasDataLabels = True 'データラベルを表示する
      .Axes(xlValue).MaximumScale = 100000 '軸の最大値を100,000に固定する
      .Axes(xlValue).HasTitle = True       '軸タイトルを表示する
      .Axes(xlValue).AxisTitle.Text = "金額(円)"
      .PlotArea.Interior.ColorIndex = 2    'グラフの背景色を、グレーではなく、白にする
   End With

   ActiveSheet.ChartObjects(1).Activate
   '新しくデータ系列を作成
   ActiveChart.SeriesCollection.NewSeries
   'グラフの種類、データの範囲、凡例、2軸の使用を指定。
   With ActiveChart.SeriesCollection(2)
      .ChartType = xlLineMarkers           '折れ線グラフ★★★
      'データの指定
      .Values = グラフデータ(2)
      .HasDataLabels = True                'データラベルを表示する
      .Name = "数"                         '凡例用の名前
      .AxisGroup = 2                       '第2軸にする
   End With
   With ActiveChart
         .Axes(2, 2).MaximumScale = 150 '2軸目の最大値を150に固定する
         .Axes(2, 2).HasTitle = True    '2軸目のタイトルを表示する
         .Axes(2, 2).AxisTitle.Text = "数"
   End With
   
   Set グラフ描画エリア = Nothing
   Set グラフデータ(1) = Nothing
   Set グラフデータ(2) = Nothing
      
   Range("A1").Select

End Sub

 解説:
 Axis オブジェクトは、グラフの 1 つの軸を表します。Axis オブジェクトは、Axes コレクションのメンバーです。
 ちなみに、axis とは、軸のことで、複数形が axes になります。
 単体の Axis オブジェクトを取得するには、Axes(type, group) メソッドを使用します。
 引数 type には、軸の種類を指定します。引数 group には、軸のグループを指定します。引数 type に使用できる定数は、XlAxisType クラスの xlCategory、xlSeries、xlValue のいずれかです。引数 group に使用できる定数は、XlAxisGroup クラスの xlPrimary または xlSecondary です。

 次の例は、グラフ 1 というグラフ シートの項目軸ラベルの文字列を設定します。

With Charts("chart1").Axes(xlCategory)
    .HasTitle = True
    .AxisTitle.Caption = "1994"
End With


 Axes メソッド は、オブジェクトを返すメソッドです。単一の軸、またはグラフのすべての軸を返します。
 expression.Axes(Type, AxisGroup)
 expression   必ず指定します。Chart オブジェクトを返すオブジェクト式を指定します。
 Type   省略可能です。バリアント型 (Variant) の値を使用します。軸の種類を指定します。使用できる定数は、XlAxisType クラスの xlValuexlCategoryxlSeriesAxis のいずれかです。xlSeriesAxis は 3-D グラフでだけ使用できます。
 AxisGroup   省略可能です。XlAxisGroup クラスの定数を使用します。軸のグループを指定します。この引数を省略すると、主軸グループが使われます。3-D グラフでは、軸のグループは 1 つしかありません。
XlAxisGroup クラスの定数とは、次のいずれかです。
xlPrimary (既定値)
xlSecondary

 次の例は、グラフ 1 の項目軸に軸ラベルを追加します。
With Charts("Chart1").Axes(xlCategory)
    .HasTitle = True
    .AxisTitle.Text = "7 月度売上"
End With
 次の例は、グラフ 1 の項目軸の目盛線の表示をオフにします。
Charts("Chart1").Axes(xlCategory).HasMajorGridlines = False
 次の例は、グラフ 1 のすべての軸の目盛線と補助目盛線の表示をオフにします。
For Each a In Charts("Chart1").Axes
    a.HasMajorGridlines = False
    a.HasMinorGridlines = False
Next a

この種類の目次に戻る↑ 索引へ↓ トップページに戻る


散布図(多重)を作成する

体重と身長の分布  2つの値を持つ項目の、複数の母集団の分布の違いを、散布図を積み重ねて描いて、見えるようにします。
 ここでは、ある中学校の一年〜三年の生徒の、体重と身長の相関の分布を、比較します。

 データは、一つのシートに、登録されています。前もって、学年順にソートしておいて、下のマクロでは、学年の区切りを判定して、グラフ・データの範囲(Range)を取得しています。

 このデータとマクロを、ダウンロードできます。→ScatterChartVBA01.xls

Option Explicit

'******************************************************
Sub 散布図作成()
'******************************************************
   
   Dim 学年 As String
   Dim 学年前 As String
   Dim グラフデータ(3, 3) As Range 'X軸、Y軸、系列名
   Dim 基本グラフデータ As Range
   Dim グラフ描画エリア As Range
   Dim カウンタ As Integer
   Dim しきい行 As Integer
   Dim 最終行 As Integer
   Dim 処理行 As Integer
   Dim 処理列 As Integer
   Dim 横軸名 As String
   Dim 縦軸名 As String
   
   
   ThisWorkbook.Worksheets("Sheet1").Activate
   最終行 = Cells(ActiveSheet.Rows.Count, 1).End(xlUp).Row
   
   '学年の区切りを判定しながら、散布図用グラフデータを取得

   学年前 = Range("A2").Value
   カウンタ = 1
   しきい行 = 2
   
   For 処理行 = 2 To 最終行
      学年 = Range("A1").Cells(処理行, 1).Value
      If 学年 <> 学年前 Then
         Set グラフデータ(カウンタ, 1) = _
            Range("C1").Cells(しきい行, 1).Resize(処理行 - しきい行, 1) 'X軸:体重
         Set グラフデータ(カウンタ, 2) = _
            Range("D1").Cells(しきい行, 1).Resize(処理行 - しきい行, 1) 'Y軸:身長
         Set グラフデータ(カウンタ, 3) = _
            Range("A1").Cells(しきい行, 1)                              '系列名
         しきい行 = 処理行
         カウンタ = カウンタ + 1
         学年前 = 学年
      End If
   Next 処理行
   
   横軸名 = Range("C1").Value
   縦軸名 = Range("D1").Value
   
   Set グラフデータ(カウンタ, 1) = _
      Range("C1").Cells(しきい行, 1).Resize(処理行 - しきい行, 1) 'X軸:体重
   Set グラフデータ(カウンタ, 2) = _
      Range("D1").Cells(しきい行, 1).Resize(処理行 - しきい行, 1) 'Y軸:身長
   Set グラフデータ(カウンタ, 3) = _
      Range("A1").Cells(しきい行, 1)                              '系列名

   Set 基本グラフデータ = _
   Union(グラフデータ(1, 1), グラフデータ(1, 2)) '一年生のX軸:体重とY軸:身長を合体
   
   
   'グラフを、F2 セルを左上として、18行の高さ、6列の大きさで描く
   Set グラフ描画エリア = Range("F2").Resize(18, 6)

   ActiveSheet.ChartObjects.Add _
       (Left:=グラフ描画エリア.Left, Top:=グラフ描画エリア.Top, _
       Width:=グラフ描画エリア.Width, Height:=グラフ描画エリア.Height) _
       .Name = "散布図"
        
   With ActiveSheet.ChartObjects("散布図").Chart
      .ChartType = xlXYScatter                                        '散布図
      .SetSourceData Source:=基本グラフデータ _
          , PlotBy:=xlColumns                                         'データは縦方向に並んでいる
      .SeriesCollection(1).Name = グラフデータ(1, 3)                  '系列名:一年生
      .SeriesCollection.NewSeries
      .SeriesCollection(2).XValues = グラフデータ(2, 1)               '二年生のX軸:体重
      .SeriesCollection(2).Values = グラフデータ(2, 2)                '二年生のY軸:身長
      .SeriesCollection(2).Name = グラフデータ(2, 3)                  '系列名:二年生
      .SeriesCollection.NewSeries
      .SeriesCollection(3).XValues = グラフデータ(3, 1)               '三年生のX軸:体重
      .SeriesCollection(3).Values = グラフデータ(3, 2)                '三年生のY軸:身長
      .SeriesCollection(3).Name = グラフデータ(3, 3)                  '系列名:三年生

      .HasTitle = True
      .ChartTitle.Characters.Text = "中学生の身長と体重"              'グラフ名
      .Axes(xlCategory, xlPrimary).HasTitle = True                    '★横軸名を付ける
      .Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = 横軸名 '付けるその横軸名
      .Axes(xlValue, xlPrimary).HasTitle = True                       '★縦軸名を付ける
      .Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = 縦軸名    '付けるその縦軸名

      With .Axes(xlCategory)
          .HasMajorGridlines = True                                   '縦スケール線を入れる
          .HasMinorGridlines = False
          .MinimumScale = 20                                          '横軸の最小値を20にする
      End With

      With .Axes(xlValue)
          .HasMajorGridlines = True                                   '横スケール線を入れる
          .HasMinorGridlines = False
          .MinimumScale = 100                                         '縦軸の最小値を100にする
      End With

      With .SeriesCollection(1)
'         .MarkerStyle = 3
         .MarkerSize = 5                            '1番目のマーカーのサイズを5に小さくする
      End With
      With .SeriesCollection(2)
'         .MarkerStyle = 3
         .MarkerSize = 3                            '2番目のマーカーのサイズを3に小さくする
      End With
      With .SeriesCollection(3)
'         .MarkerStyle = 3
         .MarkerSize = 5                            '3番目のマーカーのサイズを5に小さくする
      End With

   End With
   
   Range("A1").Select

   'オブジェクトをクリアする
   For 処理行 = 1 To 3
      For 処理列 = 1 To 3
         Set グラフデータ(処理行, 処理列) = Nothing
      Next 処理列
   Next 処理行
   
   Set グラフ描画エリア = Nothing
   
End Sub

 解説:
 SeriesCollection コレクション オブジェクト は、指定されたグラフまたはグラフ種類グループにあるすべての Series オブジェクトのコレクションです。
 使い方
 SeriesCollection コレクションを取得するには、SeriesCollection メソッドを使用します。
 次の使用例は、埋め込みグラフ 1 のデータ系列コレクションにある既存のデータ系列にワークシート 1 のセル範囲 C1:C10 のデータを追加します。
Worksheets(1).ChartObjects(1).Chart. _
    SeriesCollection.Extend Worksheets(1).Range("c1:c10")
		

 データ系列を新しく作成し、グラフに追加するには、Add メソッドを使用します。
 次の使用例は、セル範囲 A1:A19 のデータを新しいデータ系列として "Chart1" というグラフ シートに追加します。
Charts("chart1").SeriesCollection.Add _
    source:=Worksheets("sheet1").Range("a1:a19")
		
 単体の Series オブジェクトを取得するには、SeriesCollection(index) メソッドを使用します。
 引数 index には、データ系列の名前またはインデックス番号を指定します。
 次の使用例は、シート 1 にある埋め込みグラフ 1 で、最初のデータ系列の領域の色を設定します。
Worksheets("sheet1").ChartObjects(1).Chart. _
    SeriesCollection(1).Interior.Color = RGB(255, 0, 0)
		

 Series オブジェクト は、グラフのデータ系列を表します。Series オブジェクトは SeriesCollection コレクションのメンバーです。

 使い方
 単体の Series オブジェクトを取得するには、SeriesCollection(index) メソッドを使用します。
 引数 index には、データ系列の名前またはインデックス番号を指定します。
 次の使用例は、シート 1 にある埋め込みグラフ 1 で、最初のデータ系列の領域の色を設定します。
Worksheets("sheet1").ChartObjects(1).Chart. _
    SeriesCollection(1).Interior.Color = RGB(255, 0, 0)
		
 データ系列のインデックス番号は、データ系列がグラフに追加された順序と対応します。SeriesCollection(1) はグラフに最初に追加されたデータ系列で、SeriesCollection(SeriesCollection.Count) は最後に追加されたデータ系列です。

 SeriesCollection オブジェクトの Add メソッド は、SeriesCollection コレクションに 1 つまたは複数の新しいデータ系列を追加します。
 expression.Add(Source, Rowcol, SeriesLabels, CategoryLabels, Replace)
 expression 必ず指定します。対象となる SeriesCollection オブジェクトを返すオブジェクト式を指定します。
 Source 必ず指定します。バリアント型 (Variant) の値を使用します。新しいデータを、セル範囲 (Range オブジェクト) またはデータ要素の配列として指定します。
 Rowcol 省略可能です。XlRowCol 定数を使用します。新しい値が指定範囲の行と列のどちらに入るかを指定します。

使用できる定数は、次に示す XlRowCol クラスの定数のいずれかです。
xlColumns (既定値)
xlRows

 SeriesLabels 省略可能です。バリアント型 (Variant) の値を使用します。引数 Source が配列のときは無視されます。最初の行または列に、データ系列の名前が含まれているときは True を指定します。最初の行または列に、データ系列の最初のデータ要素が含まれているときは False を指定します。この引数を省略すると、最初の行または列の内容によって、データ系列の名前の位置が自動的に判断されます。
 CategoryLabels 省略可能です。バリアント型 (Variant) の値を使用します。引数 Source が配列のときは無視されます。引数 Source の最初の行または列が項目ラベルのときは、True を指定します。最初の行または列がデータ系列の最初のデータ要素のときは、False を指定します。この引数を省略すると、最初の行または列の内容により、項目ラベルの位置が自動的に判断されます。
 Replace 省略可能です。バリアント型 (Variant) の値を使用します。引数 CategoryLabelsTrue を指定したとき、この引数に True を指定すると追加するデータ系列の項目ラベルによって、現在の項目ラベルを置き換えます。この引数に False を指定した場合、既存の項目ラベルを置き換えません。既定値は False です。

 追記
 このメソッドは実際には、オブジェクト ブラウザで示されているように SeriesCollection オブジェクトを返しません。このメソッドは、ピボットグラフ レポートには利用できません。

 NewSeries メソッド は、オブジェクトを返すメソッドです。新しいデータ系列を作成します。新しいデータ系列を表す Series オブジェクトを返します。
 expression.NewSeries()
 expression必ず指定します。対象となる SeriesCollection コレクションを返すオブジェクト式を指定します。
 備考
 ピボットグラフ レポートに対して、このメソッドは使用できません。
 次の使用例は、グラフ 1 に新しいデータ系列を追加します。
Set ns = Charts(1).SeriesCollection.NewSeries
		

この種類の目次に戻る↑ 索引へ↓ トップページに戻る


ヒストグラム(度数分布縦棒グラフ)を作成する

身長の度数分布  上の中学の生徒全員の身長のデータを、ヒストグラムに書いてみます。
 データから、区間(階級)に対して、その区間に属する測定値の出現度数をカウントするために、分析ツールの「ヒストグラム」を使います。
 分析ツールの「ヒストグラム」の拡張子が、Excel 2003 までと、Excel 2007 以降で異なるので、Excel のバージョンを取得して、ツールのファイル名(拡張子)を選択しています。

 このデータとマクロを、ダウンロードできます。→ScatterChartVBA01.xls

Option Explicit

Dim ヒストグラム分析ツール As String
Dim 拡張子 As String

'******************************************************
Sub 縦棒グラフ作成()
'******************************************************
   Dim グラフデータ As Range
   Dim グラフ描画エリア As Range
   Dim 軸データ As Range
   Dim 最終行 As Integer
   
   Call OSのバージョンとExcelのバージョン取得
   
   '前回の処理の度数データが残っていれば、削除
   ThisWorkbook.Worksheets("縦棒グラフ用集計表").Activate
   Range("E1").CurrentRegion.Delete
   Range("A1").Select

   ThisWorkbook.Worksheets("Sheet1").Activate
   最終行 = Cells(ActiveSheet.Rows.Count, 1).End(xlUp).Row
      
   'Excel 2003 と 2007 以降では、分析ツールの拡張子が違う
   Application.Run ヒストグラム分析ツール _
      , ActiveSheet.Range("D1").Resize(最終行, 1) _
      , Worksheets("縦棒グラフ用集計表").Range("D1:D12") _
      , Worksheets("縦棒グラフ用集計表").Range("A1:A11") _
      , False, False, False, True
   'ヒストグラム出力範囲にデータがあります。上書きする場合は [OK] を押してください。
   
   'グラフに移る前に、セルのレンジを変数に格納しておく。
   ThisWorkbook.Worksheets("縦棒グラフ用集計表").Activate
   
   Range("E1").Value = "中学生徒の身長分布" _
   & vbNewLine & "(総人数 " & 最終行 - 1 & " 人)"
   Set グラフデータ = Range("E1:E11")
   Set 軸データ = Range("B2:B11")
   Range("A1").Select

   ThisWorkbook.Worksheets("Sheet1").Activate
   'グラフを、F21 セルを左上として、18行の高さ、6列の大きさで描く。
   Set グラフ描画エリア = Range("F21").Resize(18, 6)

   ActiveSheet.ChartObjects.Add _
       (Left:=グラフ描画エリア.Left, Top:=グラフ描画エリア.Top, _
       Width:=グラフ描画エリア.Width, Height:=グラフ描画エリア.Height) _
       .Name = "棒グラフ"
        
   With ActiveSheet.ChartObjects("棒グラフ").Chart
    .SetSourceData Source:=グラフデータ
    .ChartType = xlColumnClustered
'    .Axes(xlCategory).Select '★Excel 2003 では外す
    .SeriesCollection(1).XValues = 軸データ
    .HasLegend = False

   End With
   
   '★Excel 2003 用コード。☆これは、Excel 2007 でも使える。
   ActiveSheet.ChartObjects("棒グラフ").Activate
    ActiveChart.ChartArea.Select
    With ActiveChart
        .Axes(xlCategory, xlPrimary).HasTitle = True
        .Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "身長(cm)"
        .Axes(xlValue, xlPrimary).HasTitle = True
        .Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = "人"
    End With

    Range("A1").Select
      
End Sub

'******************************************************
Private Sub OSのバージョンとExcelのバージョン取得()
'******************************************************

   Dim OS名 As String
   Dim Excelバージョン As Integer

    OS名 = Application.OperatingSystem
    Excelバージョン = CInt(Application.Version)
            
'            2000 :5.00
'            XP   :5.01
'            Vista:6.00

'            2003 :11.0
'            2007 :12.0
   If Excelバージョン > 11 Then
      拡張子 = ".xlsx"
      ヒストグラム分析ツール = "ATPVBAEN.XLAM!Histogram"
   Else
      拡張子 = ".xls"
      ヒストグラム分析ツール = "ATPVBAEN.XLA!Histogram"
   End If
   
End Sub

アドインの「分析ツール」を有効にする  解説:
 このマクロを動かすためには、前もって、アドインの「分析ツール」にチェックを入れておく必要があります。
 
この種類の目次に戻る↑ 索引へ↓ トップページに戻る


二重のドーナツグラフを作成する

 ドーナツ・グラフは、系列を複数指定すると、多重の同心円にすることができます。

 ドーナツ・グラフは、同一の項目で作ることを前提としているので、系列に別の項目を指定する場合は、工夫が必要になります。
 ここでは、別の系列を使って、2重のドーナツグラフを、VBA で作成します。

 下の例では、内円用と外円用の 2種類の項目名を、A 列に続けて登録しています。そして、データは、B 列と、C列に、ずらして入力しています。
二重ドーナツグラフ
 (別の系列を、同心円で描くと、必ずしも、判読しやすいグラフとはいえなくなりますが、グラフを描くスペースを、有効に使うという点では、意味があります。)

 このデータとマクロを、ダウンロードできます。→doughnutVBA01.xls


Option Explicit
Option Base 1


'******************************************************
Sub ドーナツグラフ作成()
'******************************************************

   Dim 開始日時 As Variant
   Dim 終了日時 As Variant
   Dim 最終行 As Long
   Dim 処理行 As Long
   Dim 学科科目配列(10, 2)        '学科科目,人数
   Dim 都道府県配列(500, 3)       '都道府県,空白,人数
   Dim 都道府県数 As Integer
   Dim 学科科目数 As Integer
   Dim 都道府県名 As String
   Dim 学科科目名 As String
   Dim ドーナツグラフデータ As Range
   Dim グラフ描画エリア As Range
   Dim その他都道府県人数 As Integer
   Dim 検索都道府県 As Integer

   開始日時 = Now                ' 開始時刻を変数に格納します。
   
'   ' 処理を高速化するため、画面描画停止、自動計算停止
'    Application.ScreenUpdating = False
'    Application.Calculation = xlCalculationManual

   ThisWorkbook.Worksheets("抽出項目データ").Activate
   
   '人数を集計する前処理として、好きな科目、出身地別に並び替え

   Range("A1").CurrentRegion.Sort _
      Key1:=Range("A2"), Order1:=xlAscending, _
      Key2:=Range("B2"), Order2:=xlAscending, _
      Header:=xlYes

   '抽出項目データから、グラフ用に、科目、都道府県単位に人数をカウント
   
   最終行 = Cells(ActiveSheet.Rows.Count, 1).End(xlUp).Row
   
   学科科目数 = 1
   学科科目配列(学科科目数, 1) = Range("A2").Value             '学科科目の一つ目
   都道府県数 = 1
   都道府県配列(都道府県数, 1) = Range("B2").Value             '都道府県の一つ目
   
   For 処理行 = 2 To 最終行
   
      学科科目名 = Range("A1").Cells(処理行, 1).Value
      都道府県名 = Range("B1").Cells(処理行, 1).Value
      
      '学科は、第一キーでソートされているので、重複して出現しない
      If 学科科目名 = 学科科目配列(学科科目数, 1) Then
         学科科目配列(学科科目数, 2) = 学科科目配列(学科科目数, 2) + 1
      Else '新出の学科科目名
         学科科目数 = 学科科目数 + 1
         学科科目配列(学科科目数, 1) = 学科科目名
         学科科目配列(学科科目数, 2) = 学科科目配列(学科科目数, 2) + 1
      End If
      
      '都道府県は、ソートの第一キーではないので、重複出現が有りうる
      For 検索都道府県 = 1 To 都道府県数
         If 都道府県名 = 都道府県配列(検索都道府県, 1) Then
            '既出都道府県
            都道府県配列(検索都道府県, 3) = 都道府県配列(検索都道府県, 3) + 1
            GoTo 次の行へ
         End If
      Next 検索都道府県
      '新出の都道府県
      都道府県数 = 都道府県数 + 1
      都道府県配列(都道府県数, 1) = 都道府県名
      都道府県配列(都道府県数, 3) = 都道府県配列(都道府県数, 3) + 1
次の行へ:
   Next 処理行
   
   
   '集計結果の人数を、"ドーナツグラフと集計表"のシートに、貼り付け
   ThisWorkbook.Worksheets("ドーナツグラフと集計表").Activate
   
   Range("A2").Resize(学科科目数, 2).Value = 学科科目配列
   
   Range("A2").Cells(学科科目数 + 1, 1).Resize(都道府県数, 3).Value = 都道府県配列
   
   
   '学科科目別人数を、人数の多いものから少ないものに降順にソート
   Range("A2").Resize(学科科目数, 2).Sort _
      Key1:=Range("B2"), Order1:=xlDescending, _
      Header:=xlNo
      
   '都道府県別人数を、人数の多いものから少ないものに降順にソート
   Range("A2").Cells(学科科目数 + 1, 1).Resize(都道府県数, 3).Sort _
      Key1:=Range("C2").Cells(学科科目数 + 1, 1), Order1:=xlDescending, _
      Header:=xlNo

   '都道府県数が、11以上の場合は、10位以下を、「その他都道府県」 としてまとめる
   その他都道府県人数 = 0

   If 都道府県数 >= 11 Then
      For 処理行 = 1 + 学科科目数 + 10 To 1 + 学科科目数 + 都道府県数
         その他都道府県人数 = その他都道府県人数 + Range("C1").Cells(処理行, 1).Value
      Next 処理行

      For 処理行 = 1 + 学科科目数 + 10 To 1 + 学科科目数 + 都道府県数
             Rows(1 + 学科科目数 + 10).Delete Shift:=xlUp
      Next 処理行
'Stop
      Range("A1").Cells(1 + 学科科目数 + 10, 1).Value = "その他"
      Range("C1").Cells(1 + 学科科目数 + 10, 1).Value = その他都道府県人数
      都道府県数 = 10
   End If

   Range("A1").Select
   
   'ワークシートを参照するため、グラフに移る前に、セルのレンジを変数に格納しておく。

   Set ドーナツグラフデータ _
   = Range("A1").Resize(学科科目数 + 都道府県数 + 1, 3)
   
   
   'グラフを、E1 のセルを左上として、20行の高さ、10列の大きさで描く。
   Set グラフ描画エリア = Range("E1").Resize(20, 7)

   ActiveSheet.ChartObjects.Add _
       Left:=グラフ描画エリア.Left, Top:=グラフ描画エリア.Top, _
       Width:=グラフ描画エリア.Width, Height:=グラフ描画エリア.Height
   
   '二重ドーナツグラフを描きます。
   With ActiveSheet.ChartObjects(1).Chart
       .ChartType = xlDoughnut
       .SetSourceData _
            Source:=ドーナツグラフデータ, _
            PlotBy:=xlColumns
   '    .Location Where:=xlLocationAsObject, Name:="ドーナツグラフ用集計表"
   End With
   
   'グラフタイトルを表示します。
   ActiveSheet.ChartObjects(1).Activate
   With ActiveSheet.ChartObjects(1).Chart
      .HasTitle = True
      .ChartTitle.Characters.Text = "人数 (総人数 " & 最終行 - 1 & " 人)"
   End With
   
   'ドーナツの穴の大きさを、最小の 10% にちぢめます。
   ActiveSheet.ChartObjects(1).Chart.SeriesCollection(1).Select
    With ActiveChart.ChartGroups(1)
        .VaryByCategories = True
        .FirstSliceAngle = 0
        .DoughnutHoleSize = 10
    End With
    
   'データラベルで、項目名と、数値と、パーセント を表示させます。
   With ActiveSheet.ChartObjects(1).Chart
      .SeriesCollection(1).ApplyDataLabels _
      AutoText:=True, _
      LegendKey:=False, _
      ShowSeriesName:=False, _
      ShowCategoryName:=True, _
      ShowValue:=True, _
      ShowPercentage:=True, _
      ShowBubbleSize:=False
       
      .SeriesCollection(2).ApplyDataLabels _
      AutoText:=True, _
      LegendKey:=False, _
      ShowSeriesName:=False, _
      ShowCategoryName:=True, _
      ShowValue:=True, _
      ShowPercentage:=True, _
      ShowBubbleSize:=False
   End With


   'オブジェクトをクリア

   Set ドーナツグラフデータ = Nothing
   Set グラフ描画エリア = Nothing
   
   Range("A1").Select
   
   ' 画面描画再開、自動計算停止解除
   Application.ScreenUpdating = True
   Application.Calculation = xlCalculationAutomatic

   終了日時 = Now
   MsgBox "処理時間は、" _
   & Format(終了日時 - 開始日時, "hh時間nn分ss秒") & " でした。"

End Sub

 解説:
 ChartGroups メソッド は、オブジェクトを返すメソッドです。単一のグラフ種類グループ (ChartGroup オブジェクト)、またはグラフ種類グループのコレクション (ChartGroups コレクション) を返します。コレクションの中には、すべてのグループの種類が含まれます。
 expression.ChartGroups(Index)
 expression   必ず指定します。Chart オブジェクトを返すオブジェクト式を指定します。
 Index   省略可能です。バリアント型 (Variant) の値を使用します。グラフ種類グループのインデックス番号を指定します。

 次の使用例は、グラフ 1 のグラフ種類グループ 1 の陽線と陰線を表示し、それぞれの色を設定します。この使用例は、2-D 折れ線グラフに対して実行してください。グラフは 2 つのデータ系列を含み、各系列の折れ線が 1 つ以上のデータ要素で交差するようにしておく必要があります。
With Charts("Chart1").ChartGroups(1)
    .HasUpDownBars = True
    .DownBars.Interior.ColorIndex = 3
    .UpBars.Interior.ColorIndex = 5
End With


この種類の目次に戻る↑ 索引へ↓ トップページに戻る



ホームページのトップに戻る