VBAでグラフをコピーしようとした際に突然現れるエラー、
「実行時エラー -2147221040 (800401d0):Copy メソッドに失敗しました」。
このエラーは一見分かりづらく、VBA初心者にとっては対処が難しい内容です。
本記事ではこのエラーについて、
- エラーの意味
- よくある原因
- 実践的な解決方法
を順を追ってご説明いたします。
エラーの意味:「Copy メソッドに失敗しました」とは?
このエラーは、VBAで ChartObject.Copy を実行しようとした際、Excelがグラフのコピー操作に失敗したことを示しています。
内部的には「ActiveWindow(アクティブウィンドウ)」が存在しない、または「アクティブシート」が適切に指定されていない状態で .Copy を使おうとした場合などに発生します。
主な原因
| 原因 | 詳細説明 | 
|---|---|
| 対象シートが非アクティブ状態 | グラフが存在するシートがアクティブでないと、 .Copyが失敗することがあります | 
| グラフが既に選択済みでない | Excelはグラフがアクティブ(選択状態)でないと、コピー操作を正しく処理できない場合があります | 
| Excelウィンドウが最小化または非表示 | .Copyは表示状態のウィンドウに依存するため、Excelが非アクティブ状態だと動作しないことがあります | 
| グラフが ChartObject ではなく Chart シートにある | ChartObjectは埋め込みグラフに限定され、グラフシート(独立グラフ)は対象外です | 
解決方法
方法①:グラフのあるシートをアクティブにしてからコピー
srcChartObj.Parent.Activate  ' グラフの親シートをアクティブにする
srcChartObj.Copyシートを明示的にアクティブにすることで、Excelが .Copy を正しく処理できるようになります。
方法②:Paste ではなく PasteSpecial を使う(安定性の確保)
Worksheets("出力").Activate
Worksheets("出力").Range("B16").Select
ActiveSheet.PasteChartObject.Copy のあとにアクティブな貼り付け先で Paste を呼ぶ形にすることで、貼り付け処理の安定性が向上します。
方法③:グラフを画像ではなくオブジェクトとして複製する場合は Chart オブジェクトを正しく保持
Dim newChart As ChartObject
Set newChart = Worksheets("出力").ChartObjects.Add(Left:=100, Top:=100, Width:=400, Height:=300)
newChart.Chart = srcChartObj.Chart.Chart を介してグラフ内容をコピーする方法もあります。これにより .Copy を使わず安定した複製が可能です。
まとめ
「実行時エラー -2147221040」は、グラフが属するシートのアクティブ状態や表示状態に大きく依存するという点が最大のポイントです。
VBAでは、コピー対象を一度アクティブにする・貼り付け先を明示的に選択するといった手順を踏むことで、多くの安定性問題を回避できます。

 
			 
			 
			 
			 
			 
			 
			