VBAから見るEXCELのグラフのデータ系列

 EXCEL のグラフの階層構造は複雑である.中でもデータ系列は基本でありながらおろそかにされがちである.今回は VBA の視点からグラフのデータ系列を見てみたい.

オブジェクトブラウザーは EXCEL VBA の羅針盤

 EXCEL の通常操作画面(ユーザーインターフェース)からは想像もつかないが,EXCEL にはプログラミング言語という「裏の顔」がある.普段操作している EXCEL の要素はほぼ全てオブジェクトとして定義されており,複雑な階層構造をなしている.オブジェクトブラウザーはその羅針盤となる.

 Alt キーと F11 キーを同時に押すと VBE という開発環境が起動する.さらに F2 キーを押すとオブジェクトブラウザーが開く.

オブジェクトブラウザーを開いたところ
オブジェクトブラウザーを開いたところ

データ系列 = Series オブジェクト

 最初に答えを書いておくと,グラフのデータ系列は VBA の Series オブジェクトにあたる.

 検索ウィンドウに series とタイプ入力してリターンすると,上段にずらずらと検索結果が並ぶ.

オブジェクトブラウザーでseriesを検索したところ
オブジェクトブラウザーでseriesを検索したところ

 ウィンドウを最大化する.中程のクラス Series をクリックすると下段左側のペインに該当クラスが選択された状態になるので,そこをクリックすると,メンバーが下段右側に表示される.

オブジェクトブラウザーの検索結果の上段
オブジェクトブラウザーの検索結果の上段

 11 個のメソッドと 51 個のプロパティが表示されている.

オブジェクトブラウザーの検索結果の下段
オブジェクトブラウザーの検索結果の下段

必要なプロパティとメソッドは四つだけ

 この数だけで圧倒されそうになるが,実際に必要なものは少ない.というか,四つだけである.すなわち三つのプロパティ (.Name, .Values, .XValues), 一つのメソッド (.Points) である.

 メソッドとかプロパティとか分からないと思うが,今はそういうものだと思って流してほしい.

 .Name は系列名, .Values は Y の値の集合, .XValues は X の値の集合を指す.

点 = Point オブジェクト

 Point オブジェクトとはグラフ上に描かれた一個一個の点のことである.プロパティは 28 個,メソッドは 9 個あるが,重要なプロパティは .MarkerStyle, .MarkerSize, .MarkerBackgroundColor, .MarkerForegroundColor あたりであろうか.

PointオブジェクトのMarkerStyleプロパティ
PointオブジェクトのMarkerStyleプロパティ

 系列ひと塊の点の集合は Points コレクションで表現するが,こちらは 4 個のプロパティと 1 個のメソッドがあるに過ぎず,主に Item メソッド経由で 1 個の Point オブジェクトを特定する目的で使われる.

PointsオブジェクトのItemメソッドで唯一のPointオブジェクトを特定する
PointsオブジェクトのItemメソッドで唯一のPointオブジェクトを特定する

.Item メソッド = コレクション

 あまり VBA 関連のサイトに書かれていないことであるが,メンバーに .Item メソッドを持つオブジェクトはコレクションであり,オブジェクト名が複数形になっている.たいてい .Count プロパティもセットでついており,コレクション最後のオブジェクトを次のような形で特定できる.

With Objects
    .Item(.Count).Select
End with

 コレクションとは同種のオブジェクトの集合のことである.Charts, ChartObjects, FullSeriesCollection, SeriesCollection, ListObjects, Points あたりが散布図に関連するコレクションである.

FullSeriesCollection は Series のコレクション

 ついでに FullSeriesCollection にも触れておく.散布図のマクロ記録によると,データ系列のオブジェクトは FullSeriesCollection で取得される.これはコレクションであり,一つの系列は .Item メソッドにより特定できる.

散布図のデータ系列はFullSeriesCollectionで取得できるコレクションである
散布図のデータ系列はFullSeriesCollectionで取得できるコレクションである

 FullSeriesCollection の親オブジェクトは Chart オブジェクトである.

FullSeriesCollectionの親オブジェクトはChartオブジェクトである
FullSeriesCollectionの親オブジェクトはChartオブジェクトである

SeriesCollection も Series のコレクション

 SeriesCollection もまた散布図のデータ系列のコレクションである.一つの系列は .Item メソッドにより特定できる.

SeriesCollectionはSeriesオブジェクトのコレクションであり .Itemメソッドにより特定できる
SeriesCollectionはSeriesオブジェクトのコレクションであり .Itemメソッドにより特定できる

 SeiresCollection の親オブジェクトは Chart オブジェクトである.

SeriesCollectionの親オブジェクトはChartオブジェクトである
SeriesCollectionの親オブジェクトはChartオブジェクトである

 もう少し突っ込んでおくと,.Item メソッドの引数(カッコ内の数字)はインデックスであり,1 から順番に加算していってループを作ることができる.次のテストコードではイミディエイトウィンドウにデータ系列の名前を順に出力する.

With Worksheets(1).ChartObjects(1).Chart
    For i = 1 to .SeriesCollection.Item(.Count)
        Debug.Print .SeriesCollection.Item(i).Name
    Next i
End with

FullSeriesCollection と SeriesCollection, どう使い分ける?

 公式には FullSeriesCollection は「グラフの Seires オブジェクトの完全なセット」とのことで,「フィルターで除外した Series オブジェクトを取得したり再除外したりできる」そうである.

 SeriesCollection は「指定されたグラフまたはグラフ種類グループにあるすべての Series オブジェクトのコレクション」だそうである.

 どうにもよく分からないが,フィルターに関連したデータを扱う必要がある場合は FullSeriesCollection にしておいた方が無難であろう.

データ系列を増やしていくなら SeriesCollection 一択

 その後の実験で,VBA でデータ系列を動的に追加していく際には SeriesCollection がふさわしいと思われた..NewSeries メソッドを使う.

VBAのループでデータ系列を増やしたい場合にはSeriesCollection.NewSeriesを使う
VBAのループでデータ系列を増やしたい場合にはSeriesCollection.NewSeriesを使う

 多数のデータ系列をループ内で増やしたい場合がそれに当たる.サンプルコードを載せておこう.

Sub myDateSeries()

Dim myXValue()  As Double
Dim myValue()   As Long
Dim myName      As String
Dim myCht       As Chart
Dim mySeries    As Series
Dim mySht       As Worksheet

Set mySht = ActiveSheet
Set myCht = mySht.ChartObjects(1).Chart

ReDim myXValue(2)
ReDim myValue(2)

myXValue(0) = 0.2
myXValue(1) = 0.5
myXValue(2) = 0.7
myValue(0) = 3
myValue(1) = 5
myValue(2) = 7

Set mySeries = myCht.SeriesCollection.NewSeries

With mySeries
    .Name = "SERIES1"
    .XValues = myXValue
    .Values = myValue
End With

End Sub

“VBAから見るEXCELのグラフのデータ系列” への2件の返信

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください