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.Paste
ChartObject.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では、コピー対象を一度アクティブにする・貼り付け先を明示的に選択するといった手順を踏むことで、多くの安定性問題を回避できます。