グラフの名前を設定/取得する


名前は2つある

グラフの名前はNameプロパティです。次のマクロは、アクティブシートのグラフに新しい名前を設定しています。

Sub Sample()
    With ActiveSheet.ChartObjects(1)
        .Name = "俺のグラフ1"
        MsgBox .Name & vbCrLf & _
               .Chart.Name
    End With
End Sub

ワークシート上の埋め込みグラフは、おおむね次のようなオブジェクト構造になっています。

グラフの本体はChartオブジェクトで、グラフを描画する枠のようなものがChartObjectオブジェクトです。埋め込みグラフを削除したり移動したりするときは、ChartObjectオブジェクトの方を操作してやります。また、系列やタイトルやデータラベルなどグラフのパーツを操作するためにChartオブジェクトを特定する場合も「ChartObject(1).Chart」のようにChartObjectオブジェクトから降りてやります。

なので、グラフの名前を設定したり取得したりするときは、ChartObjectオブジェクトのNameプロパティが重要になってきます。上記マクロで試したように、ChartオブジェクトにもNameプロパティがありますが、Chartオブジェクトの名前を管理しなければならないのは、希なケースといえるでしょう。

ちなみに、ChartオブジェクトのNameプロパティは値の取得のみ可能です。設定することはできません。設定しようとすると、下記のようなエラーになります。

Sub Sample()
    With ActiveSheet.ChartObjects(1)
        .Name = "俺のグラフ1"
        .Chart.Name = "私のグラフ1"
        MsgBox .Name & vbCrLf & _
               .Chart.Name
    End With
End Sub

なぜ「メモリが不足しています」エラーになるんだろう?読み取り専用プロパティに値を設定しようとしたのだから、実行時エラー387の「プロパティは値を設定できません」っていうエラーだったら分かりやすいのに。

Excel 2003のコードは動くか

Excel 2003で、グラフの名前を設定したり取得するときも、下記のマクロを使います。

Sub Sample()
    With ActiveSheet.ChartObjects(1)
        .Name = "俺のグラフ1"
        MsgBox .Name & vbCrLf & _
               .Chart.Name
    End With
End Sub

ちなみに、実行すると次のようになります。

細かいところですが、ここもExcel 2003とExcel 2007で変わっていますね。Chartオブジェクトの名前(Name)は、Excel 2003では「ブック名 グラフ名」なのに対して、Excel 2007では「シート名 グラフ名」に変わっています。まぁ、前述したように、Chartオブジェクトの名前をどうとかすることは希でしょうから、大きな問題ではないでしょう。ついでに、Excel 2003でも、読み取り専用のChart.Nameプロパティに値を設定してみましょう。エラーになるはずです。

こっちは1004ですか。どっちにしても、分かりにくいですね。

【Excel 2007での実行結果】

なんか、検証の方法が逆になってしまいましたが、ChartObjectオブジェクトのNameプロパティに関して、互換性は大丈夫のようです。