[ VBA ] ChartObjectオブジェクトというイケてない名前のオブジェクトについて

ExcleのVBAでグラフをいじろうかなとしますよね。ヘルプを見ると、Chartオブジェクトというのがあるので、これを使うと思うじゃないですか。このChartオブジェクトを集めた、Chartsコレクションを使うのかな、と。しかしですね

Charts(1).Activate

と書いても、シート上にあるグラフは選択されないんですよね。というか、「インデックスが有効範囲にありません」というエラーが出てしまうことがあります。

そこで、ヘルプをよくよく見てみると、次のように書かれているんですよね。

ChartObject オブジェクトに含まれている埋め込みグラフか、独立したグラフ シートのどちらかのグラフです。 Chart オブジェクトを取得するプロパティおよびメソッドを次に示します。 Charts メソッド ActiveChart プロパティ ActiveSheet プロパティ Chart オブジェクト (Excel)

これはどういうことかというと、Excelにはグラフは2種類あって、シート上のグラフは「Charts」ではとれないということです。

Excelには、グラフは2種類あるんですね。1つは、シート上にあるグラフです。データのある範囲を選んで、「挿入」タブ内にある「グラフ」のメニューを選んで作成するタイプのものですね。これを「埋め込みグラフ」と呼びます。もう1つは、シート全体に表示されるタイプのグラフです。データ範囲を選んで、「F11」キーを押せば作成されます。もしくは、埋め込みグラフを作成した後、そのグラフを選んだ状態で「グラフツール⇒グラフの移動」を選び、「新しいシート」を選んで作成することもできます。これを「グラフシート」と呼びます。

Excelには、このように「埋め込みグラフ」と「グラフシート」の2種類のグラフがあります。そして、上にように「Charts(1)」と書いた場合は、グラフシートしか呼び出せません。なので、グラフシートがない場合には、「インデックスが有効範囲にありません」というエラーが出てしまうんですね。

じゃあ、埋め込みグラフを扱いたい場合にはどうしたらいいか、という話になるのですが、そこで出てくるのがChartObjectオブジェクトというイケてない名前のオブジェクトです。ここに、ワークシートの埋め込みグラフの情報が入っています。例えば、現在のシートの埋め込みグラフのスタイルを設定するには、次のようにします。

ActiveSheet.ChartObjects(1).Chart.ChartStyle = 1

「ChartObjects(1)」で1つ目の埋め込みグラフを取得しています。次の「Chart」でグラフそのものを取得しています。

「ChartObject」は、例えばそのグラフがシートのどの位置にあるか、高さはいくらか、などというような、「シートにおけるグラフ」に注目しています。一方、「Chart」は、グラフの軸やデータ、デザインなど、「グラフそのもの」に注目しているという違いがあります。なお、グラフシートでは、「シートの中でのグラフ」なんてものは必要ない(グラフはシート全体に表示されているから)ので、ChartObjectなんてものは不要ということなんでしょうね。

うーん、でもちょっとこの名前はわかりづらいような。。。

前の記事:
[ VBA ] グループ化してない範囲でUngroupすると出ちゃうエラーの回避法
次の記事:
Homesteadを使って、windows7でLaravel5.1の仮想環境を構築