【VBAエラー解説】ChartObject.Copy に失敗?「エラー -2147221040 (800401d0)」の原因と対策

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

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次