Excel VBA グラフ操作
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 で場所をずらせながら、Union、Range、Cells、Resize の4つを組み合わせて、複数のセル範囲を取得します。
Resize を使うには、ワークシートのウインドウがアクティブになっている必要があります。このため、アクティブなウインドウがグラフシートに移る前に (ChartObjects を追加する前に)、変数に Range を格納します。
グラフを、ワークシートの指定位置に配置するには、ChartObjects の Add メソッドを使います。
そして、ChartObjects(index) メソッドを使って、単体の ChartObject オブジェクトを取得して、グラフを描画します。
注:ChartObjects の Add メソッド を使うと、自動で順に index が付けられます。index だと、後から指定するときに不便です。そのため、名前を付けると良いでしょう。
このマクロの事例をダウンロードできます。→MultipleGraphsVBA01.xls
解説:
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 のデータを折れ線グラフとして追加します。
単体の ChartObject オブジェクトを取得するには、ChartObjects(index) メソッドを使用します。
引数 index には、埋め込みグラフのインデックス番号または名前を指定します。
次の使用例は、シート 1 の埋め込みグラフ 1 のグラフ エリアにパターンを設定します。
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 グラフの名前またはインデックス番号を指定します。配列を使うと、複数のグラフを指定できます。
グラフを数えて、自動で追い番を付けることもできます。
ChartObjects メソッドは、Charts プロパティとは異なった動作をします。
ChartObjects メソッドが埋め込みグラフを返すのに対して、Charts プロパティはグラフ シートを返します。埋め込みグラフ (Chart オブジェクト) を取得するには、Chart プロパティを使います。
次の例は、シート 1 の埋め込みグラフ 1 にタイトルを追加します。
次の例は、シート 1 の埋め込みグラフ 1 に新しいデータ系列を追加します。新しいデータ系列の基になるデータとしてシート 1 のセル範囲 B1:B10 を指定しています。
次の例は、シート 1 の埋め込みグラフ 1 の書式を削除します。
解説:
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 のフォントを設定します。
PlotArea プロパティは、グラフのプロット エリア (PlotArea オブジェクト) を返します。値の取得のみ可能です。
2軸グラフを作成する
Excel で、2軸グラフを書く方法は、こちらに書きました。
ここでは、マクロで2軸グラフを書くためのコードを紹介します。
このコードは、アプリケーションとしてのVBA の、
2軸のグラフをデータ系列毎に分けてグラフを作成する
http://www.k1simplify.com/vba/tipsleaf/graph05.html
を参考にさせていただきました。
| A | B | C | D |
1 | 品目 | 価格 | 数量 | 金額 |
2 | Aランチ | 1,200 | 50 | 60,000 |
3 | Bランチ | 1,000 | 60 | 60,000 |
4 | Cランチ | 800 | 120 | 96,000 |
5 | お子様 | 600 | 40 | 24,000 |
| |
解説:
Axis オブジェクトは、グラフの 1 つの軸を表します。Axis オブジェクトは、Axes コレクションのメンバーです。
ちなみに、axis とは、軸のことで、複数形が axes になります。
単体の Axis オブジェクトを取得するには、Axes(type, group) メソッドを使用します。
引数 type には、軸の種類を指定します。引数 group には、軸のグループを指定します。引数 type に使用できる定数は、XlAxisType クラスの xlCategory、xlSeries、xlValue のいずれかです。引数 group に使用できる定数は、XlAxisGroup クラスの xlPrimary または xlSecondary です。
次の例は、グラフ 1 というグラフ シートの項目軸ラベルの文字列を設定します。
Axes メソッド は、オブジェクトを返すメソッドです。単一の軸、またはグラフのすべての軸を返します。
expression.Axes(
Type,
AxisGroup)
expression 必ず指定します。
Chart オブジェクトを返すオブジェクト式を指定します。
Type 省略可能です。バリアント型 (
Variant) の値を使用します。軸の種類を指定します。使用できる定数は、
XlAxisType クラスの
xlValue、
xlCategory、
xlSeriesAxis のいずれかです。
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
解説:
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) の値を使用します。引数 CategoryLabels に True を指定したとき、この引数に True を指定すると追加するデータ系列の項目ラベルによって、現在の項目ラベルを置き換えます。この引数に False を指定した場合、既存の項目ラベルを置き換えません。既定値は False です。
追記
このメソッドは実際には、オブジェクト ブラウザで示されているように SeriesCollection オブジェクトを返しません。このメソッドは、ピボットグラフ レポートには利用できません。
NewSeries メソッド は、オブジェクトを返すメソッドです。新しいデータ系列を作成します。新しいデータ系列を表す Series オブジェクトを返します。
expression.NewSeries()
expression必ず指定します。対象となる SeriesCollection コレクションを返すオブジェクト式を指定します。
備考
ピボットグラフ レポートに対して、このメソッドは使用できません。
次の使用例は、グラフ 1 に新しいデータ系列を追加します。
Set ns = Charts(1).SeriesCollection.NewSeries
ヒストグラム(度数分布縦棒グラフ)を作成する
上の中学の生徒全員の身長のデータを、ヒストグラムに書いてみます。
データから、区間(階級)に対して、その区間に属する測定値の出現度数をカウントするために、分析ツールの「ヒストグラム」を使います。
分析ツールの「ヒストグラム」の拡張子が、Excel 2003 までと、Excel 2007 以降で異なるので、Excel のバージョンを取得して、ツールのファイル名(拡張子)を選択しています。
このデータとマクロを、ダウンロードできます。→ScatterChartVBA01.xls
解説:
このマクロを動かすためには、前もって、アドインの「分析ツール」にチェックを入れておく必要があります。
二重のドーナツグラフを作成する
ドーナツ・グラフは、系列を複数指定すると、多重の同心円にすることができます。
ドーナツ・グラフは、同一の項目で作ることを前提としているので、系列に別の項目を指定する場合は、工夫が必要になります。
ここでは、別の系列を使って、2重のドーナツグラフを、VBA で作成します。
下の例では、内円用と外円用の 2種類の項目名を、A 列に続けて登録しています。そして、データは、B 列と、C列に、ずらして入力しています。
(別の系列を、同心円で描くと、必ずしも、判読しやすいグラフとはいえなくなりますが、グラフを描くスペースを、有効に使うという点では、意味があります。)
このデータとマクロを、ダウンロードできます。→doughnutVBA01.xls
解説:
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