ワークシート上の埋め込みグラフを削除するのは、それほど難しくありません。たとえば、下図の「グラフ 1」を削除するのなら、
Sub Sample() ActiveSheet.ChartObjects("グラフ 1").Delete End Sub
だけでいいです。もし、ワークシート上に複数の埋め込みグラフがあって、それらをすべて削除するのでしたら
Sub Sample() Dim i As Long With ActiveSheet For i = .ChartObjects.Count To 1 Step -1 .ChartObjects(i).Delete Next i End With End Sub
みたいにすれば、いいでしょう。マクロ記録をするまでもありませんね。ありませんけど、念のためにExcel 2010でマクロ記録してみましょう。「グラフ 1」を選択してから、Deleteキーを押して削除しました。
Sub Macro() ActiveSheet.ChartObjects("グラフ 1").Activate ActiveChart.Parent.Delete End Sub
グラフ(ChartObject)を選択(Activate)して削除(Delete)と、ありきたりなコードですが・・・ん?Parentって?何で親オブジェクトを削除してんの?埋め込みグラフ「グラフ 1」の親オブジェクト(Parent)って、ワークシートですよね。アクティブシートを削除しちゃマズイでしょ。確認のため、次のようにコードを変更してから、この記録されたコードを実行してみます。
Sub Macro() Dim msg As String ActiveSheet.ChartObjects("グラフ 1").Activate msg = msg & "Selection:" & vbCrLf msg = msg & TypeName(Selection) & "(" & Selection.Name & ")" & vbCrLf & vbCrLf msg = msg & "Selection.Parent:" & vbCrLf msg = msg & TypeName(Selection.Parent) & "(" & Selection.Parent.Name & ")" & vbCrLf & vbCrLf msg = msg & "ActiveChart:" & vbCrLf msg = msg & TypeName(ActiveChart) & "(" & ActiveChart.Name & ")" & vbCrLf & vbCrLf msg = msg & "ActiveChart.Parent:" & vbCrLf msg = msg & TypeName(ActiveChart.Parent) & "(" & ActiveChart.Parent.Name & ")" MsgBox msg ActiveChart.Parent.Delete End Sub
ああ、なるほど。削除されるのは、Selection.Parentではなく、ActiveChart.Parentですか。
ワークシート上の埋め込みグラフは、おおむね次のようなオブジェクト構成になっています。
グラフ本体はChartオブジェクトです。系列とか軸とか凡例とかタイトルとか、グラフを構成するパーツはChartオブジェクトで操作します。そのChartオブジェクトのコンテナがChartObjectオブジェクトです。いわば、埋め込みグラフの枠みたいなもんです。ChartObjectオブジェクト自体には、大したメソッドやプロパティは用意されていません。でも、グラフ本体にアクセスするには、ChartObjectオブジェクトから指定します。もうひとつ、ChartObjectオブジェクトの中にはShapeRangeオブジェクトがあります。こいつは、いわば描画領域で、塗りつぶしなどの設定を行えます。
さて、話を「グラフの削除」に戻しましょう。冒頭でお見せしたコード
Sub Sample() ActiveSheet.ChartObjects("グラフ 1").Delete End Sub
は、埋め込みグラフの枠を削除しています。枠が削除されれば、当然ながらその中のグラフ本体(Chartオブジェクト)も削除されます。では、マクロ記録されたコードは、どういう意味なのでしょう。
したがって、次のようにParentがないと、Chartオブジェクトそのものを削除することになってエラーです。埋め込みグラフの削除は、あくまで枠(ChartObjectオブジェクト)をDeleteしなければいけません。
Sub Macro() ActiveSheet.ChartObjects("グラフ 1").Activate ActiveChart.Delete ''エラー End Sub
あるいは、次のように、選択されているChartObjectオブジェクトを削除してもいいですね。
Sub Macro() ActiveSheet.ChartObjects("グラフ 1").Activate Selection.Delete End Sub
これなら、うまくいきます。マクロ記録は、Selectionを操作するのが大好きなのですから、埋め込みグラフの削除も、このように記録されれば悩まずに済むのに。
では、Excel 2003ではどうでしょう。同じように「グラフ 1」を選択して削除する操作をマクロ記録してみます。
Sub Macro() ActiveSheet.ChartObjects("グラフ 1").Activate ActiveChart.ChartArea.Select ActiveWindow.Visible = False Selection.Delete End Sub
Deleteメソッドを実行する前に、3行の命令が実行されています。先と同じように、各行が実行されたとき、何が選択されているのかを調べてみましょう。
Sub Macro() ActiveSheet.ChartObjects("グラフ 1").Activate ''Selection → ChartArea(グラフ) ''ActiveChart → Chart(Sheet1 グラフ 1) ActiveChart.ChartArea.Select ''Selection → ChartArea(グラフ) ''ActiveChart → Chart(Sheet1 グラフ 1) ActiveWindow.Visible = False ''Selection → ChartObject(Chart1) ''ActiveChart → Chart(Sheet1 グラフ 1) Selection.Delete End Sub
まったく違いますね。ぜんぜん違ってます。すっげぇ違いです。こいつは驚いた。
Excel 2007では
ActiveSheet.ChartObjects("グラフ 1").Activate Selection.Delete ''正常終了
1行目の「ActiveSheet.ChartObjects("グラフ 1").Activate」でChartObjectオブジェクトが選択されますので、続いて「Selection.Delete」すれば埋め込みグラフが削除できます。対して、Excel 2003では
ActiveSheet.ChartObjects("グラフ 1").Activate Selection.Delete ''エラー
1行目の「ActiveSheet.ChartObjects("グラフ 1").Activate」で選択されるのはChartAreaです。ChartObjectオブジェクトではありませんので、続けて「Selection.Delete」するとエラーです。
何かというとSelectionを多用するビギナーにとって、この細かい変更は、きっと頭を悩ませるでしょうね。
Excel 2003でマクロ記録した次のコードを、Excel 2007で実行してみます。
Sub Macro() ActiveSheet.ChartObjects("グラフ 1").Activate ActiveChart.ChartArea.Select ActiveWindow.Visible = False Selection.Delete End Sub
【Excel 2007での実行結果】
最後の行でエラーです。おそらく、Selectionが違うのでしょうね。先と同じように調べてみると、Excel 2007では次のようになることがわかりました。
Sub Macro() ActiveSheet.ChartObjects("グラフ 1").Activate ''Selection → ChartObject(Chart 1) ActiveChart.ChartArea.Select ''Selection → ChartArea(グラフ) ActiveWindow.Visible = False ''Selection → ChartArea(グラフ) Selection.Delete End Sub
まとめると・・・
ということですね。いずれにしても、埋め込みグラフを削除するのなら、Excel 2003だろうがExcel 2007だろうが
Sub Sample() ActiveSheet.ChartObjects("グラフ 1").Delete End Sub
これで、OKってことです。